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

持续出现502 Bad Gateway错误求助:Nginx配置相关问题

解决Nginx反向代理Django应用时的502 Bad Gateway错误

被502卡这么久确实头疼,我来帮你一步步拆解问题、修正配置:

1. 先修正配置里的明显语法/逻辑错误

错误点1:server_name格式错误

你写的server_name MYIP:8000;是错的——server_name只需要填你的公网IP(或域名),不需要加端口。Nginx监听的是80端口,8000是Gunicorn的服务端口,两者完全独立,不能混在server_name里。

错误点2:proxy_pass缺少协议前缀

你写的proxy_pass MYIP:8000;漏了http://,Nginx无法正确识别代理地址,这会直接触发502错误,必须改成proxy_pass http://MYIP:8000;(更推荐用http://127.0.0.1:8000,本地回环更安全)。

错误点3:缺失静态/媒体文件的直接处理

课程里的gist专门配置了/static//media/的路由,这部分请求应该由Nginx直接返回,不需要转发给Gunicorn——否则不仅可能导致静态资源加载失败,还会浪费Gunicorn的资源。

2. 根据Gunicorn运行方式,选择对应配置

情况A:Gunicorn用端口监听(比如8000)

如果你的Gunicorn是通过gunicorn --bind 0.0.0.0:8000 yourproject.wsgi:application启动的,用下面的配置:

listen 80;
server_name 你的公网IP;

# 关闭favicon的日志记录
location = /favicon.ico { access_log off; log_not_found off; }

# 静态文件直接由Nginx返回
location /static/ {
    root /home/myname_is/pyapps/Profile-Badges;
}

# 媒体文件直接由Nginx返回
location /media/ {
    root /home/myname_is/pyapps/Profile-Badges;
}

# 动态请求转发给Gunicorn
location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
}

情况B:Gunicorn用Unix Socket(和课程一致)

如果你的Gunicorn是通过gunicorn --bind unix:/run/gunicorn.sock yourproject.wsgi:application启动的,用类似课程的配置:

listen 80;
server_name 你的公网IP;

location = /favicon.ico { access_log off; log_not_found off; }

location /static/ {
    root /home/myname_is/pyapps/Profile-Badges;
}

location /media/ {
    root /home/myname_is/pyapps/Profile-Badges;
}

location / {
    include proxy_params;
    proxy_pass http://unix:/run/gunicorn.sock;
}

⚠️ 这种情况要注意权限问题:Nginx的运行用户(通常是www-data)需要能访问/run/gunicorn.sock文件。可以把你的用户加入www-data组:

sudo usermod -aG www-data myname_is

或者启动Gunicorn时指定socket权限:

gunicorn --bind unix:/run/gunicorn.sock --umask 007 yourproject.wsgi:application

3. 必做的排查步骤

  1. 确认Gunicorn是否正常运行
    执行ps aux | grep gunicorn,查看是否有Gunicorn进程。如果没有,先启动Gunicorn,建议用systemd管理它,避免终端关闭后进程退出。
  2. 测试Gunicorn服务可用性
    • 端口方式:curl http://127.0.0.1:8000,如果能返回Django页面内容,说明Gunicorn本身没问题。
    • Socket方式:curl --unix-socket /run/gunicorn.sock http://localhost,同样检查是否返回正常内容。
  3. 验证Nginx配置语法
    执行sudo nginx -t,如果提示test is successful,再重启Nginx:sudo systemctl restart nginx
  4. 查看Nginx错误日志
    执行sudo tail -f /var/log/nginx/error.log,日志会明确显示502的原因——比如连接被拒绝(Gunicorn没运行/端口不对)、权限不足(socket访问失败)等,根据日志针对性解决即可。

内容的提问来源于stack exchange,提问作者Rudolph Musngi

火山引擎 最新活动