尝试在CentOS上以守护程序模式配置Django / mod_wsgi应用程序时,python-home选项失败

时间:2018-06-26 19:04:10

标签: python django centos mod-wsgi

我有一个在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却没有任何内容可以解释我的问题。

1 个答案:

答案 0 :(得分:0)

我明白了。我仍然不确定为什么我不能第一次弄清楚这一点,但是怀疑这是SELinux的问题。问题在于,虚拟环境目录下的所有内容都需要具有tempfile.mkstemp上下文,而动态加载的二进制库除外,后者需要httpd_sys_content_t。完成该操作后,httpd_sys_script_exec_t的{​​{1}}参数按预期工作。