Django多环境配置异常:本地正常生产环境报内部服务器错误
排查Django多环境配置生产环境500错误的步骤
这种拆分多环境配置后本地跑的顺畅,一上生产就报内部服务器错误的场景,我碰到过太多次了!十有八九是配置加载异常、路径错误、权限问题或者静态文件配置缺失导致的,咱们一步步来定位:
确认uWSGI是否正确加载production.py配置
拆分settings后,默认的settings模块路径变了,uWSGI必须明确指定加载production配置。- 排查方式:查看uWSGI的运行日志,搜索关键词
settings module,确认加载的是你的项目名.production而非默认的(如果没指定,uWSGI会找根目录的settings.py,而你已经删掉了,这会直接报错) - 修复方法:在uWSGI配置文件(比如
uwsgi.ini)中添加:
同时检查项目根目录下的env = DJANGO_SETTINGS_MODULE=myproject.production module = myproject.wsgi:applicationwsgi.py,确保它能根据环境变量加载正确的settings:import os from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.production') application = get_wsgi_application()
- 排查方式:查看uWSGI的运行日志,搜索关键词
检查BASE_DIR路径配置是否正确
你提到修改了base.py的项目根路径,生产环境的服务器路径和本地肯定不一样,硬写绝对路径会直接出错。- 排查方式:在生产服务器上运行命令:
然后输入python manage.py shell --settings=myproject.productionfrom django.conf import settings; print(settings.BASE_DIR),看输出的路径是否是你的项目根目录。 - 修复方法:在base.py中用动态方式获取BASE_DIR,避免写死路径:
from pathlib import Path # 假设你的项目结构是:myproject/ -> myproject/ -> settings/ -> base.py BASE_DIR = Path(__file__).resolve().parent.parent.parent
- 排查方式:在生产服务器上运行命令:
验证静态文件配置与收集
Django生产环境不会自动托管静态文件,必须手动收集并配置Nginx转发。- 排查方式:查看Nginx的access日志,是否有静态文件的404请求;或者检查Django错误日志(如果开启)是否有静态文件相关报错。
- 修复方法:
- 在production.py中配置静态文件根目录:
DEBUG = False STATIC_ROOT = BASE_DIR / 'staticfiles' STATIC_URL = '/static/' - 在生产服务器上运行收集命令:
python manage.py collectstatic --settings=myproject.production - 在Nginx配置文件中添加静态文件路由:
location /static/ { alias /home/deploy/myproject/staticfiles/; # 替换成你的STATIC_ROOT绝对路径 }
- 在production.py中配置静态文件根目录:
排查文件与目录权限
这是生产环境最容易忽略的点:uWSGI运行的用户(比如www-data或部署用户)没有权限读取项目文件、写入日志或媒体目录。- 排查方式:查看uWSGI的错误日志,是否有
Permission denied的报错信息。 - 修复方法:给项目目录设置正确的权限:
# 替换deploy和www-data为你的运行用户和用户组 sudo chown -R deploy:www-data /home/deploy/myproject sudo chmod -R 755 /home/deploy/myproject # 如果有媒体文件目录,设置可写权限 sudo chmod -R 775 /home/deploy/myproject/media
- 排查方式:查看uWSGI的错误日志,是否有
检查数据库配置正确性
生产环境的数据库通常和本地不同(比如本地用SQLite,生产用PostgreSQL),如果配置不匹配会导致连接失败触发500错误。- 排查方式:在生产服务器上运行命令检查数据库连接:
看是否有数据库相关的错误提示。python manage.py check --settings=myproject.production - 修复方法:确保production.py中的DATABASES配置与生产环境一致,比如:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'my_prod_db', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'localhost', 'PORT': '5432', } }
- 排查方式:在生产服务器上运行命令检查数据库连接:
开启Django错误日志捕获详细异常
当DEBUG=False时,Django不会在页面显示详细错误,必须通过日志来查看具体报错栈。- 修复方法:在production.py中添加日志配置:
之后查看LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': BASE_DIR / 'django_prod_errors.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': True, }, }, }django_prod_errors.log文件,里面会有具体的错误信息,这是最直接的排查依据。
- 修复方法:在production.py中添加日志配置:
内容的提问来源于stack exchange,提问作者Jekson
相关产品推荐
相关产品推荐

