我已将 uwsgi 和 nginx 配置为通过位于用户主目录中的套接字(chmod 777)工作,但 nginx 无法访问套接字(13:Permission denied in 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 禁用
在得到答案之前,您应该尽一切努力打破使用 chmod 777 或禁用 SELinux 的不良安全习惯。相反,您应该全面了解 UNIX 权限模型,以便始终了解正确的权限,并且您应该配置您的服务以与 SELinux 一起使用,以便从它提供的额外安全层中受益。
因此,深埋在用户主目录中的套接字不起作用的原因是父目录的权限禁止了必要的访问(在这种情况下为 search
x
)。用于namei -l /home/***/.deploy/my.sock
一次查看所有父目录的权限,并更正不允许搜索权限的那些(很可能是/home/***
)。还要记住根据需要修复套接字本身的权限和所有权。
为了完整起见,未找到您的套接字的原因
/tmp
是作为系统服务运行的 nginx 无法访问系统/tmp
目录。Systemd 启动它PrivateTmp=true
会导致创建一个唯一的私有目录并将 nginx/tmp
命名空间到该目录。这就是所有这些/tmp/xxx-systemd-private-foo
目录的用途。