试图让Pyramid在Apache + mod_wsgi下运行,但它失败了

dav*_*ave 3 python apache mod-wsgi pyramid

我已经安装了运行mod_wsgi的Apache2.我已经证实,实际上的mod_wsgi按照工作这个.

当我试图让金字塔运行时,问题出现了.我收到内部服务器错误,我的Apache错误日志包含异常:

AssertionError: The EvalException middleware is not usable in a multi-process environment
Run Code Online (Sandbox Code Playgroud)

这是我的VHost:

<VirtualHost *:80>
    ServerName  pyramidtest.dev
    DocumentRoot    /srv/pyramidtest.dev/www/
    AssignUserID    pyramidtest nogroup
    WSGIScriptAlias / /srv/pyramidtest.dev/pyramid/load.wsgi
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这是我的load.wsgi:

import site
site.addsitedir('/opt/pyramid/lib/python2.7/site-packages')

from pyramid.paster import get_app

application = get_app('/srv/pyramidtest.dev/pyramid/test/development.ini', 'main')
Run Code Online (Sandbox Code Playgroud)

mod_wsgi被编译为/opt/python2.7用作Python解释器,但我在virtualenv下运行Pyramid /opt/pyramid- 这就是我site.addsitedir()在load.wsgi中的原因.

并且,如果需要,apache2 -V:

Server version: Apache/2.2.9 (Debian)
Server built:   Dec 30 2010 11:50:24
Server's Module Magic Number: 20051115:15
Server loaded:  APR 1.2.12, APR-Util 1.2.12
Compiled using: APR 1.2.12, APR-Util 1.2.12
Architecture:   32-bit
Server MPM:     ITK
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/experimental/itk"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT=""
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
 -D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
Run Code Online (Sandbox Code Playgroud)

我错过了什么......?

Cam*_*ron 6

您正在使用EvalException中间件(从错误消息中可以看出).这个错误的解决方案实际上包含在mod_wsgi 的调试技术维基中.

基本上,由于中间件允许对应用程序进行基于浏览器的交互式调试,因此所有请求都需要发送到同一个进程; 但是,您在嵌入模式下运行mod_wsgi,默认情况下可以创建许多进程.

来自维基:

[...]如果你想能够使用这个基于浏览器的交互式调试器,如果在mod_wsgi的嵌入模式下运行你的应用程序,你需要配置Apache,使它只启动一个子进程来处理请求,并且它从不创建任何其他过程.实现此目的所需的Apache配置指令如下.

StartServers 1  
ServerLimit 1
Run Code Online (Sandbox Code Playgroud)

切换到守护进程模式(使用单个进程,默认值)也将解决此问题,建议在嵌入模式下运行.以下是Apache指令:

WSGIDaemonProcess pyramidtest.dev display-name=%{GROUP}
WSGIProcessGroup pyramidtest.dev
Run Code Online (Sandbox Code Playgroud)

mod_wsgi还可以为您添加Python路径的路径.如果使用嵌入模式,您可以使用:

WSGIPythonPath /opt/pyramid/lib/python2.7/site-packages
Run Code Online (Sandbox Code Playgroud)

如果使用守护进程模式,则使用WSGIDaemonProcess指令的'python-path'选项.

WSGIDaemonProcess pyramidtest.dev display-name=%{GROUP} python-path=/opt/pyramid/lib/python2.7/site-packages
WSGIProcessGroup pyramidtest.dev
Run Code Online (Sandbox Code Playgroud)

  • ITK模块是来自内存的特殊情况.你使用的是什么版本的mod_wsgi?您必须使用mod_wsgi 3.3或更高版本.较新版本的作用是设置所有权/权限,以便ITK进程/守护程序进程运行的用户.请参阅"http://code.google.com/p/modwsgi/wiki/ChangesInVersion0303". (2认同)