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;
}
}
Ci-dessus servira directement tous les fichiers existants en utilisant Nginx (par exemple, Nginx affiche simplement PHP), sinon transmettez une demande à Apache. Je dois exclure les fichiers * .php de la règle afin que les demandes de * .php sont également transmis à Apache et traités.
Je veux que Nginx gère tous les fichiers statiques et Apache traite tous les éléments dynamiques.
EDIT: Il y a une approche de liste blanche, mais ce n'est pas très élégant, Voir toutes ces extensions, je ne veux pas cela.
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;
}
EDIT 2: Sur les nouvelles versions de Nginx, utilisez try_files
au lieu http://wiki.nginx.org/HttpCoreModule#try_files
Utilisez try_files et le bloc d’emplacement nommé ('@apachesite'). Cela supprimera les correspondances inutiles et si elles sont bloquées. Plus efficace.
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;
}
Mise à jour: L'hypothèse de cette configuration est qu'il n'existe aucun script php sous /path/to/root/of/static/files
. Ceci est courant dans la plupart des frameworks php modernes. Si vos projets php héritent de scripts php et de fichiers statiques mélangés dans le même dossier, vous devrez peut-être ajouter tous les types de fichiers que vous souhaitez que nginx serve.
Essaye ça:
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;
}
Espérons que cela fonctionne. Les expressions rationnelles ont une priorité plus élevée que les chaînes simples, donc toutes les demandes se terminant par .php
devrait être transmis à Apache si seulement un .php
le fichier existe. Reste sera traité comme des fichiers statiques. L'algorithme actuel d'évaluation de l'emplacement est ici .
Si vous utilisez mod_rewrite pour masquer l’extension de vos scripts, ou si vous aimez simplement les jolies URL se terminant par /, vous voudrez peut-être aborder cette question dans l’autre sens. Dites à nginx de laisser à Apache tout ce qui porte une extension non statique. Par exemple:
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;
}
J'ai trouvé la première partie de cet extrait à l'adresse suivante: http://code.google.com/p/scalr/wiki/NginxStatic