tengo - Cómo servir todos los archivos estáticos existentes directamente con NGINX, pero delegar el resto a un servidor de back-end.
nginx tutorial español (3)
Prueba esto:
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;
}
Espero que funcione. Las expresiones regulares tienen una mayor prioridad que las cadenas simples, por lo que todas las solicitudes que terminan en .php
deben desviarse a Apache si solo existe un archivo .php
correspondiente. El resto se manejará como archivos estáticos. El algoritmo real de evaluar la ubicación está here .
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;
}
}
Arriba servirá todos los archivos existentes directamente usando Nginx (p. Ej., Nginx solo muestra el código fuente de PHP), de lo contrario enviará una solicitud a Apache. Necesito excluir los archivos * .php de la regla para que las solicitudes de * .php también se pasen a Apache y se procesen.
Quiero que Nginx maneje todos los archivos estáticos y Apache para procesar todo lo dinámico.
EDITAR: Hay un enfoque de lista blanca, pero no es muy elegante, mira todas esas extensiones, no quiero esto.
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: en las versiones más nuevas de Nginx use try_files
en try_files
lugar http://wiki.nginx.org/HttpCoreModule#try_files
Si usa mod_rewrite para ocultar la extensión de sus scripts, o si simplemente le gustan las URL bonitas que terminan en /, entonces es posible que desee acercarse a esto desde la otra dirección. Dile a nginx que permita que algo con una extensión no estática pase a apache. Por ejemplo:
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;
}
Encontré la primera parte de este fragmento en: http://code.google.com/p/scalr/wiki/NginxStatic
Utilice try_files y el bloque de ubicación con nombre (''@apachesite''). Esto eliminará la coincidencia de expresiones regulares innecesarias y si bloquea. Más eficiente.
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;
}
Actualización: La suposición de esta configuración es que no existe ningún script php en /path/to/root/of/static/files
. Esto es común en la mayoría de los frameworks php modernos. En el caso de que sus proyectos heredados de php tengan tanto scripts php como archivos estáticos mezclados en la misma carpeta, es posible que deba incluir en la lista blanca todos los tipos de archivos que desee que nginx sirva.