error - nginx alias
nginx no está sirviendo mi error_page (4)
Como mencionó Stephen en esta respuesta , al usar proxy_intercept_errors on;
puede trabajar. Aunque en mi caso, como se ve en esta respuesta , usando uwsgi_intercept_errors on;
Hizo el truco...
Tengo una aplicación Sinatra alojada en Unicorn y nginx en frente de ella. Cuando la aplicación Sinatra se equivoca (devuelve 500), me gustaría publicar una página estática, en lugar del "Error interno del servidor". Tengo la siguiente configuración nginx:
server {
listen 80 default;
server_name *.example.com;
root /home/deploy/www-frontend/current/public;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_pass http://127.0.0.1:4701/;
}
error_page 500 502 503 504 /50x.html;
}
La directiva error_page está ahí, y he sudo como www-data (Ubuntu) y verificado que puedo cat
el archivo, por lo tanto no es un problema de permiso. Con el archivo de configuración anterior, y el service nginx reload
, la página que recibo por error sigue siendo el mismo "Error interno del servidor".
¿Cuál es mi error?
Las personas que están utilizando FastCGI como su upstream necesitan este parámetro activado
fastcgi_intercept_errors on;
Para mi aplicación PHP, la estoy usando en mi bloque de configuración upstream
location ~ .php$ { ## Execute PHP scripts
fastcgi_pass php-upstream;
fastcgi_intercept_errors on;
error_page 500 /500.html;
}
Puede establecer proxy_intercept_errors especialmente para esa ubicación
location /some/location {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_pass http://127.0.0.1:4701/;
proxy_intercept_errors on; # see http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
error_page 400 500 404 ... other statuses ... =200 /your/path/for/custom/errors;
}
y puede configurar en lugar 200 otro estado lo que necesita
error_page
maneja los errores que genera nginx. Por defecto, nginx devolverá lo que devuelva el servidor proxy independientemente del código de estado http.
Lo que estás buscando es proxy_intercept_errors
Esta directiva decide si nginx interceptará respuestas con códigos de estado HTTP de 400 y superiores.
Por defecto, todas las respuestas se enviarán como están del servidor proxy.
Si activa esto, nginx interceptará los códigos de estado que maneja explícitamente una directiva error_page. Las respuestas con códigos de estado que no coinciden con una directiva error_page se enviarán tal cual del servidor proxy.