安装 scipy 后无响应的 apache + mod_wsgi

Mar*_*rkD 14 python mod-wsgi apache-2.2

我目前正在运行 Centos 6.4 服务器,Apache 2.2.15 和 mod_wsgi 3.2。服务器托管基于 django 的站点(django 1.5.1,python 2.6.6)。一切都运行良好,直到我通过 pip 安装了 scipy 0.12.0。现在,当我尝试加载 django 应用程序时,服务器没有响应,并且产生的子 httpd 进程似乎挂起。查看我的日志(/var/logs/httpd/error_log、我的 vhost error.log 和我的系统日志)没有发现任何错误。

如果我通过 django manage.py shell 加载我的模型等,一切正常,这让我相信这是一个 mod_wsgi 问题。

关于如何开始解决这个问题的任何想法?

Gra*_*ton 29

一些使用 C 扩展模块的 Python 第三方包,包括 scipy 和 numpy,只能在 Python 主解释器中工作,不能在子解释器中使用,因为默认情况下使用 mod_wsgi。结果可能是线程死锁、不正确的行为或进程崩溃。这些在:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API

解决方法是使用以下方法强制 WSGI 应用程序在进程的主解释器中运行:

WSGIApplicationGroup %{GLOBAL}
Run Code Online (Sandbox Code Playgroud)

如果在同一台服务器上运行多个 WSGI 应用程序,您可能希望开始使用守护进程模式进行调查,因为某些框架不允许在同一个解释器中运行多个实例。Django 就是这种情况。因此使用守护进程模式,这样每个进程都在自己的进程中,并强制每个进程在各自守护进程模式进程组的主解释器中运行。


小智 5

另一个适合我配置 WSGI 方式的解决方案是更改该WSGIScriptAlias行:

WSGIDaemonProcess website user=user group=group python-path=/path/to/venv/website:/path/to/venv/lib/python2.7/site-packages
WSGIScriptAlias /website /path/to/venv/website/wsgi.py process-group=website application-group=%{GLOBAL}

<Location /website>
        WSGIProcessGroup website
</Location>

<Directory /path/to/venv/website>
        WSGIScriptReloading On
        <Files wsgi.py>
                Allow from all
                Require all granted
        </Files>
</Directory>
Run Code Online (Sandbox Code Playgroud)

注意属性

process-group=website application-group=%{GLOBAL}
Run Code Online (Sandbox Code Playgroud)

通常不需要