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を実行する必要があります。修正する方法はありますか?
この問題を修正するための提案をいただければ幸いです。
サイトがダウンした場合に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;
}
}
このページ で変数の回避策を見つけました。
これは通常、アップストリームサーバーとして指定したDNS名を解決できないことを意味します。テストするには、nginxサーバーにログオンし、提供されたアップストリームサーバーにpingを実行し、名前解決が正しく完了するかどうかを確認します。Dockerコンテナーがdocker exec -it
シェルを取得し、アップストリームにpingを実行して名前解決をテストします。 contianerが停止している場合は、サーバーブロックでDNS名の代わりにIPアドレスを使用してください。
proxy_pass http://<IP ADDRESS>:5016/;
この場所にホストシステムとは異なるDNSサーバーを使用する場合は、リゾルバーディレクティブを使用することもできます。
resolver 8.8.8.8;