【问题标题】:Docker nginx reverse proxy gives "502 Bad Gateway"Docker nginx 反向代理给出“502 Bad Gateway”
【发布时间】:2018-04-15 22:12:03
【问题描述】:

我正在尝试使用带有 nginx 的 docker 容器作为其他 docker 容器的反向代理,并且在基本位置 '/' 以外的位置上不断收到“错误网关”。

我有以下服务器块:

server {

  listen 80;

  location / {
    proxy_pass "http://game2048:8080";
  }

  location /game {
    proxy_pass "http://game:9999";
  }

}

它适用于http://localhost,但不适用于http://localhost/game,它在浏览器中给出“Bad Gateway”,而这在 nginx 容器上:

[error] 7#7: *6 connect() failed (111: Connection refused) 
while connecting to upstream, client: 172.17.0.1, server: , 
request: "GET /game HTTP/1.1", upstream: "http://172.17.0.4:9999/game", 
host: "localhost"

我使用了官方的 nginx docker 镜像,并在上面放了我自己的配置。您可以对其进行测试并在此处查看所有详细信息: https://github.com/jollege/ngprox1

有什么想法吗?

注意:我在 docker 主机上设置了本地主机名条目以匹配这些名称:

127.0.1.1       game2048
127.0.1.1       game

【问题讨论】:

  • 现在我贴出来,我看到路径“游戏”被传递到上游服务器,那部分不应该被传递。任何想法如何处理?顺便说一句,在我想使用它的场景中,我希望它根据传入的服务器名称/http 标头代理到不同的服务。
  • 我使用了错误的端口。

标签: docker nginx proxy


【解决方案1】:

我修好了!我在 nginx 配置中的不同服务器块中设置了服务器名称。请记住使用 docker 端口,而不是主机端口。

server {

  listen 80;
  server_name game2048;

  location / {
    proxy_pass "http://game2048:8080";
  }

}

server {

  listen 80;
  server_name game;

  location / {
    # Remember to refer to docker port, not host port
    # which is 9999 in this case:
    proxy_pass "http://game:8080";
  }

}

github 存储库已更新以反映修复,旧的自述文件位于 ./README.old01.md 下。

当我仔细地向别人提出问题时,我通常会找到答案。你知道那种感觉吗?

【讨论】:

  • Stackoverflow 非常适合 rubber duck debugging :)
  • 确实!我以前没听过这个词——但是伙计,我知道这个概念吗!
  • "请记住使用 docker 端口,而不是主机端口。"救了我。谢谢。
  • 哈哈,伙计们……这对我也有效,我知道什么是橡皮鸭调试:-D
【解决方案2】:

对我来说帮助了这行代码proxy_set_header Host $http_host;

location / {
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header Host $http_host;
   proxy_set_header X-NginX-Proxy true;

   proxy_redirect off;
   proxy_pass http://myserver;
}

【讨论】:

    【解决方案3】:

    我遇到了同样的错误,但是对于一个 Web 应用程序,它没有在配置中提到的 IP 和端口上提供服务。

    所以说你有这个:

    location /game {
        proxy_pass "http://game:9999";
    }
    

    然后确保您期望在 http://game:9999 上的 Web 应用程序确实在名为“game”的 docker 容器中提供服务,并且代码设置为在端口 9999 处为应用程序提供服务。

    【讨论】:

      【解决方案4】:

      我遇到了同样的“502 Bad Gateway”错误,但解决方案是按照this post 说明调整 proxy_buffer_size:

      proxy_buffering off;
      proxy_buffer_size 16k;
      proxy_busy_buffers_size 24k;
      proxy_buffers 64 4k;
      

      【讨论】:

      • 如何使用 docker 镜像来做到这一点?
      • 这正是解决我使用反向代理 nginx 的所有问题的原因!非常感谢!
      【解决方案5】:

      就我而言,4 小时后,只有我错过了使用 semanage 命令放置端口。

       location / {
                  proxy_pass http://A.B.C.D:8090/test;
        }
      

      解决方案是添加 8090 端口并正常工作。

      semanage port -a -t http_port_t  -p tcp 8090
      

      【讨论】:

        猜你喜欢
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 2021-05-07
        • 2019-07-09
        • 2017-12-30
        • 2020-08-01
        • 1970-01-01
        相关资源
        最近更新 更多