【问题标题】:Docker nginx reverse proxy error - 502 bad gateway - connection refusedDocker nginx 反向代理错误 - 502 网关错误 - 连接被拒绝
【发布时间】:2021-05-28 03:58:52
【问题描述】:

我在 Docker 上使用 NGINX 反向代理时遇到问题。 当我访问时:

  1. local.lab - NGINX 响应预期的 index.html 页面
  2. 127.0.0.1:2000 或 127.0.0.1:2001 或 127.0.0.1:2002 - 服务有效,我得到了预期的结果
  3. local.lab/a1 或 local.lab/a2 或 local.lab/a3 - 我收到“502 Bad Gateway”错误。 来自 nginx 日志的详细错误: 2021/02/25 18:20:48 [error] 30#30: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: local.lab, request: "GET /a2 HTTP/2.0", upstream: "http://127.0.0.1:2006/", host: "www.local.lab"

我尝试在 docker compose 中将network_mode: host 添加到 nginx 服务,但没有成功。

我正在使用 docker compose:

version: '3.7'

services:
nginx:
container_name: lab-nginx
image: nginx:latest
restart: always
depends_on:
  - http1
  - http2
  - http3
volumes:
  - ./html:/usr/share/nginx/html/
  - ./nginx.conf:/etc/nginx/nginx.conf
  - ./error_log/error.log:/var/log/nginx/error.log
  - ./cert:/var/log/nginx/cert/
ports:
  - 80:80
  - 443:443
http1:
container_name: lab-http1
image: httpd:latest
restart: always
#    build:
#      context: ./apache_service
ports:
  - 2000:80
  - 2005:443
volumes:
  - ./apache/index1.html:/usr/local/apache2/htdocs/index.html
http2:
container_name: lab-http2
image: httpd:latest
restart: always
ports:
  - 2001:80
  - 2006:443
volumes:
  - ./apache/index2.html:/usr/local/apache2/htdocs/index.html
http3:
container_name: lab-http3
image: httpd:latest
restart: always
ports:
  - 2002:80
  - 2007:443
volumes:
  - ./apache/index3.html:/usr/local/apache2/htdocs/index.html

我的 nginx 配置:

 worker_processes auto;
 events { worker_connections  1024;}
   error_log /var/log/nginx/error.log error;

    http{
    server {
        listen 443 ssl http2;

        server_name local.lab;

        ssl_certificate /var/log/nginx/cert/local.lab.crt;
        ssl_certificate_key /var/log/nginx/cert/local.lab.key;
        ssl_protocols TLSv1.3;

            location / {
                root /usr/share/nginx/html;
                index index.html;
            }

            location /a1 {
                proxy_pass http://127.0.0.1:2000/;
                proxy_set_header X-Forwarded-For $remote_addr;
            }
            location /a2 {
                proxy_pass http://127.0.0.1:2001/;
                proxy_set_header X-Forwarded-For $remote_addr;
            }
            location /a3 {
                proxy_pass http://127.0.0.1:2002/;
                proxy_set_header X-Forwarded-For $remote_addr;
            }
    }
 }

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    NGINX 中的反向代理配置应该引用服务的内部端口,而不是它们在 docker-compose.yml 中映射到的外部端口。这些服务都有不同的名称在不同的容器中运行,因此它们可以在同一个端口(在本例中为 80)上运行并使用服务名称,而不是环回地址。但是,您需要将它们映射到外部的不同端口,因为您的主机上的每个端口不能有多个服务。

    例如:

    location /a1 {
        proxy_pass http://http1:80/;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    
    location /a2 {
        proxy_pass http://http2:80/;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    
    location /a3 {
        proxy_pass http://http3:80/;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    

    【讨论】:

    • 如果我想 proxy_pass localhost:2019 (独立于当前 docker-compose 文件的新服务)我需要改变什么?
    • 发布一个新问题可能会很好......如果它实际上在 localhost 上运行,那么您需要设置主机路由,否则只需使用 proxy_pass 配置中的 service_name:internal_port 即可。跨度>
    • 感谢您的回答!
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 2014-02-07
    • 2017-02-03
    • 1970-01-01
    • 2020-09-21
    • 2016-08-12
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多