Python 试图在Apache+;mod_wsgi但它';他失败了
我已经安装了mod_wsgi运行Apache2。我已经证实mod_wsgi实际上是通过以下方式工作的 当我试图让金字塔运行时,问题就来了。我收到一个内部服务器错误,我的Apache错误日志包含异常: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
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