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 bereitgestellt (z. B. zeigt Nginx nur PHP-Quellcode an), andernfalls wird eine Anfrage an Apache weitergeleitet. Ich muss * .php-Dateien von der Regel ausschließen, damit Anforderungen für * .php auch an Apache übergeben und verarbeitet werden.
Ich möchte, dass Nginx alle statischen Dateien verarbeitet und Apache alle dynamischen Dateien verarbeitet.
EDIT: Es gibt einen White-List-Ansatz, aber er ist nicht sehr elegant. Sehen Sie all diese Erweiterungen, ich möchte 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: Verwenden Sie in neueren Versionen von Nginx try_files
stattdessen http://wiki.nginx.org/HttpCoreModule#try_files
nginx
reverse-proxy
static-files
Fmalina
quelle
quelle
Antworten:
Verwenden Sie try_files und den benannten Standortblock ('@apachesite'). Dadurch werden unnötige Regex-Übereinstimmungen und if-Blöcke entfernt. Effizienter.
Update: Die Annahme dieser Konfiguration ist, dass es kein PHP-Skript unter gibt
/path/to/root/of/static/files
. Dies ist in den meisten modernen PHP-Frameworks üblich. Wenn in Ihren älteren PHP-Projekten sowohl PHP-Skripte als auch statische Dateien im selben Ordner gemischt sind, müssen Sie möglicherweise alle Dateitypen auf die Whitelist setzen, die Nginx bereitstellen soll.quelle
$uri/
dann funktioniert es.root /path/to/root/of/*static*/files;
. PHP-Dateien sollten in einem anderen Ordner abgelegt werden, auf den nicht direkt über das Internet zugegriffen werden kann.Versuche dies:
Hoffentlich funktioniert es. Reguläre Ausdrücke haben eine höhere Priorität als einfache Zeichenfolgen.
.php
Daher sollten alle Anforderungen, die mit enden, an Apache weitergeleitet werden, wenn nur eine entsprechende.php
Datei vorhanden ist. Rest wird als statische Dateien behandelt. Der eigentliche Algorithmus zur Standortbewertung ist hier .quelle
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 betrachten. Sagen Sie nginx, dass alles mit einer nicht statischen Erweiterung zu Apache gehen soll. Beispielsweise:
Ich fand den ersten Teil dieses Snippets unter: http://code.google.com/p/scalr/wiki/NginxStatic
quelle