Python 试图在Apache+;mod_wsgi但它';他失败了

Python 试图在Apache+;mod_wsgi但它';他失败了,python,apache,mod-wsgi,pyramid,Python,Apache,Mod Wsgi,Pyramid,我已经安装了mod_wsgi运行Apache2。我已经证实mod_wsgi实际上是通过以下方式工作的 当我试图让金字塔运行时,问题就来了。我收到一个内部服务器错误,我的Apache错误日志包含异常: AssertionError: The EvalException middleware is not usable in a multi-process environment 这是我的简历: <VirtualHost *:80> ServerName pyramidtes

我已经安装了mod_wsgi运行Apache2。我已经证实mod_wsgi实际上是通过以下方式工作的

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

AssertionError: The EvalException middleware is not usable in a multi-process environment
这是我的简历:

<VirtualHost *:80>
    ServerName  pyramidtest.dev
    DocumentRoot    /srv/pyramidtest.dev/www/
    AssignUserID    pyramidtest nogroup
    WSGIScriptAlias / /srv/pyramidtest.dev/pyramid/load.wsgi
</VirtualHost>
mod_wsgi被编译为使用
/opt/python2.7
作为Python解释器,但我在
/opt/Pyramid
中的virtualenv下运行Pyramid-这就是为什么我在load.wsgi中有
site.addsitedir()

如果需要的话,
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"

我遗漏了什么…?

您正在使用EvalException中间件(从错误消息中可以看出)。这个错误的解决方案实际上包含在mod_wsgi的文档中

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

从wiki:

[…]如果您希望能够使用此 基于浏览器的交互式调试器(如果需要) 在嵌入式系统中运行应用程序 mod_wsgi模式,您需要 配置Apache,使其仅 启动一个子进程来处理 请求,并且它从不创建任何 其他过程。阿帕奇 所需的配置指令 实现这一目标的方法如下

StartServers 1  
ServerLimit 1
切换到守护进程模式(默认情况下为单个进程)也会解决此问题,建议在嵌入式模式下过度运行。以下是Apache指令:

WSGIDaemonProcess pyramidtest.dev display-name=%{GROUP}
WSGIProcessGroup pyramidtest.dev
mod_wsgi还可以为您将路径添加到Python路径中。如果使用嵌入式模式,您可以使用:

WSGIPythonPath /opt/pyramid/lib/python2.7/site-packages
如果使用守护程序模式,请改为使用WSGIDaemonProcess指令的“python path”选项

WSGIDaemonProcess pyramidtest.dev display-name=%{GROUP} python-path=/opt/pyramid/lib/python2.7/site-packages
WSGIProcessGroup pyramidtest.dev

为答复干杯。我遵照您的建议,将
WSGIDaemonProcess
WSGIProcessGroup
指令放入VHost中。异常现在已经消失,但我得到了这个错误:
(13)权限被拒绝:mod_wsgi(pid=17417):在多次尝试后,无法连接到wsgi守护进程'pyramidtest.dev'on'/var/run/apache2/wsgi.17384.0.1.sock'。
@jim:这也在;-)中讨论过用于通信的UNIX套接字文件没有正确的权限,因为默认目录已锁定;您可以使用
WSGISocketPrefix
指令指定具有正确权限的目录。阅读wiki以获得关于良好套接字路径的建议(“run/wsgi”显然经常有效),我已经设置了一个
/var/log/wsgi/
目录,所有人都可以阅读。然后,我将WSGISocketPrefix添加到我的
httpd.conf
(因为vhosts中不允许使用它),但它仍然失败。我从@jim那里得到了这些指令:对于Apache运行的任何用户,它都必须是可写的,因为ITK模块是内存中的特例。您使用的是哪个版本的mod_wsgi?您必须使用mod_wsgi 3.3或更高版本。较新版本所做的是设置所有权/权限,以便ITK进程/守护进程作为用户运行。请参阅“”。
WSGIDaemonProcess pyramidtest.dev display-name=%{GROUP} python-path=/opt/pyramid/lib/python2.7/site-packages
WSGIProcessGroup pyramidtest.dev