设置 Django + nginx + uwsgi + Supervisord:/r​​un 与 /tmp 中的套接字之间的区别

设置 Django + nginx + uwsgi + Supervisord:/r​​un 与 /tmp 中的套接字之间的区别

我正在尝试使用 uWSGI Emperor 和 nginx 在同一台机器上设置 2 个 Django Web 应用程序,并让 Supervisord 管理 Emperor 进程的启动和重新启动。经过大量互联网搜索后,我终于成功实现了有效的部署。然而,在所有这些麻烦的过程中,我发现了一些奇怪的事情,如果有人能向我解释为什么会发生这种情况,我将不胜感激。

因此,我以 root 身份在 Emperor 模式下运行我的 uWSGI 进程。Vassal ini 配置文件负责将权限授予我的 uid,并创建一个由我的用户拥有的套接字文件,其组为 www-data(以便 nginx 可以写入它)和权限 660。以下是示例 vassal 配置:

[uwsgi]
uid = xxxx

chdir = %(project_dir)/%(project)
home = %(venv_base)/%(venv)
module = %(project).wsgi:application

master = true
processes = 4

socket = /tmp/%(project).sock
chown-socket = %(uid):www-data
chmod-socket = 660
stats = /tmp/%(project)_stat.sock
logto = %(project_dir)/logs/uwsgi.log
# Cleans up when the process is killed (includes deleting the socket file)
vacuum = true

这工作得很好,但如果我尝试在 /run 而不是 /tmp 中创建套接字,我会开始收到套接字 bind() 调用的权限被拒绝错误。套接字创建得很好,具有适当的所有权和权限,但 vassal 无法对其调用 bind() 或 unlink()。为什么会发生这种情况?/tmp 和 /run 之间有什么区别,我应该何时使用它们?任何帮助或指示都将不胜感激。

编辑:我刚刚尝试将套接字的权限设置为 777,但 uwsgi 仍然给出权限被拒绝错误 :(

答案1

我在 serverfault 上的声誉不足以发表评论,所以我必须给出一个“答案”:

bind() 调用将套接字绑定到文件系统中的节点,因此您的用户可能没有 /run 中的写入权限!?在我的系统上 /tmp 有,og+w而 /run 有og-w。尝试在具有写入权限的 /run 子文件夹中创建套接字。

“套接字创建得很好”是什么意思?你能用另一个进程连接到它吗?听起来套接字就在那里。但根据我上面写的内容,我不希望它出现在文件系统中。

相关内容