【问题标题】:502 Bad Gateway when using reverse proxy with Docker and Nginx在 Docker 和 Nginx 中使用反向代理时出现 502 Bad Gateway
【发布时间】:2021-05-07 10:49:34
【问题描述】:

我已经在 StackOverflow 上搜索了我的问题,但我似乎总是使用我的 Nginx Docker 配置访问502 Bad Gateway。我正在尝试使用我的域mydomain.com/pgadmin 而不是mydomain.com:8060 访问pgadmin4,其中8060 是它的docker 容器公开的端口。我的docker-compose.yml 文件如下所示:

version: '3.5'

services:
  reverse-proxy:
    image: nginx:1.19.6
    restart: always
    ports:
      - "80:80"
      - "443:443"
        
  postgres:
    image: postgres:12
    ports:
      - "5432:5432"
        
  pgadmin:
    image: dpage/pgadmin4
    depends_on:
      - postgres
    ports:
      - "8060:80"
      
networks:
  default:
    external:
      name: defaultnetwork

我的 nginx 容器的default.conf 文件如下所示:

upstream pgadmin {
    server 127.0.0.1:8060;
}

server {
    listen       80;
    listen  [::]:80;
    server_name  mydomain.com;
    
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    
    location /pgadmin {
        proxy_pass http://pgadmin;
    } 
}

使用此配置,我不断收到502 Bad Gateway 错误。有人可以指出我哪里出错了。我真的很感激。

谢谢。

[编辑] 这是来自 docker 日志:

2021/02/03 08:07:42 [error] 23#23: *2 connect() failed (111: Connection refused) while connecting to upstream, client: ***.***.***.***, server: mydomain.com, request: "GET /pgadmin HTTP/1.1", upstream: "http://127.0.0.1:8082/pgadmin", host: "mydomain.com"

【问题讨论】:

    标签: docker nginx docker-compose nginx-reverse-proxy


    【解决方案1】:

    502问题来自这里的环回IP:

    上游 pgadmin { 服务器 127.0.0.1:8060; }

    NGINX 容器的127.0.0.1localhost 是 NGINX 容器本身。您应该改用服务的名称:

    upstream pgadmin {
        server pgadmin:8060;
    }
    

    服务名称来自docker-compose.yml:

    services:
      pgadmin: # <- this
        image: dpage/pgadmin4
    

    如果您在这些更改后点击 404,这是因为您必须更改应用程序的基本路径。尝试使用此配置:

        location /pgadmin/ {
            proxy_set_header X-Script-Name /pgadmin;
            proxy_set_header Host $host;
            proxy_pass http://pgadmin;
            proxy_redirect off;
        }
    

    【讨论】:

    • 感谢@anemyte。我又近了一步。从日志中我可以看到 nginx 正确解析了容器的 IP 地址。但是请求看起来像这样:GET /pgadmin HTTP/1.1", upstream: "http://172.18.0.6:8082/pgadmin 而不是这样:GET /pgadmin HTTP/1.1", upstream: "http://172.18.0.6:8082。我该如何解决这个问题?
    • @realnsleo 默认情况下它在端口 80 上工作,因此除非您在 pgadmin 配置中更改它,否则不应指定端口。那只是 proxy_pass http://pgadmin 和以前一样。
    • 啊!是的。对不起。我已从 docker-compose.yml 文件中删除了端口,现在出现 404 错误。有什么想法吗?
    • @realnsleo 我已经设法在网络存档中找到了解决方案。我会更新答案。
    • @anemyte 非常感谢!
    【解决方案2】:

    由于您的容器在同一个网络中工作,您应该通过 Nginx 容器的第 80 个端口访问 Pgadmin 容器。

    您应该在 Nginx 配置中将这一行 server 127.0.0.1:8060 替换为 server pgadmin:80

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2020-10-24
      • 2016-10-23
      • 2015-11-02
      • 2018-05-23
      • 2020-08-01
      相关资源
      最近更新 更多