CentOS7加载Python3.9版mod_wsgi及自定义配置时httpd启动失败
问题根因
两个报错本质是同一个问题:
Invalid command 'WSGIScriptAlias'是因为mod_wsgi模块根本没加载成功,Apache不认识WSGI开头的配置指令cannot open shared object file: No such file or directory是核心原因:你在shell中配置的LD_LIBRARY_PATH/LD_RUN_PATH环境变量仅对当前shell启动的程序生效,systemd管理的httpd服务启动时不会读取这些shell环境变量,找不到mod_wsgi依赖的Python3.9动态库。
解决步骤
选其中一种方案即可,第一种方案长期稳定性更好。
方案一:重新编译mod_wsgi,硬编码库路径(推荐)
编译时直接把Python库路径写入mod_wsgi的运行时搜索路径,不依赖任何系统全局配置,不会和系统自带Python2.7的mod_wsgi冲突:
- 进入你之前解压的mod_wsgi源码目录,清理旧编译产物:
make clean
- 重新配置编译参数,注意替换成你实际的Python3.9库路径(从你之前的ldd输出来看你的库路径是
/opt/python39/lib,如果实际安装在/opt/python3.9/lib自行替换):
./configure --with-python=/opt/python3.9/bin/python39 LDFLAGS="-Wl,-rpath,/opt/python39/lib"
- 重新编译安装:
make sudo make install
- 验证依赖是否正常:
ldd /usr/lib64/httpd/modules/mod_wsgi.so
输出中libpython3.9.so.1.0后面没有not found提示即为正常。
方案二:配置系统动态链接库搜索路径
如果不想重新编译,可以把Python3.9的库路径加入系统全局动态链接库搜索范围:
- 新建动态库配置文件,同样注意替换成实际的Python库路径:
echo "/opt/python39/lib" | sudo tee /etc/ld.so.conf.d/python39.conf
- 刷新动态链接库缓存:
sudo ldconfig
- 同样执行
ldd /usr/lib64/httpd/modules/mod_wsgi.so验证依赖解析正常。
配置检查
完成上述操作后,确认你的Apache配置文件(/etc/httpd/conf.d/wsgi.conf或django.conf)中,LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so这行必须放在所有WSGIScriptAlias、WSGIDaemonProcess等WSGI相关配置指令的最前面,否则还是会报指令无效的错误。
最后执行配置校验:
sudo apachectl configtest
输出Syntax OK后,再执行sudo systemctl start httpd即可正常启动服务。
内容的提问来源于stack exchange,提问作者Shmack
相关产品推荐
相关产品推荐

