Gunicorn+Nginx部署出现500错误,无法访问网页排查
Gunicorn+Nginx 500错误排查方案
1. 先解决套接字文件的核心问题
- 核对Gunicorn启动参数和Nginx配置里的套接字路径,必须完全一致(比如
/tmp/myapp.sock不能写成/run/myapp.sock)。 - 检查套接字权限:用
ls -l /path/to/socket.sock查看,确保Nginx运行用户(通常是www-data)对该文件有读写权限。启动Gunicorn时可加--umask 007让同组用户获得权限,或者把Gunicorn和Nginx加入同一用户组。 - 如果用systemd管理Gunicorn,确认服务配置里的套接字目录存在且权限正确,避免启动时无法创建套接字。
2. 聚焦视图层的内部错误(关键)
既然Gunicorn已经处理到视图层,500错误是Web框架(比如Django)的内部异常,和Nginx转发无关:
- 查看Django的错误日志(默认在
logs/目录,或Gunicorn的stderr日志),里面会有完整的异常栈,直接定位问题(比如数据库连接失败、模板缺失、环境变量未配置)。 - 对比
runserver和Gunicorn的运行环境:- 生产环境下
DEBUG=False时,ALLOWED_HOSTS必须正确配置,否则请求会被拒绝。 - 静态资源未执行
python manage.py collectstatic,导致模板引用的静态文件404,进而引发页面渲染错误。 - 生产环境的数据库配置(用户名、密码、主机)可能和开发环境不一致,导致视图查询数据库失败。
- 生产环境下
3. 检查Gunicorn worker运行状态
- 用
ps aux | grep gunicorn确认所有13个worker都在正常运行,有没有进程意外退出。 - worker数量建议设置为
2*CPU核心数+1,如果13个远超服务器核心数,会导致资源竞争,引发超时或错误,可先减少worker数测试。 - 调整Gunicorn超时参数(比如
--timeout 30),如果视图处理时间过长,会触发超时导致500错误。
4. 验证Nginx转发配置
- 确保Nginx配置里的请求头设置正确,避免Django无法识别请求:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - 修改Nginx配置后,用
nginx -t验证语法,再重启Nginx生效。
内容的提问来源于stack exchange,提问作者Alvar
相关产品推荐
相关产品推荐

