我正在尝试在Ubuntu 10.04.3 LTS(lucid)上使用支持守护进程的mod_wsgi来运行Apache2。
问题是,我无法findWSGISocketPrefix指令的工作configuration。 我的设置是:
<VirtualHost *:80> ... WSGIDaemonProcess myapp threads=5 WSGIScriptAlias / /var/www/myapp/myapp.wsgi <Directory /var/www/myapp> WSGIProcessGroup myapp WSGIApplicationGroup %{GLOBAL} WSGIScriptReloading On Order deny,allow Allow from all </Directory> </VirtualHost>
Apache以root身份运行。 我使用的Flask Python框架,所以我遵循这个教程: http : //flask.pocoo.org/docs/deploying/mod_wsgi/#configuring-apache 。 没有任何其他设置,我得到503服务暂时不可用的 HTTP错误。 在Apache错误日志中,我收到了以下消息:
[Mon Oct 17 15:24:24 2011] [error] [client 90.181.85.69] (13)Permission denied: mod_wsgi (pid=21805): Unable to connect to WSGI daemon process 'kvinono' on '/var/run/apache2/wsgi.16282.4.1.sock' after multiple attempts.
然后我发现这个: https : //code.google.com/p/modwsgi/wiki/ConfigurationIssues#Location_Of_UNIX_Sockets ,所以我试图设置WSGISocketPrefix到我脑海中的任何值,并总是尝试重新启动/重新加载Apache,看看如果有用。 从来没有工作,总是权限错误,只在不同的位置。 我尝试将用户/组设置为WSGI进程:
WSGIDaemonProcess myapp user=www-data group=www-data threads=5
…同时在/ var / run / wsgi等文件夹上设置正确的权限,但没有帮助。 以root / root运行WSGI守护进程是不可能的,Apache不会让我这样做。 实际上,WSGI能够编写,并且当所有的权限设置好的时候,它真的把套接字文件写入文件夹,但是没有解决这个错误。 即使使用现有的套接字文件,它也完全相同的权限被拒绝错误。 经过几次尝试和组合之后,我尝试将WSGISocketPrefix设置为/ tmp。 再次,WSGI能够创build套接字文件,但仍然“崩溃”上面的错误。
我现在完全绝望了:-(如果你build议我在火旁跳舞,唱一些萨满的诅咒,那么只有在解决问题的时候,我才会这样做。
您正在使用ITK MPM for Apache。 你将需要使用mod_wsgi 3.3或更高版本,其中包含修复:
在针对Apache的ITK MPM进行编译时,如果使用守护进程模式,守护进程的侦听套接字将被标记为由守护进程运行的同一用户拥有。 这将至less允许在ITK MPM下处理的请求被定向到与脚本相同的用户所拥有的守护进程。 见问题:
你不能只使用由操作系统提供的二进制文件,因为那些可用的文件可能只会用于工作者和prefork MPM。 对于ITK MPM,您将需要从源代码编译mod_wsgi,并且您必须为安装的ITK MPM安装适当的头文件,而不是用于worker或prefork MPM的头文件。 这是因为mod_wsgi源代码有:
if (!geteuid()) { #if defined(MPM_ITK) if (chown(process->socket, process->uid, -1) < 0) { #else if (chown(process->socket, ap_unixd_config.user_id, -1) < 0) { #endif ap_log_error(APLOG_MARK, APLOG_ALERT, errno, wsgi_server, "mod_wsgi (pid=%d): Couldn't change owner of unix " "domain socket '%s'.", getpid(), process->socket); return -1; } }
IOW,如果ITK MPM头文件安装正确并且find了MPM_ITK #define,那么只有在ITK MPM中才能正确设置权限,这是编译时的select。
总之,您将需要执行以下操作:
(1)确保安装了ITK MPM头文件。 如果对Apache使用二进制包,请查看Apache dev包是否有ITK变体。
(2)从公共可下载的mod_wsgi 3.3源包中的源代码编译并安装mod_wsgi
mod_wsgi源代码包和安装说明可从以下位置获得:
格雷厄姆·杜姆普顿的答案可能有效,我没有尝试过。 我正在使用mod_wsgi 3.2并有相同的问题。
问题似乎是在/ etc / httpd(或/ etc / apache2)中启动的WSGISocketPrefix,并使用简单的连接。 所以当你添加到你的configuration
WSGISocketPrefix /var/run/wsgi
它试图把文件放在/ etc / httpd中// var / run / wsgi。 出于某种原因,它不会logging此错误。
解决方法? 我得到了这样的工作 :
WSGISocketPrefix ../../var/run/wsgi
我通过使用“var / run / wsgi”(没有前导/)作为我的前缀,并在日志中看到了这一点:
[Thu Feb 14 14:50:28 2013] [alert] (2)No such file or directory: mod_wsgi (pid=18702): Couldn't bind unix domain socket '/etc/httpd/var/run/wsgi.18702.0.1.sock'.
希望这是固定的最新版本,但至less我们可以坚持我们的操作系统分布式软件包。
尝试这个:
<VirtualHost *:80> ... WSGIDaemonProcess myapp threads=5 WSGIScriptAlias / /var/www/myapp/myapp.wsgi/ <Directory /var/www/myapp/> WSGIProcessGroup myapp WSGIApplicationGroup %{GLOBAL} WSGIScriptReloading On Order deny,allow Allow from all </Directory> </VirtualHost>
所以你试图在最后的wsgipath和目录中添加'/'字符。