Docker nginx反向代理提供" 502 Bad Gateway"

时间:2017-11-03 08:28:50

标签: docker nginx proxy

我试图让一个带有nginx的docker容器作为其他docker容器的反向代理工作,并且我一直在使用" Bad Gateway"在基本位置以外的其他位置' /'。

我有以下服务器块:

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

5 个答案:

答案 0 :(得分:8)

我修好了!我在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 repo已更新以反映修复,旧的自述文件位于./README.old01.md下。

当我仔细地将问题写给别人时,我找到了答案。你知道那种感觉吗?

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

对我来说,这行代码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 :(得分:0)

我有同样的错误,但是对于一个Web应用程序,它只是无法在配置中提到的IP和端口上使用。

所以说你有这个:

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

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

答案 4 :(得分:0)

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

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

解决方案是添加 8090 端口并有效。

semanage port -a -t http_port_t  -p tcp 8090