Docker Nginx 已停止:[emerg] 1#1:在上游找不到主机
Docker Nginx stopped: [emerg] 1#1: host not found in upstream
我是ECS服务器上的运行 docker-nginx。我的 nginx 服务突然停止,因为其中一台服务器的 proxy_pass
无法访问。错误如下:
[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;
}
}
我的配置文件里有很多台服务器,即使一台服务器宕机了,我也需要运行nginx。有什么办法可以解决吗?
如有任何解决此问题的建议,我们将不胜感激。
这通常意味着您作为上游服务器提供的 dns 名称无法解析。要测试它,登录 nginx 服务器并尝试 ping 提供的上游服务器并查看名称解析是否正确完成,如果它是一个 docker 容器尝试 docker exec -it
获取 shell,然后尝试 ping上游测试名称解析。如果 contianer 已停止,请尝试在您的服务器块中使用 IP 地址而不是 dns 名称。
proxy_pass http://<IP ADDRESS>:5016/;
如果您想为此位置使用与主机系统不同的 dns 服务器,您也可以使用解析器指令:
resolver 8.8.8.8;
包括以防止 Nginx 在您的站点关闭时崩溃,包括一个解析器指令,如下所示:
server {
listen 80;
server_name test.com;
location / {
resolver 8.8.8.8;
proxy_pass http://dev-exapmle.io:5016/;
proxy_redirect off;
...
警告!使用 public DNS 会在您的后端产生安全风险,因为您的 DNS 请求可能会被欺骗。如果这是一个问题,您应该将解析器指向安全的 DNS 服务器。
仅仅添加一个解析器并没有解决我的问题。但是我能够通过为主机使用变量来解决它。
另外,我想在 127.0.0.11(这是一个固定 IP)使用 Docker 的 DNS 更有意义。
示例:
server {
listen 80;
server_name test.com;
location / {
resolver 127.0.0.11;
set $example dev-example.io:5016;
proxy_pass http://$example;
}
}
我在 this page 上找到了变量解决方法。
使用 nginx plus 时,您也可以通过在上游添加一个区域来解决这个问题。在您的 proxypass 中使用此测试时。当服务器 some-server 开始解析时,它将开始向其传递流量。
确保如上所述,在配置的其他部分放置一个解析器。对于 docker,我使用
解析器 127.0.0.11 有效=1s;
upstream test {
zone test-zone 64k;
server some-server:1234 resolve;
}
我是ECS服务器上的运行 docker-nginx。我的 nginx 服务突然停止,因为其中一台服务器的 proxy_pass
无法访问。错误如下:
[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;
}
}
我的配置文件里有很多台服务器,即使一台服务器宕机了,我也需要运行nginx。有什么办法可以解决吗?
如有任何解决此问题的建议,我们将不胜感激。
这通常意味着您作为上游服务器提供的 dns 名称无法解析。要测试它,登录 nginx 服务器并尝试 ping 提供的上游服务器并查看名称解析是否正确完成,如果它是一个 docker 容器尝试 docker exec -it
获取 shell,然后尝试 ping上游测试名称解析。如果 contianer 已停止,请尝试在您的服务器块中使用 IP 地址而不是 dns 名称。
proxy_pass http://<IP ADDRESS>:5016/;
如果您想为此位置使用与主机系统不同的 dns 服务器,您也可以使用解析器指令:
resolver 8.8.8.8;
包括以防止 Nginx 在您的站点关闭时崩溃,包括一个解析器指令,如下所示:
server {
listen 80;
server_name test.com;
location / {
resolver 8.8.8.8;
proxy_pass http://dev-exapmle.io:5016/;
proxy_redirect off;
...
警告!使用 public DNS 会在您的后端产生安全风险,因为您的 DNS 请求可能会被欺骗。如果这是一个问题,您应该将解析器指向安全的 DNS 服务器。
仅仅添加一个解析器并没有解决我的问题。但是我能够通过为主机使用变量来解决它。 另外,我想在 127.0.0.11(这是一个固定 IP)使用 Docker 的 DNS 更有意义。
示例:
server {
listen 80;
server_name test.com;
location / {
resolver 127.0.0.11;
set $example dev-example.io:5016;
proxy_pass http://$example;
}
}
我在 this page 上找到了变量解决方法。
使用 nginx plus 时,您也可以通过在上游添加一个区域来解决这个问题。在您的 proxypass 中使用此测试时。当服务器 some-server 开始解析时,它将开始向其传递流量。
确保如上所述,在配置的其他部分放置一个解析器。对于 docker,我使用 解析器 127.0.0.11 有效=1s;
upstream test {
zone test-zone 64k;
server some-server:1234 resolve;
}