Apache部署Django遇Fatal Python error: No module named 'encodings'求助
错误原因分析
- 路径配置冲突:你的Apache配置中同时全局设置了
WSGIPythonHome、WSGIPythonPath,又在WSGIDaemonProcess中单独指定了python-home,三个路径完全不统一,导致Python运行时找不到正确的模块路径。 - 版本不匹配:报错日志中
sys.path出现了Python3.8的路径,但你的虚拟环境基于Python3.9构建,版本不一致导致核心编码模块加载失败。 - 权限不足:Apache默认运行用户(一般为
www-data或apache)没有访问个人主目录下~/.local路径的权限,哪怕路径配置正确也无法读取虚拟环境的模块文件。 - 多余路径配置:
wsgi.py中手动添加的sys.path.append完全多余,会和Apache端的路径配置产生冲突。
解决方案
1. 统一虚拟环境路径(强烈推荐)
不要将项目依赖的虚拟环境放在个人主目录下,迁移到项目所在的/var/www路径下,避免权限问题:
- 你可以直接在
/var/www/myapp/myapp_root/路径下新建虚拟环境:
cd /var/www/myapp/myapp_root/ python3.9 -m venv venv # 激活虚拟环境后安装所有依赖 source venv/bin/activate pip install -r requirements.txt
2. 修正Apache WSGI配置
删除全局的WSGIPythonHome和WSGIPythonPath配置,仅在WSGIDaemonProcess中指定路径,修正后配置如下:
# 删掉原来的WSGIPythonHome、WSGIPythonPath两行 WSGIDaemonProcess myapp python-home=/var/www/myapp/myapp_root/venv python-path=/var/www/myapp/myapp_root WSGIProcessGroup myapp WSGIApplicationGroup %{GLOBAL} WSGIScriptAlias / /var/www/myapp/myapp_root/myapp/wsgi.py <Directory /var/www/myapp/myapp_root/myapp> <Files wsgi.py> Order deny,allow Require all granted </Files> </Directory>
3. 修正wsgi.py配置
删除多余的手动路径添加,修正后内容如下:
""" WSGI config for trackx project. It exposes the WSGI callable as a module-level variable named ``application``. """ import os import sys # 只需要添加项目根目录到路径即可 sys.path.insert(0, '/var/www/myapp/myapp_root') from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'trackx.settings') application = get_wsgi_application()
4. 修复目录权限
将整个项目目录的所有者修改为Apache运行用户,避免权限报错:
# Debian/Ubuntu 系统 sudo chown -R www-data:www-data /var/www/myapp sudo chmod -R 755 /var/www/myapp # CentOS/RHEL 系统 sudo chown -R apache:apache /var/www/myapp sudo chmod -R 755 /var/www/myapp
5. 检查mod_wsgi版本匹配
确认mod_wsgi编译时使用的Python版本和你虚拟环境的Python3.9完全一致,否则会出现核心模块加载失败问题:
# 查看mod_wsgi链接的Python版本 ldd /usr/lib/apache2/modules/mod_wsgi.so
如果版本不匹配,可直接使用虚拟环境的pip重装mod_wsgi,然后将新生成的so文件路径配置到Apache中即可。
6. 重启服务测试
所有配置修改完成后重启Apache服务即可:
# Debian/Ubuntu sudo systemctl restart apache2 # CentOS/RHEL sudo systemctl restart httpd
内容的提问来源于stack exchange,提问作者Todd B
相关产品推荐
相关产品推荐

