mod_wsgi-致命的Python错误:initfsencoding:无法加载文件系统编解码器

时间:2019-07-17 18:56:57

标签: python apache redhat wsgi

使用Red Hat,apache 2.4.6,worker mpm,mod_wsgi 4.6.5和Python 3.7启动httpd时,出现上述错误,并且:

ModuleNotFoundError: No module named 'encodings'

在httpd error_log中。

我正在使用从主目录下的源安装的python创建的python虚拟环境。我使用--with-python=选项从源代码安装了mod_wsgi,该选项指向我的虚拟环境中的python二进制文件,然后将mod_wsgi.so文件复制为mod_wsgi37.so到我的apache模块目录中。

我对该文件运行了ldd,并有一个.conf文件,将其像这样加载到httpd中:

LoadFile /home/myUser/pythonbuild/lib/libpython3.7m.so.1.0 LoadModule wsgi_module modules/mod_wsgi37.so

然后在我的VirtualHost中,我拥有:

WSGIDaemonProcess wsgi group=www threads=12 processes=2 python-path=/var/ www/wsgi-scripts python-home=/var/www/wsgi-scripts/wsgi_env3 WSGIProcessGroup wsgi WSGIScriptAlias /test /var/www/wsgi-scripts/test.py

在我的虚拟环境中:

sys.prefix:'/var/www/wsgi-scripts/wsgi_env3'

sys.real_prefix:'/home/myUser/pythonbuild'

当我切换到系统安装的mod_wsgi / python组合(从WSGIDaemonProcess删除python-home行,并更改.conf文件以加载原始的mod_wsgi.so)时,它工作正常。似乎某些路径变量未正确设置。还有另一种设置我所缺少的变量如PYTHONHOME的方法吗?如何修复我的安装?

2 个答案:

答案 0 :(得分:0)

最近我遇到这个问题时,发现了一个可以在我的环境中使用的解决方案。
我不在虚拟环境中工作,但是在我的主文件夹中安装了非标准的python安装程序(没有root访问权限即可编译和安装)-这应该类似于虚拟环境。

我的虚拟主机配置的结构如下:

WSGIPythonHome /home/myuser/usr/
<VirtualHost *:80>
    ...
    WSGIDaemonProcess wsgi home=/path/to/my/project/folder processes=10 threads=10
    WSGIScriptAlias / /path/to/my/project/folder/wsgi.py
    WSGIProcessGroup wsgi
</VirtualHost>

首先,我完全省略了python-path。此外,WSGIPythonHome应该使用Python库指向bin/lib/include/目录的父文件夹。 我犯了一个错误,将其指向bin/文件夹。 因此,即使我通过WSGIPythonPath手动将默认库添加到python路径中,WSGI也无法加载默认库。

答案 1 :(得分:0)

我遇到了一个非常相似的问题,我发现我手动指定的 wsgi.* 被忽略了,因为之前的 apache-wide wsgi mod 正在加载。您可以检查 /etc/apache2/mods-enabled 中是否存在 a2dismod wsgi

如果是这种情况,请考虑使用 billing_day 禁用加载错误 python 的 apache wsgi。