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;
}
}
Oben werden alle vorhandenen Dateien direkt mit Nginx bedient (z. B. zeigt Nginx nur PHP Quellcode) an, ansonsten leite ich eine Anfrage an Apache weiter. Ich muss * .php-Dateien von der Regel ausschließen, damit Anfragen nach * .php werden ebenfalls an Apache übergeben und verarbeitet.
Ich möchte, dass Nginx alle statischen Dateien verarbeitet und Apache alle dynamischen Daten verarbeitet.
EDIT: Es gibt White-List-Ansatz, aber es ist nicht sehr elegant, siehe all diese Erweiterungen, ich will das nicht.
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;
}
BEARBEITEN 2: Auf neueren Versionen von Nginx verwenden Sie try_files
statt http://wiki.nginx.org/HttpCoreModule#try_files
Verwenden Sie try_files und den benannten Standortblock ('@apachesite'). Dadurch werden unnötige Regex-Übereinstimmungen und Blockierungen entfernt. Effizienter.
location / {
root /path/to/root/of/static/files;
try_files $uri $uri/ @apachesite;
expires max;
access_log off;
}
location @apachesite {
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;
}
Update: Die Annahme dieser Konfiguration ist, dass unter /path/to/root/of/static/files
Kein PHP-Skript existiert. Dies ist in den meisten modernen PHP-Frameworks üblich. Falls sich in Ihren älteren PHP-Projekten sowohl PHP-Skripte als auch statische Dateien im selben Ordner befinden, müssen Sie möglicherweise alle Dateitypen, die nginx bereitstellen soll, auf die Whitelist setzen.
Versuche dies:
location / {
root /path/to/root;
expires 30d;
access_log off;
}
location ~* ^.*\.php$ {
if (!-f $request_filename) {
return 404;
}
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;
}
Hoffentlich klappt es. Reguläre Ausdrücke haben eine höhere Priorität als einfache Zeichenfolgen. Daher sollten alle Anforderungen, die auf .php
Enden, an Apache weitergeleitet werden, wenn nur eine entsprechende .php
- Datei vorhanden ist. Rest wird als statische Dateien behandelt. Der tatsächliche Algorithmus zur Standortbewertung ist hier .
Wenn Sie mod_rewrite verwenden, um die Erweiterung Ihrer Skripte auszublenden, oder wenn Sie nur hübsche URLs mögen, die mit/enden, möchten Sie dies möglicherweise aus der anderen Richtung tun. Weisen Sie nginx an, alles mit einer nicht statischen Erweiterung an Apache durchzulassen. Beispielsweise:
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|Zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
{
root /path/to/static-content;
}
location ~* ^!.+\.(jpg|jpeg|gif|png|ico|css|Zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
if (!-f $request_filename) {
return 404;
}
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;
}
Ich habe den ersten Teil dieses Snippets unter folgender Adresse gefunden: http://code.google.com/p/scalr/wiki/NginxStatic