mod_wsgi无法连接WSGI守护进程。

7
我正在使用Easy Apache 4,mod_wsgi和Python 3.5。当我在服务器上调用Django项目时,遇到了以下错误:
(13)Permission denied: mod_wsgi (pid=24223): Unable to connect to WSGI daemon
process 'user123' on '/var/run/wsgi.8442.6.7.sock' as user with uid=3708.
2个回答

7
您的Apache安装很可能设置了以SECURE权限模式运行。这意味着在处理请求之前,Apache子进程会被分叉并降低权限,而此时请求只是尝试通过到mod_wsgi守护程序进程的代理。其后果是不能连接到守护程序进程的套接字,因为在降低权限之前,它是使用与原始Apache子进程匹配的所有权设置的。
这是明显的,因为错误消息的uid处于普通用户的范围,而不是特殊的apachenobody用户。
要解决此问题,您需要修改WSGIDaemonProcess指令配置并添加选项:
socket-user=#3708

或者:

socket-user=username

username替换为uid3708的实际用户名称。

由于CPanel配置中对Apache的最近更改,似乎需要添加此选项。


如果运行service apache2 reload,我会得到uid = 33(www-data)的错误,但是如果运行service apache2 restart,则不会出现此错误。这是否表示有什么问题或者这是正常的? - embe

0
有时socket-user设置不起作用。 这可能是因为找不到WSGISocketPrefix路径。
  • 如果是VPS:

    WSGISocketPrefix /var/run/wsgi

  • 如果您在共享托管中:

    WSGISocketPrefix ../../var/run/wsgi

谢谢。

根据您在其他答案中的评论,为什么要使用相对路径?这可能需要您解释一下其中的奥妙。 - Graham Dumpleton
路径/var/run/user123无法访问该文件夹。只有root用户和经过批准的用户才能访问。因此,我们需要为wsgi套接字显示一个路径。 @GrahamDumpleton 先生,我需要解释更多吗?如果需要的话,我可以解释。 - hkjamil
你提出的解决方案实际上并没有帮助到问题的本质。当使用“SECURE”权限模式时,唯一的解决方案是使用“socket-user”选项,就像这里的情况一样。你的答案处理的是一个不同的问题,即某些Linux发行版上默认的运行时目录对Apache用户不可访问。这个单独的问题在mod_wsgi文档中有描述,网址为http://modwsgi.readthedocs.io/en/develop/user-guides/configuration-issues.html#location-of-unix-sockets。 - Graham Dumpleton
是的,@GrahamDumpleton,谢谢您的澄清。下次我会记住这两点。实际上,我也在尝试以另一种方式添加答案。您是正确的。 - hkjamil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接