我使用 fedora 17,当我使用 unix 域套接字通过 uwsgi 设置 nginx 时,当我将套接字放在具有适当权限的目录中时,一切正常,但是当我将套接字放在中时,/tmp
会导致 nginx 错误:
connect() to unix:/tmp/MySite.sock failed (2: No such file or directory) while connecting to upstream
该文件确实存在,并且 nginx 用户具有读/写权限。但是什么原因导致此错误,这真的让我抓狂,有人能找出原因吗。
答案1
您不能将用于进程间通信的套接字放置在 中/tmp
。
出于安全原因,Fedora 的最新版本使用命名空间临时目录,这意味着每个服务看到的都是完全不同的/tmp
,并且只能看到该目录中自己的文件。
要解决该问题,请将套接字放在不同的目录中,例如/run
(以前称为/var/run
)。
答案2
是啊!这很有帮助!
看到来自 uwsgi 的 check-startup-logs 消息,但启动日志中没有数据,无法找出发生了什么。结果,我需要将 sock 文件更改为非 /tmp 位置,并添加:
捕获异常 = true
到 wsgi 的 ini 文件。结果,我将日志文件处理程序位置指定到一个不存在的目录,因此它首先无法记录错误。
答案3
基本上,问题出现在一个设置袜子的过程中/tmp路径,但它不会对另一个进程可见。
服务配置中有一个设置,它会阻止由不同进程创建的文件,即使使用同一个用户。
找到您的服务配置文件(例如:/etc/systemd/system/myapp.service),然后添加此设置:PrivateTmp=否为你们提供两种服务。
[Service]
...
PrivateTmp=No
有关 systemd 单元的更多信息,请参见此处:
https://www.freedesktop.org/software/systemd/man/systemd.unit.html