使用Docker部署NGINX+Gunicorn运行Django应用时出现502错误
解决Docker部署Django+Gunicorn+Nginx的502 Bad Gateway问题
嘿,看了你遇到的502错误,本质是Nginx没法成功连接到你的Gunicorn后端服务。结合你贴的配置,我发现几个关键问题,咱们一步步排查修复:
1. 先干掉Nginx配置里的致命坑
你的Nginx配置里这段代码绝对是问题根源之一:
if (!-f $request_filename) { proxy_pass http://127.0.0.1; break; }
当请求的静态文件不存在时,这段配置会让Nginx把请求转发到自身容器的127.0.0.1——但你的Gunicorn明明在webapp容器里啊!这可不就直接502了嘛。直接删掉这段if代码,你的location /块改成这样就好:
location / { proxy_pass http://myapp_server; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; }
2. 确认Gunicorn真的在正常运行
接下来得检查你的Gunicorn服务有没有在webapp容器里成功启动:
- 先进入webapp容器:
docker-compose exec webapp bash - 看看Gunicorn进程是否存在:
ps aux | grep gunicorn,如果看不到相关进程,说明启动失败了 - 再看你Dockerfile里的启动命令:
gunicorn -c config/gunicorn/conf.py --bind :8000 --chdir myapp myapp.wsgi:application
这里要注意项目结构:你的工作目录是/opt/services/webapp/src,--chdir myapp意味着Gunicorn会切换到src/myapp目录下找myapp.wsgi:application,那你的项目里必须有src/myapp/myapp/wsgi.py这个文件才行。如果你的wsgi.py是在src/myapp/wsgi.py(也就是项目根目录),那要么去掉--chdir myapp,要么把启动命令改成gunicorn -c config/gunicorn/conf.py --bind :8000 --chdir /opt/services/webapp/src myapp.wsgi:application。
3. 验证容器间的网络连通性
确认Nginx能访问到webapp容器:
- 进入Nginx容器:
docker-compose exec nginx bash - 先ping一下webapp:
ping webapp,如果能ping通,说明网络没问题;如果ping不通,检查一下你的nginx_network是否正常创建:docker network ls,再看看webapp容器有没有加入这个网络:docker inspect webapp | grep Networks
4. 一定要看Gunicorn的启动日志
你只贴了Nginx的日志,但Gunicorn的日志才是定位启动失败的关键——比如有没有找不到wsgi文件、依赖缺失、数据库连不上的问题。执行这个命令看日志:
docker-compose logs webapp
如果看到类似ModuleNotFoundError: No module named 'myapp.wsgi'的错误,那就是路径配置错了,调整Gunicorn的--chdir参数或者wsgi路径就好。
额外小提示:数据库就绪问题
虽然depends_on会让webapp在db之后启动,但Postgres可能还没完全准备好就被webapp连接,导致Gunicorn启动失败。你可以在webapp的启动命令前加个等待脚本,比如用wait-for-it工具,确保数据库能正常连接后再启动Gunicorn。
内容的提问来源于stack exchange,提问作者Denisse




