NGINX+USWGI部署Django应用出现502 Bad Gateway错误排查求助
问题根本原因
- Nginx容器和Django(web)容器属于两个独立的网络命名空间,
my_nginx.conf中配置的上游地址127.0.0.1:8888指向的是Nginx容器自身的本地回环地址,而非web容器的地址,所以无法建立连接。 - uWSGI配置中socket绑定的是
127.0.0.1:8888,仅允许web容器内部的进程访问,外部容器无法连接到该端口。
修复步骤
1. 修改uWSGI配置(uwsgi.ini)
将socket绑定地址从127.0.0.1:8888改为0.0.0.0:8888,允许其他容器访问web容器的uWSGI端口:
[uwsgi] wsgi-file = /app/blindspot/wsgi.py socket = 0.0.0.0:8888 master=true processes = 4 threads = 2 module = blindspot.wsgi:application vacuum=true
2. 修改Nginx上游配置(my_nginx.conf)
Docker Compose会自动为服务创建内部DNS解析,直接用web服务的名称web作为上游地址即可,端口保持8888:
upstream blindspot { server web:8888; #server unix:/app/app.sock; # for a file socket }
3. 重启容器生效
执行以下命令重建容器:
docker-compose down docker-compose up --build
可选优化方案
如果不想用端口通信,也可以用unix套接字实现更高效的通信,操作如下:
- 在uwsgi.ini中把socket配置改为
unix:/app/app.sock,同时添加chmod-socket = 666配置保证Nginx有权限访问套接字文件 - 在my_nginx.conf中启用unix套接字的上游配置即可
- 注意两个容器要共享挂载
/app目录或者专门的套接字存储卷,保证双方都能访问到套接字文件
内容的提问来源于stack exchange,提问作者Michael McDermott
相关产品推荐
相关产品推荐

