web-dev-qa-db-ja.com

Docker Nginxの停止:[emerg] 1#1:ホストがアップストリームに見つかりません

ECSサーバーでdocker-nginxを実行しています。いずれかのサーバーのproxy_pathが到達不能になったため、nginxサービスが突然停止しました。エラーは次のとおりです。

[emerg] 1#1: Host not found in upstream "dev-example.io" in /etc/nginx/conf.d/default.conf:988

私の設定ファイルは次のとおりです:

 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;
   }
}

構成ファイルに多くのサーバーがあります。1つのサーバーがダウンした場合でも、nginxを実行する必要があります。修正する方法はありますか?

この問題を修正するための提案をいただければ幸いです。

15
Matrix

サイトがダウンした場合にNginxがクラッシュするのを防ぐために、次のようにリゾルバーディレクティブを含めます。

 server {
       listen      80;
       server_name     test.com;
       location / {
          resolver 8.8.8.8
          proxy_pass         http://dev-exapmle.io:5016/;
          proxy_redirect     off;
 ...

警告! DNS要求はスプーフィングされる可能性があるため、パブリックDNSを使用すると、バックエンドでセキュリティリスクが発生します。これが問題になる場合は、リゾルバーに安全なDNSサーバーを指定する必要があります。

私の場合、リゾルバーを追加しても問題は解決しませんでした。しかし、ホストの変数を使用することで回避できました。また、127.0.0.11でDockerのDNSを使用する方が理にかなっていると思います(これは固定IPです)。

例:

server {
  listen 80;
  server_name test.com;

  location / {
    resolver 127.0.0.11;
    set example dev-example.io:5016
    proxy_pass http://$example;
  }
}

このページ で変数の回避策を見つけました。

8
Damien

これは通常、アップストリームサーバーとして指定したDNS名を解決できないことを意味します。テストするには、nginxサーバーにログオンし、提供されたアップストリームサーバーにpingを実行し、名前解決が正しく完了するかどうかを確認します。Dockerコンテナーがdocker exec -itシェルを取得し、アップストリームにpingを実行して名前解決をテストします。 contianerが停止している場合は、サーバーブロックでDNS名の代わりにIPアドレスを使用してください。

proxy_pass         http://<IP ADDRESS>:5016/;

この場所にホストシステムとは異なるDNSサーバーを使用する場合は、リゾルバーディレクティブを使用することもできます。

resolver 8.8.8.8;
3
Farhad Farahi