Nginx:显示解决“已停止:[emerg] 1#1:在上游找不到主机”?

问题描述 投票:0回答:6

我正在 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。有什么办法可以解决吗

nginx docker amazon-ecs
6个回答
84
投票

仅添加解析器并不能解决我的问题。但我可以通过使用主机变量来解决这个问题。 另外,我想使用 Docker 的 DNS 127.0.0.11(这是一个固定 IP)更有意义。

示例:

server {
  listen 80;
  server_name test.com;
  
  location / {
    resolver 127.0.0.11;
    set $example dev-example.io:5016;
    proxy_pass http://$example;
  }
}

我在此页面上找到了变量解决方法。


19
投票

为了防止 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 服务器。


3
投票

这通常意味着您作为上游服务器提供的 DNS 名称无法解析。要测试它,请登录 nginx 服务器并尝试 ping 提供的上游服务器,看看名称解析是否正确完成,如果它是 docker 容器,请尝试

docker exec -it
获取 shell,然后尝试 ping 上游以测试名称解析。如果容器停止,请尝试在服务器块中使用 IP 地址而不是 dns 名称。

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

如果您想在该位置使用与主机系统不同的 dns 服务器,您也可以使用解析器指令:

resolver 8.8.8.8;

1
投票

我也遇到了同样的问题:

    location /radio/antena/ {
        proxy_pass http://antenaradio.rs:4550;
    }

包含带有

resolver
指令的变量可以解决所有问题:

    location /radio/antena/ {
        resolver 8.8.8.8;
        set $my_stream_1 antenaradio.rs:4550;
        proxy_pass http://$my_stream_1;
    }

顺便说一句,我的服务器是 NGINX/1.23.2,运行在 Android ARMv7 上:)


0
投票

找不到上游表示本地无法解析该域名。

将上游配置添加到您的配置文件中。不需要解析器,直接提供IP即可。

upstream dev-example.io {

    server 127.0.0.1:5016;
}

0
投票

使用 nginx plus 时,您也可以通过使用解析向上游添加一个区域来解决这个问题。在您的 proxypass 中使用此测试时。当服务器 some-server 开始解析时,它将开始向其传递流量。

确保如上所述,将解析器放在配置的其他部分。对于码头工人,我使用 解析器127.0.0.11有效=1秒;

upstream test {
        zone test-zone 64k;
        server some-server:1234 resolve;
}

作为替代方案,您可能需要查看 jwilder/nginx-proxy,它可以自动确定反向代理的上游 docker 容器。当容器启动和停止时,它会动态生成配置文件。

© www.soinside.com 2019 - 2024. All rights reserved.