web-dev-qa-db-fra.com

Docker Nginx arrêté: [émergent] 1 # 1: hôte introuvable en amont

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.

9
Matrix

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;
3
Farhad Farahi

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 .

3
Damien