location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if (-f $request_filename) {
access_log off;
expires 30d;
break;
}
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8080; # backend server listening
break;
}
}
Powyższe będzie obsługiwać wszystkie istniejące pliki bezpośrednio przy użyciu Nginx (np. Nginx po prostu wyświetla kod źródłowy PHP), w przeciwnym razie przekieruje żądanie do Apache. Muszę wykluczyć pliki * .php z reguły, aby żądania dotyczące * .php były również przekazywane do Apache i przetwarzane.
Chcę, aby Nginx obsługiwał wszystkie pliki statyczne, a Apache przetwarzał wszystkie dynamiczne rzeczy.
EDYCJA: Istnieje podejście do białej listy, ale nie jest to zbyt eleganckie, Zobacz wszystkie te rozszerzenia, nie chcę tego.
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
access_log off;
expires 30d;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
EDYCJA 2: W nowszych wersjach Nginx użyj try_files
zamiast tego http://wiki.nginx.org/HttpCoreModule#try_files
nginx
reverse-proxy
static-files
fmalina
źródło
źródło
Odpowiedzi:
Użyj try_files i nazwanego bloku lokalizacji („@apachesite”). Spowoduje to usunięcie niepotrzebnego dopasowania wyrażenia regularnego i zablokowania. Bardziej wydajny.
Aktualizacja: założeniem tej konfiguracji jest to, że nie ma żadnego skryptu php pod
/path/to/root/of/static/files
. Jest to powszechne w większości nowoczesnych frameworków php. W przypadku, gdy twoje starsze projekty php mają zarówno skrypty php, jak i pliki statyczne zmieszane w tym samym folderze, być może będziesz musiał dodać do białej listy wszystkie typy plików, które chcesz obsługiwać nginx.źródło
$uri/
to działa.root /path/to/root/of/*static*/files;
. Pliki php należy umieścić w innym folderze, niedostępnym bezpośrednio z Internetu.Spróbuj tego:
Mam nadzieję, że to działa. Wyrażenia regularne mają wyższy priorytet niż zwykłe ciągi, więc wszystkie żądania kończące się na
.php
powinny być przekazywane do Apache, jeśli.php
istnieje tylko odpowiedni plik. Reszta będzie traktowana jako pliki statyczne. Aktualny algorytm oceny lokalizacji jest tutaj .źródło
Jeśli używasz mod_rewrite do ukrycia rozszerzenia swoich skryptów lub po prostu lubisz ładne adresy URL kończące się na /, możesz podejść do tego z innej strony. Powiedz nginx, aby wszystko z niestatycznym rozszerzeniem przechodziło do Apache. Na przykład:
Znalazłem pierwszą część tego fragmentu pod adresem : http://code.google.com/p/scalr/wiki/NginxStatic
źródło