Obecnie próbuję rozdzielić 3 aplikacje z jednego repozytorium na 3, ale zachowując strukturę adresu URL, więc zasadniczo różne lokalizacje w tej samej domenie muszą być dostarczane przez różne aplikacje.
Mam problem z tym, że jedna z aplikacji musi być rezerwą dla nieistniejących adresów URL, więc jeśli pierwsza nie pasuje, a druga nie, to trzecia powinna obsłużyć żądanie
Struktura, którą mam to:
/ etc / nginx / sites-enabled / main_site, tutaj oprócz nazwy serwera i dzienników include /etc/nginx/subsites-enabled/*
, w których mam 3 pliki konfiguracyjne, po jednym dla każdej aplikacji.
Każdy z 3 plików konfiguracyjnych zawiera blok lokalizacji.
Próbowałem negatywnego lookahead w wyrażeniu regularnym (w zasadzie próbuję zakodować adresy URL obsługiwane przez inne aplikacje), ale nie powiodło się.
Podsumowując:
/ i / community powinno być dostarczone przez /etc/nginx/subsites-enabled/example.org/home (kilka skryptów perla)
/ news powinien być dostarczony przez /etc/nginx/subsites-enabled/example.org/news (wordpress)
wszystko inne powinno być dostarczone przez /etc/nginx/subsites-enabled/example.org/app (aplikacja do ciastek)
Bit Perla działa dobrze. Problem, który mam, polega na tym, że aplikacja przejmuje wiadomości (prawdopodobnie dlatego, że pasuje. *), Próbowałem różnych opcji (byłem przy tym przez 2 dni), ale żadna z nich nie rozwiązała wszystkich problemów (czasami zasoby statyczne nie działałyby itp.).
Moja konfiguracja to:
/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;
}
}
@
prefiksu), który mapuje na twoją domyślną aplikację. Możesz także skonfigurować stronę_błędu, która odwzorowuje 404 na nazwaną lokalizację.location ^~ /news
. b) w przypadku bloku aplikacji powinieneś być w stanie to zrobićlocation /
(to nie to samolocation = /
, ale powinieneś dopasować wszystko, co jeszcze nie jest dopasowane. c) w niektórych przypadkach (szczególnie wyrażenia regularne), kolejność ma znaczenie - możesz połączyć 3 pliki do jednego pliku z blokami we właściwej kolejności. Zamiast tego użyj try_files!-e
. Na koniec zobacz wiki.nginx.org/HttpCoreModule#location .Odpowiedzi:
W twojej konfiguracji jest kilka błędów, z których dwie są istotne:
Weźmy na przykład adres URL example.org/news/test.htm
location /news
Blok będzie go dopasować/news/test.htm
- to się nie zmienia, tylko dlatego, że znajduje się w bloku lokalizacji/var/www/vhosts/news/news/test.htm
if (!-e $request_filename)
oświadczenie powinno przechwycić ten nieistniejący plik/index.php
last
procesy zaczynają się od nowa (wyrwanie z bloku lokalizacji)/index.php
jest teraz przechwytywany przezlocation /app block
.Wspomniany wyżej problem związany z dyrektywą root jest złożony, gdy wchodzisz do bloku lokalizacji aplikacji. W przeciwieństwie do bloku „news”, w którym można po prostu usunąć „news” ze ścieżki (ponieważ zostanie dodany ponownie), nie można tego zrobić dla ścieżki aplikacji, która kończy się na „webroot”.
Rozwiązanie leży w
alias
dyrektywie. Nie zmienia to katalogu_głównego dokumentu, ale zmienia ścieżkę pliku używaną do obsługi żądania. Niestetyrewrite
itry_files
zachowują się nieco nieoczekiwaniealias
.Zacznijmy od prostego przykładu - bez PHP - tylko HTML i blok Perla - ale ze strukturą folderów pasującą do twojej (testowane na Nginx 1.0.12, CentOS 6):
location = /
- dopasuje tylko ścieżkę katalogu głównegolocation ^~ /community
- dopasuje każdą ścieżkę zaczynającą się od / communitylocation ~ \.pl
- dopasuje wszystkie pliki zawierające .pllocation ^~ /news
- dopasuje każdą ścieżkę zaczynającą się od / newslocation ^~ /app
- dopasuje każdą ścieżkę zaczynającą się od / applocation /
- dopasuje wszystkie ścieżki niepasujące powyżejPowinieneś być w stanie usunąć
^~
- ale może zaoferować niewielką poprawę wydajności, ponieważ przestaje szukać po znalezieniu dopasowania.Chociaż ponowne dodanie bloków PHP powinno być prostą sprawą, istnieje niestety niewielka trudność -
try_files
(i przepisanie) nie kończy się przekazywaniem pożądanej ścieżki do zagnieżdżonego bloku lokalizacji - i używanie,alias
gdy tylko rozszerzenie jest określone w bloku lokalizacji nie działa.Jednym z rozwiązań jest użycie oddzielnych bloków lokalizacji, które wykonują przechwytywanie razem z dyrektywą aliasu - nie jest to dość eleganckie, ale o ile wiem, działa (ponownie przetestowane na Nginx 1.0.12, CentOS 6 - z oczywiście nie skonfigurowałem CakePHP, Wordpress i Perla - po prostu użyłem kilku plików PHP i HTML w każdym folderze)
Powyższa konfiguracja bierze powyższą prostą i wprowadza dwie zmiany:
location ~* ^/news/(.*\.php)$
- dopasuje wszystkie pliki z rozszerzeniem .php, a ścieżki zaczynają się od / news /location ~* ^/app/(.*\.php)$
- dopasuje wszystkie pliki z rozszerzeniem .php, a ścieżki zaczynają się od / app /^~
dopasowanie - jest to wymagane, aby dwa dodane bloki lokalizacji mogły się zgadzać ze ścieżkami (w przeciwnym razie dopasowanie zatrzymałoby się w blokach / news lub / app).Należy zauważyć, że kolejność dopasowywania lokalizacji jest tutaj bardzo ważna:
=
)^~
drugiegoPasujące wyrażenie regularne zastąpi prosty ciąg!
Ważną rzeczą do wspomnienia jest to, że gdy przechwytywanie jest używane z aliasem, cały adres URL jest zastępowany - nie tylko folder wiodący. Niestety oznacza to, że
$fastcgi_script_name
pozostało puste - więc użyłem$1
powyżej.Jestem pewien, że będziesz musiał wprowadzić kilka zmian, ale podstawowa przesłanka powinna być funkcjonalna. W razie potrzeby powinieneś być w stanie rozdzielić bloki na wiele plików - kolejność nie powinna wpływać na konfigurację.
źródło