Docker nginx 反向代理错误 - 502 错误网关 - 连接被拒绝

Docker nginx reverse proxy error - 502 bad gateway - connection refused

我在 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 撰写:

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;
            }
    }
 }

我该如何解决这个问题?

NGINX 中的反向代理配置应引用服务的内部端口,而不是它们在 docker-compose.yml 中映射到的外部端口。这些服务在不同的容器中都有不同的名称 运行ning,因此它们可以 运行 在同一端口(在本例中为 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;
}