我目前正在运行 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 问题。
对于如何开始解决这个问题,您有什么想法吗?
答案1
一些使用 C 扩展模块的 Python 第三方软件包(包括 scipy 和 numpy)只能在 Python 主解释器中使用,不能像 mod_wsgi 默认使用的那样在子解释器中使用。结果可能是线程死锁、行为不正确或进程崩溃。这些详细信息如下:
http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API
解决方法是强制 WSGI 应用程序在进程的主解释器中运行:
WSGIApplicationGroup %{GLOBAL}
如果在同一台服务器上运行多个 WSGI 应用程序,您可能希望开始研究使用守护进程模式,因为某些框架不允许多个实例在同一个解释器中运行。Django 就是这种情况。因此,使用守护进程模式,使每个实例都在自己的进程中,并强制每个实例在其各自的守护进程模式进程组的主解释器中运行。
答案2
适合我配置 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>
注意属性
process-group=website application-group=%{GLOBAL}
通常不需要