我有一个在Apache 2.4和mod_wsgi 4.6.4上的Centos 7.5上运行的Django应用程序。我很难让mod_wsgi使用想要使用的虚拟环境。我通过yum安装了Python 3.6,并用它创建了一个虚拟环境。我从源代码编译了mod_wsgi,使用with-python选项将其指向正确的Python二进制文件。我期望可以(但不起作用)的(大约)Apache配置如下:
# Required because of some third-party packages that use the
# simplified GIL state API
WSGIApplicationGroup %{GLOBAL}
<VirtualHost *:80>
WSGIDaemonProcess myapp python-home=/path/to/venv python-path=/path/to/my/app
WSGIProcessGroup myapp
WSGIScriptAlias / /path/to/my/app/wsgi.py
</VirtualHost>
<VirtualHost *:443>
WSGIProcessGroup myapp
WSGIScriptAlias / /path/to/my/app/wsgi.py
</VirtualHost>
此配置找不到在虚拟环境中安装的任何软件包。转储sys.path会显示该路径不包含预期的/path/to/venv/lib/python3.6/site-packages,而是/lib/python3.6/site-packages(即系统目录)。我能够运行我的应用程序的唯一方法是将WSGIDaemonProcess
指令更改为:
WSGIDaemonProcess myapp python-path=/path/to/my/app:/path/to/venv/lib/python3.6/site-packages
在配置了Python 3.6和mod_wsgi 4.5.24的macOS 10.12上,第一个配置(建议使用python-home
确实对我有用。两种环境之间的最大区别是,在CentOS服务器上启用了SELinux,但是audit2allow
却没有任何内容可以解释我的问题。
答案 0 :(得分:0)
我明白了。我仍然不确定为什么我不能第一次弄清楚这一点,但是怀疑这是SELinux的问题。问题在于,虚拟环境目录下的所有内容都需要具有tempfile.mkstemp
上下文,而动态加载的二进制库除外,后者需要httpd_sys_content_t
。完成该操作后,httpd_sys_script_exec_t
的{{1}}参数按预期工作。