Cómo servir a todos los archivos estáticos existentes directamente con Nginx, pero el resto de proxy a un servidor back-end.
-
22-08-2019 - |
Pregunta
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;
}
}
Sobre servirá todos los archivos existentes que usan directamente Nginx (por ejemplo Nginx sólo muestra el código fuente PHP), de lo contrario presentar una solicitud a Apache. Necesito excluir archivos * .php de la regla de modo que las solicitudes de * .php también se pasan a Apache y procesados.
Quiero Nginx para manejar todos los archivos estáticos y Apache para procesar toda la materia dinámica.
EDIT:. Hay enfoque de lista blanca, pero no es muy elegante, Ver todas esas extensiones, yo 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 uso Nginx try_files
lugar http://wiki.nginx.org / HttpCoreModule # try_files
Solución
try_files y el bloque de ubicación con nombre ( '@apachesite'). Esto eliminará partido de expresiones regulares innecesario y si el bloque. 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: El supuesto de esta configuración es que no existe ningún script PHP bajo /path/to/root/of/static/files
. Esto es común en la mayoría de los marcos de PHP modernas. En caso de que sus proyectos php heredadas tienen ambos scripts php y archivos estáticos mezclados en la misma carpeta, que pueden tener a la lista blanca todos los tipos de archivos que desea nginx para servir.
Otros consejos
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;
}
Es de esperar que funciona. Las expresiones regulares tienen mayor prioridad que las cadenas de fricción, por lo que todas las solicitudes que terminan en .php
deben forwared a Apache aunque sólo sea un correspondiente <=> archivo existe. Resto se maneja como archivos estáticos. El algoritmo real de evaluar ubicación es rel="noreferrer"> .
Si utiliza mod_rewrite para ocultar la extensión de las secuencias de comandos, o si simplemente como URLs bonitas que terminan en /, entonces es posible que desee acercarse a este desde la otra dirección. Dile a nginx a dejar que nada con una extensión no estático que ir a través de 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;
}
He encontrado la primera parte de este fragmento más en: http://code.google .com / p / Scalr / wiki / NginxStatic