Est-il possible de servir une page d'erreur "Bad Gateway" personnalisée dans Nginx ?
Comme pour les pages 404 personnalisées.
Est-il possible de servir une page d'erreur "Bad Gateway" personnalisée dans Nginx ?
Comme pour les pages 404 personnalisées.
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".
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.
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;
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{
}
Merci ! Je vais essayer votre réponse et je reviendrai pour mettre à jour le fil de discussion.
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.
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;
}
}
service nginx restart
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.
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).
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 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.
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