Apache mod_wsgi部署Django报No module named 'django.core'排查
问题现象
Apache服务运行时wsgi:error日志持续抛出ModuleNotFoundError: No module named 'django.core'错误,mod_wsgi进程无法正常执行项目路径/root/novo-ai-api-main/backend/server/server/wsgi.py脚本,Django服务无法启动,对应错误日志如下:
[Thu Jun 16 20:32:08.505090 2022] [wsgi:error] [pid 131476:tid 140411386394368] [remote 193.32.127.157:53433] Traceback (most recent call last): [Thu Jun 16 20:32:08.505133 2022] [wsgi:error] [pid 131476:tid 140411386394368] [remote 193.32.127.157:53433] File "/root/novo-ai-api-main/backend/server/server/wsgi.py", line 18, in <module> [Thu Jun 16 20:32:08.505139 2022] [wsgi:error] [pid 131476:tid 140411386394368] [remote 193.32.127.157:53433] from django.core.wsgi import get_wsgi_application [Thu Jun 16 20:32:08.505159 2022] [wsgi:error] [pid 131476:tid 140411386394368] [remote 193.32.127.157:53433] ModuleNotFoundError: No module named 'django.core' [Thu Jun 16 20:48:58.603180 2022] [wsgi:error] [pid 131476:tid 140411361216256] [remote 200.110.48.158:35204] mod_wsgi (pid=131476): Failed to exec Python script file '/root/novo-ai-api-main/backend/server/server/wsgi.py'. [Thu Jun 16 20:48:58.603316 2022] [wsgi:error] [pid 131476:tid 140411361216256] [remote 200.110.48.158:35204] mod_wsgi (pid=131476): Exception occurred processing WSGI script '/root/novo-ai-api-main/backend/server/server/wsgi.py'. [Thu Jun 16 20:48:58.603447 2022] [wsgi:error] [pid 131476:tid 140411361216256] [remote 200.110.48.158:35204] Traceback (most recent call last): [Thu Jun 16 20:48:58.603477 2022] [wsgi:error] [pid 131476:tid 140411361216256] [remote 200.110.48.158:35204] File "/root/novo-ai-api-main/backend/server/server/wsgi.py", line 18, in <module> [Thu Jun 16 20:48:58.603483 2022] [wsgi:error] [pid 131476:tid 140411361216256] [remote 200.110.48.158:35204] from django.core.wsgi import get_wsgi_application [Thu Jun 16 20:48:58.603506 2022] [wsgi:error] [pid 131476:tid 140411361216256] [remote 200.110.48.158:35204] ModuleNotFoundError: No module named 'django.core'
已完成配置与操作
- 已正确安装适配Python 3.8版本的mod_wsgi模块
- 已配置Apache虚拟主机文件000-default.conf,设置DocumentRoot、日志路径、wsgi.py访问权限、静态资源映射、WSGI相关规则,对应配置如下:
<VirtualHost *:80> DocumentRoot /root/novo-ai-api-main ErrorLog /root/novo-ai-api-main/error.log CustomLog /root/novo-ai-api-main/access.log combine <Directory /root/novo-ai-api-main/backend/server/server> <Files wsgi.py> Require all granted </Files> </Directory> Alias /static /root/novo-ai-api-main/static <Directory /root/novo-ai-api-main/static> Require all granted </Directory> WSGIScriptAlias / /root/novo-ai-api-main/backend/server/server/wsgi.py WSGIDaemonProcess django_app python-path=/root/novo-ai-api-main/backend/server python-home=/root/novo-ai-api-main/backend/django/ WSGIProcessGroup django_app </VirtualHost>
- 已配置apache2.conf,设置服务运行参数、目录访问权限、配置引入规则,对应配置如下:
ServerRoot "/etc/apache2" Timeout 300 MaxKeepAliveRequests 100 KeepAliveTimeout 5 User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} LogLevel warn <Directory /> Options FollowSymLinks AllowOverride All Require all granted </Directory> <Directory /var/www/> AllowOverride All Require all granted </Directory> <Directory /var/www/html> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> IncludeOptional conf-enabled/*.conf IncludeOptional sites-enabled/*.conf
- 已配置wsgi.py,手动引入虚拟环境依赖路径、设置Django环境变量、初始化wsgi应用,对应代码如下:
import os, sys import site site.addsitedir('/root/novo-ai-api-main/django/lib/python3.8/site-packages') from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') application = get_wsgi_application()
- 已为项目目录、后端目录、静态资源目录、Python虚拟环境目录配置www-data用户访问权限,对应权限信息如下:
drwx--x--x 9 root root 4096 Jun 16 22:05 . drwxr-xr-x 19 root root 4096 Jun 14 14:05 .. drwxr-xr-x 3 root root 4096 Jun 13 23:38 .local drwxrwxr-x 8 root root 4096 Jun 16 01:24 mod_wsgi-4.9.2 drwxr-xr-x 5 www-data www-data 4096 Jun 14 23:53 novo-ai-api-main (项目目录) drwxr-xr-x 5 www-data www-data 4096 Jun 14 23:14 backend drw-r--r-- 8 www-data www-data 4096 Jun 14 00:33 static drwxr-xr-x 6 www-data www-data 4096 Jun 14 00:16 django (Python虚拟环境目录)
故障根因定位
共3个核心问题直接导致报错:
- 虚拟环境路径配置前后不一致:Apache虚拟主机配置中
WSGIDaemonProcess的python-home参数写的是/root/novo-ai-api-main/backend/django/,但wsgi.py中手动添加的site-packages路径是/root/novo-ai-api-main/django/lib/python3.8/site-packages,两个路径不匹配,mod_wsgi无法从配置的虚拟环境路径中找到Django安装包。 - 静态目录缺少执行权限:静态资源目录
/root/novo-ai-api-main/static权限为drw-r--r--,目录没有执行(x)权限,www-data用户无法进入该目录读取文件,即使Django启动成功静态资源也会返回403。 - 项目部署在/root目录下存在权限隐患:/root目录默认是root用户专属目录,当前权限为
drwx--x--x,www-data作为其他用户仅能通过已知文件名访问下层文件,一旦上层路径权限变更会直接导致服务访问失败。
修复方案
按以下步骤操作即可解决问题:
- 先确认Django所在虚拟环境的真实路径,激活虚拟环境后执行以下命令查看路径:
which python- 如果虚拟环境真实路径为
/root/novo-ai-api-main/backend/django,则修改wsgi.py中的site.addsitedir路径为对应正确路径:site.addsitedir('/root/novo-ai-api-main/backend/django/lib/python3.8/site-packages') - 如果虚拟环境真实路径是
/root/novo-ai-api-main/django,则修改Apache虚拟主机配置中WSGIDaemonProcess的python-home参数为:WSGIDaemonProcess django_app python-path=/root/novo-ai-api-main/backend/server python-home=/root/novo-ai-api-main/django
- 如果虚拟环境真实路径为
- 修复静态目录权限,给目录添加执行权限:
chmod o+x /root/novo-ai-api-main/static - (推荐)将项目迁移到
/var/www/目录下,避免/root目录的权限限制,迁移后同步修改Apache配置中所有涉及项目路径的参数,再重新给www-data用户授权项目目录权限即可。 - 重启Apache服务生效配置:
systemctl restart apache2
内容的提问来源于stack exchange,提问作者Tess
相关产品推荐
相关产品推荐

