You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:application
      
      同时检查项目根目录下的wsgi.py,确保它能根据环境变量加载正确的settings:
      import os
      from django.core.wsgi import get_wsgi_application
      
      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.production')
      application = get_wsgi_application()
      
  • 检查BASE_DIR路径配置是否正确
    你提到修改了base.py的项目根路径,生产环境的服务器路径和本地肯定不一样,硬写绝对路径会直接出错。

    • 排查方式:在生产服务器上运行命令:
      python manage.py shell --settings=myproject.production
      
      然后输入from 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错误日志(如果开启)是否有静态文件相关报错。
    • 修复方法:
      1. 在production.py中配置静态文件根目录:
        DEBUG = False
        STATIC_ROOT = BASE_DIR / 'staticfiles'
        STATIC_URL = '/static/'
        
      2. 在生产服务器上运行收集命令:
        python manage.py collectstatic --settings=myproject.production
        
      3. 在Nginx配置文件中添加静态文件路由:
        location /static/ {
            alias /home/deploy/myproject/staticfiles/; # 替换成你的STATIC_ROOT绝对路径
        }
        
  • 排查文件与目录权限
    这是生产环境最容易忽略的点: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
      
  • 检查数据库配置正确性
    生产环境的数据库通常和本地不同(比如本地用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文件,里面会有具体的错误信息,这是最直接的排查依据。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:11:09