我已经将 uwsgi 和 nginx 配置为通过位于用户主目录中的套接字(chmod 777)工作,但 nginx 无法访问套接字(13:权限被拒绝error.log
)。尝试使用 777 chmod 将套接字移动到 /tmp/,但收到错误2: No such file or directory
2021/09/21 19:40:16 [crit] 68278#0: *17 connect() to unix:///tmp/my.sock failed (2: No such file or directory) while connecting to upstream, client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///tmp/my.sock:", host: "****"
2021/09/21 20:10:16 [crit] 517#0: *1 connect() to unix:/home/***/.deploy/my.sock failed (13: Permission denied) while connecting to upstream, client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/***/.deploy/my.sock:", host: "***"
PS selinux已禁用
答案1
在找到答案之前,您应该尽一切努力戒掉使用 chmod 777 或禁用 SELinux 的不良安全习惯。相反,您应该充分了解 UNIX 权限模型,以便始终了解正确的权限,并且应该配置您的服务以与 SELinux 配合使用,从而受益于它提供的额外安全层。
因此,位于用户主目录深处的套接字无法工作的原因是父母目录的权限禁止必要的访问(在本例中为 搜索x
)。使用namei -l /home/***/.deploy/my.sock
一次查看所有父目录的权限,并更正不允许搜索权限的目录(最有可能是/home/***
)。
chmod +x /as/needed
还要记得根据需要修复套接字本身的权限和所有权。
完整地说,未找到套接字的原因/tmp
是作为系统服务运行的 nginx 无法访问系统/tmp
目录。Systemd 启动它,PrivateTmp=true
这会导致创建一个唯一的私有目录,并将 nginx 的/tmp
命名空间设置为该目录。这就是所有这些/tmp/xxx-systemd-private-foo
目录的用途。