2012-01-03 4 views
30

Ho un'applicazione Sinatra ospitata con Unicorn e nginx di fronte ad essa. Quando l'applicazione Sinatra commette errori (restituisce 500), vorrei pubblicare una pagina statica, piuttosto che l'errore "Errore interno del server". Ho la seguente configurazione nginx:nginx non serve la mia 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 direttiva error_page è lì, e ho sudo'd come www-data (Ubuntu) e verificato posso cat il file, quindi non è un problema di permessi. Con il file di configurazione sopra, e service nginx reload, la pagina che ricevo per errore è sempre la stessa "Errore interno del server".

Qual è il mio errore?

risposta

60

error_page gestisce gli errori generati da nginx. Per impostazione predefinita, nginx restituirà tutto ciò che il server proxy restituisce indipendentemente dal codice di stato http.

Quello che stai cercando è proxy_intercept_errors

Questa direttiva decide se nginx intercetterà risposte con HTTP codici di stato di 400 e superiori.

Per impostazione predefinita tutte le risposte verranno inviate così come sono dal server proxy.

Se si imposta su on allora nginx intercetterà i codici di stato che sono gestiti esplicitamente da una direttiva error_page. Le risposte con i codici di stato che non corrispondono a una direttiva error_page verranno inviate così come sono dal server proxy.

+1

Sapevo che era una questione di RTFM. Grazie per il tempo dedicato a fornire un'ottima risposta! –

+9

Solo una breve nota per una risposta di 4 anni - ora 'proxy_intercept_errors' funziona per errori uguali o superiori a 300. – Tisho

12

È possibile impostare proxy_intercept_errors soprattutto per quella posizione

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; 
} 

ed è possibile impostare invece 200 di altra condizione ciò che è necessario

+5

L'uso di 'proxy_intercept_errors;' (senza argomento) non è più valido in nginx corrente. Usa 'proxy_intercept_errors su ;, invece. – Marian

+0

Ciao Marian, grazie per aver ottenuto – Alexey

+0

Domanda veloce sulla semantica qui ... l'impostazione 'proxy_intercept_errors' su' on' significa che la pagina personalizzata viene restituita, e l'impostazione su 'off' significa che la pagina di nginx viene restituita, corretta? – speedplane

0

Come già detto da Stephen in this response, utilizzando proxy_intercept_errors on; può funzionare. Anche se nel mio caso, come si è visto in this answer, utilizzando uwsgi_intercept_errors on; ha fatto il trucco ...

0

Le persone che utilizzano FastCGI come loro bisogno a monte di questo parametro accesi

fastcgi_intercept_errors on; 

Per la mia applicazione PHP, io sto usando nel mio blocco di configurazione upstream

location ~ .php$ { ## Execute PHP scripts 
    fastcgi_pass php-upstream; 
    fastcgi_intercept_errors on; 
    error_page 500 /500.html; 
}