64 votes

Page Bad Gateway personnalisée avec Nginx

Est-il possible de servir une page d'erreur "Bad Gateway" personnalisée dans Nginx ?

Comme pour les pages 404 personnalisées.

0 votes

Essayez cette réponse (fonctionne pour moi sur nginx/1.2.1)

0 votes

La configuration par défaut pour mon centos était /usr/share/nginx/html/50x.html mentionné dans /etc/nginx/conf.d/default.conf

65voto

Jack Desert Points 255

Trois éléments doivent être en place pour que votre page d'erreur personnalisée s'affiche au lieu de l'erreur générique "Bad Gateway".

  1. Vous devez créer un fichier html nommé par exemple "500.html" et le placer dans la racine. Dans le cas de Rails fonctionnant derrière Nginx, cela signifie le placer à l'adresse public/500.html.

  2. Vous devez avoir une ligne dans votre fichier de configuration qui dirige au moins les erreurs 502 vers cette page 500.html comme ceci :

    error_page 502 /500.html;
  3. Vous devez avoir un bloc d'emplacement pour /500.html dans votre fichier de configuration. Si votre racine est déjà définie, ce bloc peut être vide. Mais le bloc doit néanmoins exister.

    location /500.html{
    }

41voto

Larsenal Points 17080

C'est similaire à la mise en place des pages 404 personnalisées. Voici ce que j'ai.

#site-wide error pages
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;

0 votes

Merci ! Je vais essayer votre réponse et je reviendrai pour mettre à jour le fil de discussion.

4 votes

Cela n'a pas fonctionné pour moi, je me demande si le comportement a changé dans les nouvelles versions de nginx. J'ai essayé ces instructions légèrement différentes et j'ai réussi à le faire fonctionner.

2 votes

Confirmé. Cela ne fonctionne pas. Ça ne devrait pas être la bonne réponse.

21voto

En utilisant debian (9.3 stretch en fait) j'ai fait les étapes suivantes :

  • créer /var/www/html/502.html avec le contenu de la page d'erreur 502

  • modifier /etc/nginx/sites-enabled/mywebsite.conf

donc ça ressemble à ça :

server {
    listen 80; listen [::]:80;
    server_name www.mywebsite.com;

    error_page 502 /502.html;
    location /502.html {
        root /var/www/html;
    }
}
  • puis redémarré nginx en utilisant service nginx restart

7 votes

De toutes les réponses à cette question, c'est la seule réponse que j'ai trouvée à la fois exacte ET COMPLET . Il y avait tellement de détails oubliés dans les autres réponses que je n'ai pas pu les faire fonctionner. Les détails ne seraient rien pour quelqu'un qui connaît les configurations de Nginx, mais ce n'est pas mon cas. Cette réponse donnait les choses précises que je devais faire pour atteindre l'objectif de l'OP.

4voto

Cameron Tacklind Points 343

Bien que la réponse de @Larsenal soit techniquement correcte pour la configuration minimale, il y a des configurations communes qui font que cela ne fonctionnera pas. La réponse de @Jack Desert aborde ce point mais ne fournit pas une explication complète de la raison pour laquelle cela est nécessaire.

Supposons que nous ayons cette configuration (simplifiée par @Jack).

error_page 502 504 /my-error-page.html;

Ce que cela signifie, c'est que, dans le cas d'une erreur 502 ou 504 en interne, il faut réécrire l'URI original comme suit /my-error-page.html .

Ce que je pense que la plupart des gens ratent, c'est que ce alors passe par la même chaîne de traitement cela se passe comme si vous demandiez cette page directement. Cela signifie qu'elle passe par tous les mêmes contrôles du bloc de localisation.

Puisqu'une méthode courante pour faire un reverse proxy sur nginx est de configurer un location / { cet emplacement correspond /my-error-page.html et donc nginx essaie d'utiliser le proxy pour servir le fichier d'erreur . Puisqu'un cas d'utilisation courant est de servir un fichier statique dans le cas où le backend est en panne, servir cette page d'erreur à partir du backend échouera probablement aussi, faisant que nginx servira par défaut sa propre page d'erreur interne que nous avons essayé de remplacer en premier lieu.

Ainsi, une solution courante, celle que suggère @Jack Desert, est d'inclure une autre location qui correspondra à la /my-error-page.html URL avant le location / bloc. Notez que l'ordre des blocs d'emplacement dans la configuration de nginx n'a aucun effet ; il existe un ensemble de règles très spécifiques pour choisir la priorité des blocs d'emplacement en fonction de l'URL. Ce bloc d'emplacement doit avoir tout ce qui est nécessaire pour servir ce fichier comme tout autre fichier statique que nginx pourrait servir. Cela signifie qu'un root est nécessaire quelque part et que /my-error-page.html sera chargé par rapport à celui-ci ( root peut être défini à presque tous les niveaux de la configuration de nginx).

2voto

jlyonsmith Points 56

La question ne le dit pas, mais il est assez courant de rencontrer ce problème lorsque les API sont derrière un proxy nginx pass through, donc dans ce cas vous voulez que la réponse soit JSON et non HTML.

Mon approche préférée est d'utiliser simplement la fonctionnalité de redirection de l'interface utilisateur. error_page pour rediriger vers une page d'erreur sur le même site :

error_page 502 503 $scheme://$server_name/500.json;

C'est une ligne, vous pouvez réutiliser la même 500.json pour différents location et il n'y a pas besoin d'un mystérieux vide. location . Vous placez votre message d'erreur dans le 500.json à la racine de votre site. Je suppose que vous avez déjà un location / {...} qui sert des fichiers statiques.

Vous pouvez bien sûr utiliser cette même approche pour servir une page d'erreur HTML également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X