2012-01-03 26 views
30

Tengo una aplicación Sinatra alojada con 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 de nginx:nginx no está sirviendo mi error_page

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'd como www-data (Ubuntu) y verificado que puedo cat el archivo, por lo que no es un problema de permisos. Con el archivo de configuración anterior, y service nginx reload, la página que recibo por error sigue siendo el mismo "Error interno del servidor".

¿Cuál es mi error?

Respuesta

60

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 estamos buscando es proxy_intercept_errors

Esta directiva decide si nginx interceptará con respuestas HTTP códigos de estado de 400 y superiores.

De forma predeterminada, todas las respuestas se enviarán como están del servidor proxy.

Si configura esto en on entonces nginx interceptará códigos de estado que son manejados explícitamente por una directiva error_page. Las respuestas con códigos de estado que no coincidan con una directiva error_page se enviarán como están en el del servidor proxy.

+1

Sabía que era una cuestión de RTFM. ¡Gracias por tomarse el tiempo de dar una excelente respuesta! –

+9

Solo una nota rápida de una respuesta de 4 años: ahora 'proxy_intercept_errors' funciona para errores iguales o superiores a 300. – Tisho

12

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 se puede establecer en lugar de 200 otra condición lo que necesita

+5

El uso de' proxy_intercept_errors; '(sin argumento) ya no es válido en nginx actual. Use 'proxy_intercept_errors on;' en su lugar. – Marian

+0

Hola Marian, gracias por obtener – Alexey

+0

Pregunta rápida sobre la semántica aquí ... configuración 'proxy_intercept_errors' a' on' significa que la página personalizada se devuelve, y establecer en 'off' significa que la página nginx se devuelve, ¿correcto? – speedplane

0

Como se mencionó por Stephen in this response, utilizando proxy_intercept_errors on; puede trabajar. Aunque en mi caso, como se ve in this answer, utilizando uwsgi_intercept_errors on; hizo el truco ...

0

personas que están usando FastCGI como su necesidad aguas arriba este parámetro encendidos

fastcgi_intercept_errors on; 

para mi aplicación PHP, 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; 
}