DigitalOcean上Django+Gunicorn无论Debug设置均触发500错误
老兄,这种突然翻车的情况真的闹心——明明用了好几年的配置突然炸锅,全量500还不给正经错误日志,太折磨人了。结合你描述的现象,我给你列几个优先级最高的排查方向,都是我之前踩过的坑:
先锁定自定义500模板的加载问题
你提到Gunicorn只报模板目录的404,这大概率是关键线索。先确认你的500.html是不是在正确的位置:Django找自定义错误模板的规则是templates/[你的应用名]/500.html或者全局的templates/500.html。会不会是最近部署时误删了模板文件?或者权限出问题了?
可以用这个命令验证Gunicorn运行用户能不能访问模板:sudo -u [gunicorn运行用户,比如www-data] ls /path/to/你的项目/templates/500.html如果返回“No such file or directory”,那就是文件丢了或者路径错了;如果权限报错,就给目录加权限:
sudo chmod -R 755 /path/to/你的项目/templates。强制让Django输出详细错误日志,别等Gunicorn
既然Gunicorn没输出有用的错误,直接在Django的settings.py里配置独立的错误日志,把所有服务器端错误打到文件里:LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'django_error': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': '/var/log/django/prod_error.log', }, }, 'loggers': { 'django': { 'handlers': ['django_error'], 'level': 'ERROR', 'propagate': True, }, }, }先创建日志目录并给权限:
sudo mkdir /var/log/django && sudo chown [gunicorn运行用户]:[gunicorn运行用户] /var/log/django然后重启Gunicorn和Nginx,访问页面后去看这个日志,绝对能抓到真正的错误原因——500肯定是服务器端有问题,只是没打出来而已。
验证Django项目本身能不能正常运行
脱离Gunicorn,直接用Django自带的runserver测试(临时用,测试完立刻关掉):python manage.py runserver 0.0.0.0:8000然后直接访问服务器IP:8000,看看会不会弹出详细的错误栈。如果runserver也报500,那问题就在Django项目本身:比如最近有没有更新依赖?数据库连接是不是断了?可以进shell测试数据库:
python manage.py shell然后执行个简单查询:
from django.contrib.auth.models import User; User.objects.first(),如果报错,那就是数据库的问题(比如DigitalOcean的托管DB突然断开,或者账号权限变了)。检查Gunicorn的进程和配置
会不会是Gunicorn进程挂了或者配置被误改?先重启Gunicorn看看:sudo systemctl restart gunicorn然后看状态:
sudo systemctl status gunicorn,有没有启动失败的提示。另外检查Gunicorn配置文件里的chdir是不是正确的项目根目录,pythonpath是不是指向你的虚拟环境Python路径——有时候部署时不小心改了配置,自己都没注意到。
内容的提问来源于stack exchange,提问作者Dave Merwin

