我已將 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 配合使用,以便從它提供的附加安全層中受益。
因此,深埋在使用者主目錄中的套接字不起作用的原因是家長目錄的權限禁止必要的存取(在本例中為 search 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
目錄的用途。