如何解决Docker nginx 反向代理错误 - 502 错误网关 - 连接被拒绝
我在 Docker 上使用我的 NGINX 反向代理时遇到问题。 当我访问:
- local.lab - NGINX 以预期的 index.html 页面响应
- 127.0.0.1:2000 或 127.0.0.1:2001 或 127.0.0.1:2002 - 服务正常,我得到了预期的结果
- 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"
我尝试将 network_mode: host
添加到 docker compose 中的 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;
}
}
}
我该如何解决这个问题?
解决方法
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。