设置Django + nginx + uwsgi + supervisord:/ run中的套接字之间的区别vs / tmp

我试图使用uWSGI皇帝和nginx在同一台机器上设置2个Djangonetworking应用程序,并拥有supervisordpipe理皇帝进程的启动和重新启动。 我终于在互联网上进行了大量search之后,终于实现了一个可行的部署。 然而,在所有的拉毛活动中,我发现了一些奇怪的东西,如果有人能向我解释为什么会这样,我会很感激。

所以我以root身份在皇帝模式下运行我的uWSGI进程。 vassal iniconfiguration文件负责将权限下放到我的uid,并创build一个由我的用户拥有的套接字文件,作为www-data(以便nginx可以写入它)和权限660.下面是一个示例vassalconfiguration:

[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 

这工作得很好,但如果我尝试在/运行而不是/ tmp中创build套接字,我开始获取权限拒绝套接字bind()调用的错误。 使用合适的所有权和许可权创build套接字,但是vassal无法对其调用bind()或unlink()。 为什么会这样呢? / tmp和/ run之间有什么区别,我应该什么时候使用它们? 任何帮助或指针将不胜感激。

编辑 :我只是试图设置套接字的权限到777和uwsgi仍然给我一个权限拒绝错误:(

我在serverfault上没有足够的声望来评论,所以我必须给出一个“答案”:

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

你是什​​么意思的“套接字创build就好”? 你可以连接到另一个进程吗? 听起来像sockets在那里。 但根据我上面写的,我不指望它出现在文件系统中。