无法加载为 Python 编译的 mod_wsgi 3

Can't load mod_wsgi compiled for Python 3

我在 CentOS 上并尝试配置 Apache 以使用针对 Anaconda Python 3.5 编译的 mod_wsgi。编译 mod_wsgi 似乎 可以:

sudo yum install httpd-devel
sudo ./configure --with-python=/opt/anaconda/anaconda3/bin/python
sudo make

ls -l /etc/httpd/modules/mod_wsgi.so
-rwxr-xr-x. 1 root root 702205 Mar  2 23:12 /etc/httpd/modules/mod_wsgi.so

但是当我启动网络服务器时,它似乎找不到它的库:

sudo service httpd start
Starting httpd: httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf:
Syntax error on line 1 of /etc/httpd/conf.d/wsgi.conf: Cannot load
/etc/httpd/modules/mod_wsgi.so into server: libpython3.5m.so.1.0: cannot
open shared object file: No such file or directory

libpython3.5m.so.1.0 肯定在 /opt/anaconda/anaconda3/lib 中,所以我想 mod_wsgi.so 模块不知道在哪里寻找它。然而 mod_wsgi config.status 似乎证实了

S["LDFLAGS"]=" -L/opt/anaconda/anaconda3/lib -L/opt/anaconda/anaconda3/lib/python3.5/config-3.5m "

所以我很茫然...谁能给我指出正确的方向?

编辑:好的,感谢@mata,我想我已经针对正确的库编译了mod_wsgi。但是现在服务器日志只填满了相同的重复消息:

Current thread 0x00007f60d68d07e0 (most recent call first):
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

所以我猜 apache 正在寻找 python 库的错误位置。给出所有问题的 00-wsgi.conf 文件如下:

WSGIPythonHome /opt/anaconda/anaconda3
WSGIPythonPath /opt/anaconda/anaconda3/lib/python3.5/site-packages
LoadModule wsgi_module modules/mod_wsgi.so

所以我想(根据我在其他线程上读到的内容)我已经告诉它在哪里寻找我的 Python 安装。

这意味着在运行时无法找到库 libpython3.5m.so.1.0,因为目录 /opt/anaconda/anaconda3/lib 不是动态链接器查找它的地方。

您可以尝试重建 mod_wsgi 使用:

./configure LDFLAGS='-Wl,-rpath=/opt/anaconda/anaconda3/lib' --with-python=/opt/anaconda/anaconda3/bin/python

这将在生成的二进制文件中保存库路径。

另一种选择是为 apache 进程设置 LD_LIBRARY_PATH 环境变量,这并不是一个好方法。
或者使用 /etc/ld.so.conf.d/ 中的 conf 文件将目录 /opt/anaconda/anaconda3/lib 添加到库搜索路径,这将是一个全局设置。有关详细信息,请参阅 man ld-linux

此外,不要忘记在您的配置文件中正确设置 WSGIPythonHome 指令。


编辑:

我做了一些实验,当 PATH.
上找不到 python3 二进制文件时,我可以重现您的第二条错误消息 在那种情况下,似乎设置 WSGIPythonHome 指令是不够的,您需要在 apache 启动之前设置 PYTHONHOME 环境变量 ,或者更改 PATH 这样就可以找到解释器了。在 CentOS 上更改 /etc/sysconfig/httpd 应该可以解决问题,只需添加:

export PYTHONHOME=/opt/anaconda/anaconda3
# alternatively this should also work:
export PATH="$PATH:/opt/anaconda/anaconda3/bin"

或者在路径上的目录中创建指向解释器的符号链接,例如/usr/local/bin...
作为参考,可以找到为什么需要这样做的扩展解释 here