web-dev-qa-db-fra.com

nginx ne sert pas mon error_page

J'ai une application Sinatra hébergée avec Unicorn, et nginx devant. Lorsque l'application Sinatra présente une erreur d'erreur (renvoie 500), j'aimerais afficher une page statique plutôt que la "erreur de serveur interne" par défaut. J'ai la configuration nginx suivante:

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 directive error_page est là, et j'ai Sudo'd en tant que www-data (Ubuntu) et vérifié que je peux cat le fichier, ce n'est donc pas un problème d'autorisation. Avec le fichier de configuration ci-dessus et service nginx reload, la page que je reçois en cas d'erreur est toujours la même "Erreur interne du serveur".

Quelle est mon erreur?

36

error_page gère les erreurs générées par nginx. Par défaut, nginx renverra ce que le serveur proxy renvoie, quel que soit le code de statut http.

Ce que vous cherchez, c'est proxy_intercept_errors

Cette directive décide si nginx interceptera les réponses avec HTTP codes de statut de 400 et plus.

Par défaut, toutes les réponses seront envoyées telles quelles à partir du serveur mandaté.

Si vous activez cette option, nginx interceptera les codes de statut qui sont explicitement gérée par une directive error_page. Réponses avec statut les codes qui ne correspondent pas à une directive error_page seront envoyés tels quels à partir du serveur mandaté.

72
Stephen Emslie

Vous pouvez définir proxy_intercept_errors en particulier pour cet emplacement.

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

et vous pouvez définir à la place 200 autres statuts dont vous avez besoin

14
Alexey

Les personnes qui utilisent FastCGI en amont ont besoin de ce paramètre activé

fastcgi_intercept_errors on;

Pour mon PHP application, je l’utilise dans mon bloc de configuration en amont

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

Comme mentionné par Stephen dans cette réponse , utiliser proxy_intercept_errors on; peut fonctionner . Bien que dans mon cas, comme vu dans cette réponse , utiliser uwsgi_intercept_errors on; a fait l'affaire.

0
ppython