使用Docker+Nginx反向代理时出现502 Bad Gateway问题求助
嘿,我帮你拆解几个核心排查方向,毕竟IP访问正常、域名访问502,大概率是域名解析后的流量路径出了问题:
1. 先查Nginx配置里的上游服务地址
这是最常见的坑:
- 如果你在Nginx的
proxy_pass里写的是localhost或者宿主机IP,那在Docker容器里的localhost指的是容器本身,不是宿主机!这时候得换成宿主机的内部局域网IP(比如192.168.x.x),或者用Docker专属的host.docker.internal(针对Docker Desktop环境)。 - 要是你用Docker Compose的服务名(比如
laravel-project1)作为上游地址,得确保Nginx容器和Laravel容器在同一个Docker网络里——Docker Compose默认会给同配置文件里的服务创建专属网络,要是你是分开的配置文件,就得手动指定共享网络。
2. 验证/etc/hosts的解析是否真的生效
先跑个命令确认域名指向对不对:
ping your-domain.local
如果返回的不是你预期的服务器IP(比如127.0.0.1或者公网IP),那先修正/etc/hosts的配置,别在这一步栽跟头。
3. 检查Laravel容器的状态和连通性
先确认Laravel服务是不是真的在跑:
docker-compose ps
看服务的State是不是Up,Ports里的映射有没有问题(比如8000/tcp或者9000/tcp)。
接着可以钻进Nginx容器,试试ping Laravel的服务名,看网络通不通:
docker exec -it 你的Nginx容器名 ping laravel服务名
如果ping不通,那就是Docker网络的问题,要么是网络没共享,要么是服务名写错了。
4. 扒日志找线索!
502的本质是Nginx连不上后端服务,日志能直接告诉你原因:
- 看Nginx的错误日志:
docker-compose logs web
如果日志里有connect() failed (111: Connection refused),那就是Nginx找不到后端服务,要么地址错了,要么Laravel没启动成功。
- 再看Laravel容器的日志,确认服务本身有没有报错:
docker-compose logs 你的Laravel服务名
比如依赖缺失、端口被占用、FPM没正常启动之类的,都可能导致后端不可用。
5. 检查Laravel的监听地址
要是Laravel用的是内置服务器或者FPM,得确保监听的是0.0.0.0,而不是127.0.0.1!后者只能在容器内部访问,外部(包括Nginx容器)根本连不上。比如FPM的www.conf里,listen得设成0.0.0.0:9000才行。
另外你提到是多个Laravel项目,别忘了Nginx里要给每个域名配置对应的上游服务,比如:
server { server_name project1.local; location / { proxy_pass http://project1-app:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { server_name project2.local; location / { proxy_pass http://project2-app:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
要保证每个域名对应的上游服务名和docker-compose.yml里的服务名完全一致。
如果能把完整的docker-compose.yml和Nginx配置贴出来,能更快定位问题,但先按上面的步骤排查,应该能找到症结~
内容的提问来源于stack exchange,提问作者user25758

