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 (por ejemplo, Nginx solo muestra el código fuente PHP), de lo contrario, reenvíe 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 que Apache procese todas las cosas dinámicas.
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;
}
EDITAR 2: En versiones más nuevas de Nginx, use try_files
en su lugar http://wiki.nginx.org/HttpCoreModule#try_files
nginx
reverse-proxy
static-files
fmalina
fuente
fuente
Respuestas:
Utilice try_files y el bloque de ubicación con nombre ('@apachesite'). Esto eliminará la coincidencia de expresiones regulares innecesarias y el bloque if. Más eficiente.
Actualización: la suposición de esta configuración es que no existe ningún script php debajo
/path/to/root/of/static/files
. Esto es común en la mayoría de los frameworks php modernos. En caso de que sus proyectos php heredados tengan scripts php y archivos estáticos mezclados en la misma carpeta, es posible que deba incluir en la lista blanca todos los tipos de archivos que desea que sirva nginx.fuente
$uri/
entonces funciona.root /path/to/root/of/*static*/files;
. Los archivos php deben colocarse en una carpeta diferente, no accesible directamente desde Internet.Prueba esto:
Ojalá funcione. Las expresiones regulares tienen mayor prioridad que las cadenas simples, por lo que todas las solicitudes que terminan en
.php
deben reenviarse a Apache si solo.php
existe un archivo correspondiente . El resto se manejará como archivos estáticos. El algoritmo real para evaluar la ubicación está aquí .fuente
Si usa mod_rewrite para ocultar la extensión de sus scripts, o si solo le gustan las URL bonitas que terminan en /, entonces es posible que desee abordar esto desde la otra dirección. Dígale a nginx que deje que cualquier cosa con una extensión no estática pase a apache. Por ejemplo:
Encontré la primera parte de este fragmento en: http://code.google.com/p/scalr/wiki/NginxStatic
fuente