Django Apache mod_wsgi部署报内部服务器错误及后台样式异常
Django Apache部署故障排查指南
部署完成初期运行正常,后续出现admin后台无CSS样式、指定URL访问返回500错误,日志抛出RuntimeError: populate() isn't reentrant的问题,按以下步骤排查修复,无需修改默认生成的wsgi.py文件。
一、500错误(对应日志populate报错)修复
populate() isn't reentrant是Django的误导性报错,本质是mod_wsgi加载Django进程时前置环节出错,重试加载时触发的异常,和wsgi.py文件本身是否被修改无直接关系,按优先级排查:
- 目录权限问题(树莓派部署最高发)
Apache运行用户默认为www-data,需要对项目全目录、虚拟环境目录有读取、执行权限,依次执行命令修正:# 给/home/pi目录加其他用户可执行权限,否则Apache无法进入目录树 sudo chmod o+x /home/pi # 把项目目录权限递归分配给www-data sudo chown -R www-data:www-data /home/pi/myproject/ sudo chmod -R 755 /home/pi/myproject/ # 如果用SQLite数据库,单独给库文件加写权限 sudo chown www-data:www-data /home/pi/myproject/db.sqlite3 sudo chmod 664 /home/pi/myproject/db.sqlite3 - mod_wsgi与Python版本不匹配
日志显示虚拟环境使用Python3.7,若系统安装的mod_wsgi是编译给其他Python版本的,加载时会隐式报错触发该异常。执行dpkg -l | grep libapache2-mod-wsgi检查版本,不匹配则卸载现有版本,安装对应Python3.7的mod_wsgi包,或在虚拟环境内通过pip安装mod_wsgi后编译加载到Apache。 - Django本地配置校验
切到项目根目录激活虚拟环境,执行python manage.py check,把命令输出的所有配置错误(缺依赖、INSTALLED_APPS配置错误、数据库连接失败等)全部修复。 - 全量重启Apache
修复配置后不要用reload,执行sudo systemctl restart apache2彻底杀掉残留的异常wsgi进程,旧进程卡异常状态时reload不会重置加载状态。
二、Admin后台CSS样式丢失修复
该问题是Apache未配置静态资源映射导致,和500错误相互独立:
- 先修改项目
settings.py配置,保留STATIC_URL = '/static/',新增静态资源收集路径配置:STATIC_ROOT = os.path.join(BASE_DIR, 'static/') - 激活虚拟环境,在项目根目录执行
python manage.py collectstatic,该命令会把admin自带的所有CSS、JS等静态文件统一收集到上面配置的static目录下。 - 修改Apache站点配置文件(默认路径为
/etc/apache2/sites-available/000-default.conf),在WSGI配置段新增静态资源别名映射:Alias /static/ /home/pi/myproject/myprojectenv/myproject/static/ <Directory /home/pi/myproject/myprojectenv/myproject/static/> Require all granted </Directory> - 再次重启Apache,直接访问
http://你的服务IP/static/admin/css/base.css能正常返回CSS内容时,admin样式即可正常加载。
排查提示:如果修复后仍有异常,把Apache日志的错误级别调到debug,能看到populate报错之前真正触发加载失败的根因,不要只盯着populate这一条报错排查。
内容的提问来源于stack exchange,提问作者Ric
相关产品推荐
相关产品推荐

