【问题标题】:Docker Nginx stopped: [emerg] 1#1: host not found in upstreamDocker Nginx 停止:[emerg] 1#1:在上游找不到主机
【发布时间】:2017-07-31 22:19:20
【问题描述】:

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

任何解决此问题的建议将不胜感激。

【问题讨论】:

  • 这通常有两个原因:dev-exapmle.io:5016 中的服务已关闭或未响应请求;或者你有一些 selinux 配置阻止 nginx 代理请求。我会查看为 dev-example.io 提供服务的应用程序的日志。如果您没有看到任何内容,则可能是 selinux 问题,在这种情况下,您可能想看看这个答案:stackoverflow.com/questions/27435655/…
  • @JoséAntonioHaroPeralta 感谢您的评论。是的,该服务 dev-exapmle.io:5016 已关闭。但是我的 nginx 配置文件中有许多其他服务可以工作,但是由于这个服务,nginx 停止了。有什么办法可以解决吗?
  • 包含一个解析器指令(例如指向 google,8.8.8.8)。如果 Nginx 无法访问您的站点,它将解决该问题,如以下问题的答案所示:stackoverflow.com/questions/32845674/…

标签: nginx docker amazon-ecs


【解决方案1】:

仅添加解析器并不能解决我的问题。但是我能够通过为主机使用变量来解决它。 另外,我想在 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;
  }
}

我在this page 上找到了变量解决方法。

【讨论】:

  • 正确的语法是:set $example "dev-example.io:5016";proxy_pass http://$example;
  • @jozo 没有帮助,在我的设置中返回 502。
  • 效果很好。在使用Docker的情况下:1)echo "resolver 127.0.0.11 valid=60s;" > ./conf.d/resolvers.conf 2)docker-compose.yml:volumes: - ./conf.d/resolvers.conf:/etc/nginx/conf.d/resolvers.conf
【解决方案2】:

包含以防止 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.1 怎么办?如果服务器再次可以访问,它会路由正确的路径吗?
  • 嗨,大概这只是增加了另一个 DNS 解析端点。就我而言,DNS 地址已被删除,无法在任何地方解析。有没有办法让 nginx 简单地将页面视为关闭而不是崩溃整个实例?
  • 对于像我这样的所有复制粘贴者,缺少分号解析器 8.8.8.8;
【解决方案3】:

这通常意味着您作为上游服务器提供的 dns 名称无法解析。要测试它,请登录 nginx 服务器并尝试 ping 提供的上游服务器并查看名称解析是否正确完成,如果它是 docker 容器尝试docker exec -it 获取 shell,然后尝试 ping 上游以测试名称解析。如果 contianer 停止,请尝试在您的服务器块中使用 IP 地址而不是 dns 名称。

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

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

resolver 8.8.8.8;

【讨论】:

  • 没有IP地址,我有dns是Docker-Cloud服务的end-url
  • 调出一个默认配置的 nginx 容器,然后尝试 ping dns 以查看解析是否正确。
  • 谢谢。然后我改用解析器。但如果我使用解析器 127.0.0.1;它也能正常工作吗?如果 DNS 稍后开始工作会发生什么?也不需要valid=30s; ?
  • resolver 127.0.0.1 表示您在 localhost 上运行 dns 服务器,是吗?当 dns 服务器修复后,删除解析器行。有效 30s 表示不重新查询 30s 使用现有值。
  • 没有办法自动完成吗?当它关闭时使用解析器,当它再次启动时使用 DNS。只能使用脚本自动完成吗?
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 2019-07-11
    • 2020-12-22
    • 1970-01-01
    • 2020-07-08
    • 2018-03-03
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多