Ich versuche derzeit, 3 Anwendungen aus einem Repository in 3 zu unterteilen, behalte jedoch die URL-Struktur bei, sodass grundsätzlich verschiedene Speicherorte unter derselben Domain von verschiedenen Anwendungen bereitgestellt werden müssen.
Ich habe Probleme damit, dass eine der Apps der Fallback für nicht vorhandene URLs sein muss. Wenn die erste nicht übereinstimmt und die zweite nicht, sollte die dritte die Anfrage bearbeiten
Die Struktur, die ich habe, ist:
/ etc / nginx / sites-enabled / main_site, hier, abgesehen von Servername und Protokollen, habe include /etc/nginx/subsites-enabled/*
ich 3 Konfigurationsdateien, eine für jede der Apps.
Jede der 3 Konfigurationsdateien enthält einen Standortblock.
Ich habe einen negativen Lookahead in Regex versucht (im Grunde genommen habe ich versucht, die URLs, mit denen die anderen Apps umgehen, fest zu codieren), bin aber gescheitert.
Also, um zusammenzufassen:
/ und / community sollten von /etc/nginx/subsites-enabled/example.org/home geliefert werden (ein paar Perl-Skripte)
/ news sollte von /etc/nginx/subsites-enabled/example.org/news (wordpress) geliefert werden
alles andere sollte von /etc/nginx/subsites-enabled/example.org/app (Kuchen-App) geliefert werden
Das Perl-Bit funktioniert gut. Das Problem, das ich habe, ist, dass die App Nachrichten übernimmt (wahrscheinlich, weil sie passt. *), Ich habe verschiedene Optionen ausprobiert (ich bin seit 2 Tagen dabei), aber keine von ihnen hat alle Probleme gelöst (manchmal) statische Assets würden nicht funktionieren, etc).
Meine Konfiguration ist:
/etc/nginx/sites-enabled/example.org:
server {
listen 80;
server_name example.org;
error_log /var/log/nginx/example.org.log;
include /etc/nginx/subsites-enabled/example.org/*;
}
/etc/nginx/subsites-enabled/example.org/home:
location = / {
rewrite ^.*$ /index.pl last;
}
location ~* /community(.*) {
rewrite ^.*$ /index.pl last;
}
location ~ \.pl {
root /var/www/vhosts/home;
access_log /var/log/nginx/home/access.log;
error_log /var/log/nginx/home/error.log;
include /etc/nginx/fastcgi_params;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/home$fastcgi_script_name;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
/ etc / ngins / subsites-enabled / news
location /news {
access_log /var/log/nginx/news/access.log;
error_log /var/log/nginx/news/error.log debug;
error_page 404 = /news/index.php;
root /var/www/vhosts/news;
index index.php;
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news$fastcgi_script_name;
}
}
/ etc / nginx / subsites-enabled / app:
location ~ .* {
access_log /var/log/nginx/app/access.log;
error_log /var/log/nginx/app/error.log;
rewrite_log on;
index index.php;
root /var/www/vhosts/app/app/webroot;
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot$fastcgi_script_name;
}
}
@
Präfix), der Ihrer Standard-App zugeordnet ist. Sie können auch eine error_page einrichten, die einen 404 einem benannten Ort zuordnet.location ^~ /news
. b) Für Ihren App-Block sollten Sie in der Lage sein, dies zu tunlocation /
(dies ist nicht dasselbe wielocation = /
, sollte aber mit allem übereinstimmen, was noch nicht übereinstimmt. c) In einigen Fällen (insbesondere bei regulären Ausdrücken) spielt die Reihenfolge eine Rolle. Möglicherweise möchten Sie die 3 kombinieren Dateien in eine einzelne Datei mit den Blöcken in der richtigen Reihenfolge. Verwenden Sie stattdessen auch try_files!-e
. Siehe schließlich wiki.nginx.org/HttpCoreModule#location .Antworten:
Es gibt ein paar Probleme mit deiner Konfiguration, die beiden relevanten sind:
Nehmen Sie zum Beispiel die URL example.org/news/test.htm
location /news
Block passt dazu/news/test.htm
- dies ändert sich nicht, nur weil es sich im Ortsblock befindet/var/www/vhosts/news/news/test.htm
if (!-e $request_filename)
Anweisung sollte diese nicht vorhandene Datei erfassen/index.php
last
die Prozesse verwenden, beginnt es von vorne (Ausbruch aus dem Standortblock)/index.php
wird jetzt von der gefangen genommenlocation /app block
.Das oben erwähnte Problem mit der root-Direktive wird verschärft, wenn Sie zu Ihrem App-Standortblock wechseln. Anders als beim Block "Nachrichten", bei dem Sie möglicherweise nur "Nachrichten" aus dem Pfad entfernen könnten (da sie wieder hinzugefügt werden), können Sie dies nicht für den App-Pfad tun, der mit "Webroot" endet.
Die Lösung liegt in der
alias
Richtlinie. Das ändert das document_root nicht aber es ändert den Dateipfad, der verwandt wird, um die Anforderung zu bedienen. Leiderrewrite
undtry_files
neigen dazu, sich ein bisschen unerwartet zu verhaltenalias
.Beginnen wir mit einem einfachen Beispiel - kein PHP - nur HTML und Ihr Perl-Block - aber mit einer Ordnerstruktur, die Ihrer entspricht (getestet auf Nginx 1.0.12, CentOS 6):
location = /
- stimmt nur mit dem Stammpfad übereinlocation ^~ /community
- passt zu jedem Pfad, der mit / community beginntlocation ~ \.pl
- stimmt mit allen Dateien überein, die .pl enthaltenlocation ^~ /news
- passt zu jedem Pfad, der mit / news beginntlocation ^~ /app
- Stimmt mit jedem Pfad überein, der mit / app beginntlocation /
- stimmt mit allen Pfaden überein, die oben nicht übereinstimmenSie sollten in der Lage sein, das
^~
- zu entfernen , es kann jedoch eine leichte Leistungsverbesserung bewirken, da die Suche abgebrochen wird, sobald eine Übereinstimmung gefunden wurde.Obwohl es eine einfache Angelegenheit sein sollte, die PHP-Blöcke wieder hinzuzufügen, gibt es leider eine leichte Schwierigkeit -
try_files
(und Ihr Umschreiben) führt nicht dazu, dass der gewünschte Pfad zum verschachtelten Standortblock übergeben wird - und verwendet wird,alias
wenn nur die Erweiterung vorhanden ist im Location Block angegeben funktioniert nicht.Eine Lösung besteht darin, separate Standortblöcke zu verwenden, die zusammen mit der Alias - Direktive eine Erfassung durchführen. Dies ist zwar nicht sehr elegant, funktioniert aber, soweit ich das beurteilen kann (erneut getestet unter Nginx 1.0.12, CentOS 6) Natürlich habe ich CakePHP, Wordpress und Perl nicht eingerichtet - ich habe nur ein paar PHP- und HTML-Dateien in jedem Ordner verwendet.
Die obige Konfiguration übernimmt die einfache und nimmt zwei Änderungen vor:
location ~* ^/news/(.*\.php)$
- Stimmt mit allen Dateien überein, die mit .php enden, wobei die Pfade mit / news / beginnen.location ~* ^/app/(.*\.php)$
- Stimmt mit allen Dateien überein, die mit .php enden, wobei die Pfade mit / app / beginnen.^~
Übereinstimmung - dies ist erforderlich, damit die beiden hinzugefügten Standortblöcke mit den Pfaden übereinstimmen können (andernfalls würde die Übereinstimmung in den Blöcken / news oder / app aufhören).Es sollte beachtet werden, dass die Reihenfolge für den Standortabgleich hier sehr wichtig ist:
=
)^~
Sekunde übereinEin passender regulärer Ausdruck ersetzt einen geraden String!
Ein wichtiger Punkt ist, dass bei der Verwendung von Captures mit Alias die gesamte URL ersetzt wird - nicht nur der führende Ordner. Leider heißt das, dass
$fastcgi_script_name
leer gelassen wird - also habe ich$1
oben stattdessen verwendet.Ich bin sicher, dass Sie einige Änderungen vornehmen müssen, aber die Grundvoraussetzung sollte funktionsfähig sein. Sie sollten in der Lage sein, die Blöcke nach Bedarf in mehrere Dateien aufzuteilen - die Reihenfolge sollte sich nicht auf die Konfiguration auswirken.
quelle