mod_wsgi 无法连接 WSGI 守护进程

Posted

技术标签:

【中文标题】mod_wsgi 无法连接 WSGI 守护进程【英文标题】:mod_wsgi unable to connect WSGI daemon process 【发布时间】:2017-01-13 18:26:36 【问题描述】:

我正在使用 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.

【问题讨论】:

【参考方案1】:

您的 Apache 安装可能设置为使用 SECURE 权限模式运行。这意味着 Apache 子工作进程在处理请求之前被分叉并且特权被删除,在这种情况下,它只是试图将请求代理到 mod_wsgi 守护进程。这样做的结果是它无法连接到守护进程的套接字,因为在删除权限之前它已设置所有权以匹配原始 Apache 子工作进程。

这很明显,因为错误消息的uid 在普通用户的范围内,而不是特殊的apachenobody 用户。

要修复它,需要修改WSGIDaemonProcess指令配置并添加选项:

socket-user=#3708

或:

socket-user=username

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

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

【讨论】:

如果运行 service apache2 reload,我会收到此错误,uid=33 (www-data),但如果运行 service apache2 restart,则不会。这表明有什么不好还是可以?【参考方案2】:

有时 socket-user 设置不起作用。 这可能是因为 WSGISocketPrefix 找不到路径

如果是VPS:

WSGISocketPrefix /var/run/wsgi

如果您在共享主机中:

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

谢谢

【讨论】:

根据您在别处的答案的评论,为什么是相对路径。这是你可能需要解释的魔法。 路径/var/run/user123 无权访问该文件夹。只有 root 和批准的用户有。所以我们需要显示一个wsgi socket的路径。 @GrahamDumpleton 先生,我需要解释更多吗?如果不是,我会的 您提出的解决方案实际上并没有帮助解决问题所在。当使用SECURE 特权模式时,唯一的解决方案是socket-user 选项。您的答案是处理一个单独的问题,即 Apache 用户无法访问某些 Linux 发行版上的默认运行时目录。这个单独的问题在 modwsgi.readthedocs.io/en/develop/user-guides/… 的 mod_wsgi 文档中进行了描述 是的@GrahamDumpleton 谢谢你的澄清。下次我会记住这两个。实际上我也试图以另一种方式添加答案。你是对的

以上是关于mod_wsgi 无法连接 WSGI 守护进程的主要内容,如果未能解决你的问题,请参考以下文章

Django + mod_wsgi + apache2 - 子进程 XXX 仍然没有退出,发送一个 SIGTERM

03 - 快速安装

我可以让一些代码像守护进程一样在 Django 中不断运行吗

当我触摸 wsgi 脚本时,带有 mod_wsgi 的烧瓶应用程序不会重新加载

使用守护程序模式生根日志文件

在 Apache 2.2.17 中让 mod_geoip 与 mod_wsgi 一起工作