J'exécute docker-nginx sur le serveur ECS. Mon service nginx est soudainement arrêté car le proxy_path de l'un des serveurs est devenu inaccessible. L'erreur est la suivante:
[emerg] 1#1: Host not found in upstream "dev-example.io" in /etc/nginx/conf.d/default.conf:988
Mon fichier de configuration est comme ci-dessous:
server {
listen 80;
server_name test.com;
location / {
proxy_pass http://dev-exapmle.io:5016/;
proxy_redirect off;
##proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
server {
listen 80 default_server;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/Host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
J'ai de nombreux serveurs dans le fichier de configuration, même si un serveur était en panne, je dois exécuter nginx. Y a-t-il un moyen de le réparer?
Toute suggestion pour résoudre ce problème serait appréciée.
Incluez pour empêcher Nginx de planter si votre site est en panne, incluez une directive de résolution, comme suit:
server {
listen 80;
server_name test.com;
location / {
resolver 8.8.8.8
proxy_pass http://dev-exapmle.io:5016/;
proxy_redirect off;
...
ATTENTION! L'utilisation d'un DNS public crée un risque de sécurité dans votre backend car vos demandes DNS peuvent être usurpées. S'il s'agit d'un problème, vous devez pointer le résolveur sur un serveur DNS sécurisé.
Cela signifie généralement que le nom DNS que vous avez fourni en tant que serveur en amont ne peut pas être résolu. Pour le tester, connectez-vous sur le serveur nginx et essayez d’envoyer une requête ping au serveur en amont fourni et vérifiez si la résolution de nom s’achève correctement. Si c’est un conteneur de menu fixe, essayez docker exec -it
pour obtenir un shell, puis testez la résolution en amont avec le test. Si le contacteur est arrêté, essayez d'utiliser l'adresse IP au lieu du nom DNS dans votre bloc serveur.
proxy_pass http://<IP ADDRESS>:5016/;
Vous pouvez également utiliser la directive resolver si vous souhaitez utiliser un autre serveur DNS pour cet emplacement que le système hôte:
resolver 8.8.8.8;
Le simple ajout d'un résolveur n'a pas résolu le problème dans mon cas. Mais j’ai pu contourner ce problème en utilisant une variable pour l’hôte ..__ De plus, j’imagine qu’il est plus logique d’utiliser le DNS de Docker à 127.0.0.11 (il s’agit d’une adresse IP fixe).
Exemple:
server {
listen 80;
server_name test.com;
location / {
resolver 127.0.0.11;
set example dev-example.io:5016
proxy_pass http://$example;
}
}
J'ai trouvé la solution de contournement variable sur cette page .