You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动