2017-03-10 1 views
6

J'exécute docker-nginx sur le serveur ECS. Mon service nginx est soudainement arrêté parce que le proxy_path de l'un des serveurs est inaccessible. L'erreur est la suivante:Docker Nginx arrêté: [emerg] 1 # 1: hôte introuvable en amont

[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 beaucoup de serveurs dans le fichier de configuration, même si un serveur est en baisse, je dois avoir en cours d'exécution nginx. Y a-t-il un moyen de le réparer?

Une suggestion pour résoudre ce problème serait appréciée.

+0

généralement cela peut être pour deux raisons: soit le service dans http://dev-exapmle.io:5016/ est en panne ou ne répond pas aux demandes; ou bien vous avez une configuration selinux qui empêche nginx d'envoyer des requêtes par proxy. Je regarderais dans les journaux pour l'app servant dev-example.io. Si vous ne voyez rien arriver, c'est probablement un problème de selinux, auquel cas vous voudrez peut-être jeter un oeil à cette réponse: http://stackoverflow.com/questions/27435655/nginx-proxy-pass-not- working-in-selinux –

+0

@ JoséAntonioHaroPeralta merci pour le commentaire. oui ce service, dev-exapmle.io:5016, est en panne. Mais j'ai beaucoup d'autres services dans mon fichier de configuration nginx qui fonctionne mais à cause de ce service, le nginx s'est arrêté. Y a-t-il un moyen de le réparer? – Matrix

+0

inclure une directive résolveur (pointant par exemple sur google, 8.8.8.8). Nginx résoudra à cela s'il ne peut pas atteindre votre site, comme indiqué dans les réponses à la question suivante: http://stackoverflow.com/questions/32845674/setup-nginx-not-to-crash-if-host-in -upstream-is-not-found –

Répondre

1

Inclure pour éviter Nginx de tomber en panne si votre site est, inclure une directive résolveur, 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; 
... 

AVERTISSEMENT! L'utilisation d'un DNS public crée un risque de sécurité dans votre backend car vos requêtes DNS peuvent être usurpées. Si c'est un problème, vous devez pointer le résolveur vers un serveur DNS sécurisé.

+0

Merci. Que faire si j'utilise le résolveur 127.0.0.1? et si le serveur devient accessible à nouveau, est-ce qu'il acheminera le bon chemin? – Matrix

2

Cela signifie généralement que le nom DNS fourni en tant que serveur en amont ne peut pas être résolu. Pour le tester, connectez-vous au serveur nginx et essayez ping upstream server fourni et voyez si la résolution de noms se termine correctement. Si c'est un docker container essayez docker exec -it pour obtenir un shell, puis essayez de tester ping en amont pour tester la résolution du nom. Si le contianer 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 résolveur si vous souhaitez utiliser un serveur différent dns pour cet endroit que le système hôte:

resolver 8.8.8.8; 
+0

Il n'y a pas d'adresse IP pour cela, j'ai dns qui est l'URL finale des services Docker-Cloud – Matrix

+0

Apportez un conteneur config nginx par défaut, puis essayez de ping sur le DNS pour voir si la résolution arrive correctement. –

+0

Merci. Ensuite, j'utilise résolveur à la place. mais si j'utilise le résolveur 127.0.0.1; cela fonctionnerait-il bien aussi? Que se passera-t-il si le DNS fonctionne plus tard? Aussi n'a-t-il pas besoin d'avoir valide = 30s; ? – Matrix