Actualmente estoy tratando de separar 3 aplicaciones de un repositorio en 3, pero manteniendo la estructura de la url, por lo que, básicamente, diferentes aplicaciones bajo el mismo dominio tienen que ser entregadas por diferentes aplicaciones.
Con lo que estoy luchando es que una de las aplicaciones debe ser la alternativa para las URL inexistentes, por lo que si la primera no coincide y la segunda no, entonces la tercera debe manejar la solicitud
La estructura que tengo es:
/ etc / nginx / sites-enabled / main_site, aquí, aparte del nombre_servidor y los registros que tengo include /etc/nginx/subsites-enabled/*
, donde tengo 3 archivos de configuración, uno para cada una de las aplicaciones.
Cada uno de los 3 archivos de configuración contiene un bloque de ubicación.
He intentado con anticipación negativa en expresiones regulares (básicamente tratando de codificar las URL que manejan las otras aplicaciones) pero fallé.
Entonces, para resumir:
/ y / community deben ser entregados por /etc/nginx/subsites-enabled/example.org/home (algunos scripts en perl)
/ news debe ser entregado por /etc/nginx/subsites-enabled/example.org/news (wordpress)
todo lo demás debe ser entregado por /etc/nginx/subsites-enabled/example.org/app (aplicación de pastel)
El bit perl funciona bien. El problema que tengo es que la aplicación se está haciendo cargo de las noticias (probablemente porque coincide. *), He probado varias opciones (he estado en esto durante 2 días) pero ninguna de ellas resolvió todos los problemas (a veces los activos estáticos no funcionarían, etc.).
Mi configuracion es:
/etc/nginx/sites-enabled/example.org:
server {
listen 80;
server_name example.org;
error_log /var/log/nginx/example.org.log;
include /etc/nginx/subsites-enabled/example.org/*;
}
/etc/nginx/subsites-enabled/example.org/home:
location = / {
rewrite ^.*$ /index.pl last;
}
location ~* /community(.*) {
rewrite ^.*$ /index.pl last;
}
location ~ \.pl {
root /var/www/vhosts/home;
access_log /var/log/nginx/home/access.log;
error_log /var/log/nginx/home/error.log;
include /etc/nginx/fastcgi_params;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/home$fastcgi_script_name;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
/ etc / ngins / subsites-enabled / news
location /news {
access_log /var/log/nginx/news/access.log;
error_log /var/log/nginx/news/error.log debug;
error_page 404 = /news/index.php;
root /var/www/vhosts/news;
index index.php;
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news$fastcgi_script_name;
}
}
/ etc / nginx / subsites-enabled / app:
location ~ .* {
access_log /var/log/nginx/app/access.log;
error_log /var/log/nginx/app/error.log;
rewrite_log on;
index index.php;
root /var/www/vhosts/app/app/webroot;
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot$fastcgi_script_name;
}
}
@
prefijo) que se asigna a su aplicación predeterminada. También puede configurar un error_page que asigna un 404 a una ubicación con nombre.location ^~ /news
. b) para el bloqueo de su aplicación, debería poder hacerlocation /
(esto no es lo mismo quelocation = /
, pero debería coincidir con todo lo que no coincide). c) en algunos casos (particularmente expresiones regulares), el orden sí importa; puede combinar los 3 archivos en un solo archivo con los bloques en el orden correcto. Además, use try_files en lugar de!-e
. Finalmente vea wiki.nginx.org/HttpCoreModule#location .Respuestas:
Hay algunas cosas mal con su configuración, las dos relevantes son:
Por ejemplo, tome la URL example.org/news/test.htm
location /news
bloque lo igualará/news/test.htm
: esto no cambia, solo porque está en el bloque de ubicación/var/www/vhosts/news/news/test.htm
if (!-e $request_filename)
declaración debe capturar este archivo inexistente/index.php
last
los procesos, comienza de nuevo (rompiendo el bloque de ubicación)/index.php
ahora es capturado por ellocation /app block
.El problema mencionado anteriormente, con la directiva raíz, se agrava cuando va al bloque de ubicación de su aplicación. A diferencia del bloque 'noticias', donde posiblemente podría eliminar 'noticias' de la ruta (ya que se agregará nuevamente), no puede hacer esto para la ruta de la aplicación, que termina en 'raíz web'.
La solución está en la
alias
directiva. Esto no cambia la raíz del documento, pero sí cambia la ruta del archivo que se utiliza para atender la solicitud. Lamentablemente,rewrite
ytry_files
tienden a comportarse un poco inesperadamente conalias
.Comencemos con un ejemplo simple, sin PHP, solo HTML y su bloque Perl, pero con una estructura de carpetas que coincida con la suya (probado en Nginx 1.0.12, CentOS 6):
location = /
- solo coincidirá con la ruta raízlocation ^~ /community
- coincidirá con cada ruta que comience con / communitylocation ~ \.pl
- coincidirá con todos los archivos que contienen .pllocation ^~ /news
- coincidirá con cada ruta que comience con / newslocation ^~ /app
- coincidirá con cada ruta que comience con / applocation /
- coincidirá con todos los caminos no coincidentes arribaDebería poder eliminar el
^~
, pero puede ofrecer una ligera mejora en el rendimiento, ya que deja de buscar una vez que se encuentra una coincidencia.Si bien debería ser una cuestión simple agregar los bloques PHP nuevamente, desafortunadamente, existe una ligera dificultad
try_files
(y su reescritura) no termina pasando la ruta deseada al bloque de ubicación anidado, y se usaalias
cuando solo la extensión es especificado en el bloque de ubicación no funciona.Una solución es usar bloques de ubicación separados que realicen una captura junto con la directiva de alias: no es muy elegante, pero por lo que puedo decir, funciona (de nuevo, probado en Nginx 1.0.12, CentOS 6 - de Por supuesto, no configuré CakePHP, Wordpress y Perl, solo usé un par de archivos PHP y HTML en cada carpeta)
La configuración anterior, toma la simple anterior y realiza dos cambios:
location ~* ^/news/(.*\.php)$
- coincidirá con todos los archivos que terminan en .php, con rutas que comienzan con / news /location ~* ^/app/(.*\.php)$
- coincidirá con todos los archivos que terminan en .php, con rutas que comienzan con / app /^~
coincidencia: esto es necesario para que los dos bloques de ubicación agregados puedan coincidir con las rutas (de lo contrario, la coincidencia se detendría en los bloques / news o / app).Cabe señalar que el orden de coincidencia de ubicación es muy importante aquí:
=
)^~
segundo¡Una expresión regular coincidente reemplazará una cadena recta!
Un punto importante de mención es que cuando se utilizan capturas con alias, se reemplaza toda la URL, no solo la carpeta principal. Desafortunadamente, esto significa que
$fastcgi_script_name
se deja vacío, por lo tanto, he usado$1
anteriormente en su lugar.Estoy seguro de que tendrá que hacer algunos cambios, pero la premisa básica debe ser funcional. Debería poder separar los bloques en varios archivos según sea necesario; el pedido no debería afectar la configuración.
fuente