Django使用mod_wsgi部署生产环境出现500错误提示No module named 'main'
Django mod_wsgi部署ModuleNotFoundError修复方案
问题根因
报错ModuleNotFoundError: No module named 'main'是因为Python运行时的模块搜索路径中未包含你的Django项目根目录,无法识别main包,你当前wsgi.py中已写好的路径添加代码被注释,是直接诱因。
修复步骤
1. 调整wsgi.py配置
取消路径添加代码的注释,建议使用sys.path.insert保证项目根目录优先级最高,修改后完整内容如下:
import os import sys from django.core.wsgi import get_wsgi_application # 路径替换为你自己的Django项目根目录(manage.py所在的目录) sys.path.insert(0, '/var/www/public_html/main/') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'main.settings') application = get_wsgi_application()
2. 校验Apache虚拟主机配置
你的httpd虚拟主机配置需要正确指定WSGI相关参数,参考配置如下:
<VirtualHost *:80> ServerName 你的域名或IP DocumentRoot /var/www/public_html/main WSGIDaemonProcess main python-path=/var/www/public_html/main:/usr/local/lib/python3.6/site-packages WSGIProcessGroup main WSGIScriptAlias / /var/www/public_html/main/main/wsgi.py <Directory /var/www/public_html/main/main> <Files wsgi.py> Require all granted </Files> </Directory> # 静态文件配置可选 Alias /static /var/www/public_html/main/static <Directory /var/www/public_html/main/static> Require all granted </Directory> </VirtualHost>
3. 修复RedHat权限与SELinux配置
RedHat默认开启SELinux,需要授予httpd服务项目目录的访问权限:
# 赋予项目目录httpd可读权限 chcon -R -t httpd_sys_content_t /var/www/public_html/main/ # 如果项目有文件写入需求(如媒体文件上传、缓存写入),额外执行 chcon -R -t httpd_sys_rw_content_t /var/www/public_html/main/
4. 校验项目包结构
确认你的项目根目录结构如下,main包目录下必须存在__init__.py文件才能被Python识别为可导入包:
/var/www/public_html/main/ ├── manage.py └── main/ ├── __init__.py ├── settings.py ├── wsgi.py └── urls.py
如果缺少__init__.py,手动创建空文件即可:
touch /var/www/public_html/main/main/__init__.py
5. 重启服务生效
所有配置修改完成后重启httpd服务即可:
systemctl restart httpd
内容的提问来源于stack exchange,提问作者Tech Orbeet
相关产品推荐
相关产品推荐

