在Apache WSGI模式下遭遇“No module named encodings”错误求助
我之前在EC2的CentOS环境里碰到过一模一样的问题!这个No module named encodings错误十有八九是mod_wsgi没有正确关联到你的Python虚拟环境,或者系统Python的路径配置出了问题。结合你给出的环境信息,给你几个针对性的排查和解决步骤:
1. 确认mod_wsgi绑定的Python版本
你已经执行了ldd wsgi.so,可以重点看输出里的Python库路径——如果指向的是/usr/lib64/python3.6/这类系统路径,说明mod_wsgi默认用的是系统Python,而非你的虚拟环境。这是最常见的问题根源。
2. 配置Apache让mod_wsgi指向虚拟环境
找到你的Apache配置文件(通常在/etc/httpd/conf.d/目录下,或主配置文件/etc/httpd/conf/httpd.conf),添加/修改以下配置项:
# 替换为你的虚拟环境根目录 WSGIPythonHome /opt/your-virtualenv-path # 替换为你的项目根目录 + 虚拟环境的site-packages路径 WSGIPythonPath /opt/your-project-path:/opt/your-virtualenv-path/lib/python3.6/site-packages
同时,在你的WSGI脚本文件开头,加上虚拟环境激活代码:
activate_this = '/opt/your-virtualenv-path/bin/activate_this.py' with open(activate_this) as file_: exec(file_.read(), dict(__file__=activate_this))
3. 检查文件与用户权限
你新建了python_us...用户,要确保Apache的运行用户(通常是apache或httpd)能访问虚拟环境和项目文件:
- 把虚拟环境目录的权限调整为用户组可访问:
sudo chown -R python_us:apache /opt/your-virtualenv-path sudo chmod -R 755 /opt/your-virtualenv-path - 或者将Apache用户加入你的
python_us用户组:sudo usermod -a -G python_us apache
4. 验证配置并重启服务
修改完配置后,重启Apache生效:
sudo systemctl restart httpd
可以在WSGI脚本里加一段调试代码,输出当前Python的运行路径,方便排查:
import sys # 输出到Apache错误日志 print(f"Python executable path: {sys.executable}", file=sys.stderr) print(f"Current sys.path: {sys.path}", file=sys.stderr)
然后查看Apache错误日志(/var/log/httpd/error_log),确认输出的路径是否指向你的虚拟环境。
5. 极端情况:重新编译mod_wsgi绑定虚拟环境
如果yum安装的mod24_wsgi-python36始终无法正确关联虚拟环境,可以卸载它,然后用虚拟环境的pip重新编译安装:
sudo yum remove mod24_wsgi-python36.x86_64 # 先激活你的虚拟环境 source /opt/your-virtualenv-path/bin/activate pip install mod_wsgi # 生成Apache配置片段 mod_wsgi-express module-config
把mod_wsgi-express输出的配置内容复制到Apache配置文件中,这样mod_wsgi就会完全绑定到你的虚拟环境Python。
内容的提问来源于stack exchange,提问作者BSharer App - Share Books

