我正在尝试使用 uWSGI Emperor 和 nginx 在同一台机器上设置 2 个 Django Web 应用程序,并让 supervisord 管理 Emperor 进程的启动和重新启动。在互联网上进行大量搜索后,我终于设法获得了有效的部署。然而,在所有拉扯头发的过程中,我发现了一些奇怪的东西,如果有人能向我解释为什么会发生这种情况,我将不胜感激。
所以我以 root 身份在帝王模式下运行我的 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 仍然给我一个权限被拒绝错误:(
我在 serverfault 上没有足够的声誉来发表评论,所以我必须给出一个“答案”:
bind() 调用将套接字绑定到文件系统中的一个节点,因此您的用户可能在 /run 中没有写权限!?在我的系统上 /tmp 有
og+w
,而 /run 有og-w
. 尝试在具有写入权限的 /run 子文件夹中创建套接字。“套接字创建得很好”是什么意思?你能用另一个进程连接到它吗?听起来插座在那里。但是根据我上面写的内容,我不希望它出现在文件系统中。