我已经配置 nginx 来通过套接字运行 django 站点:
fastcgi_pass unix:/tmp/django.socket;
现在我(手动)运行
./manage.py runfcgi socket=/tmp/django.socket
http请求导致502 bad gateway,错误如下:
连接到上游时,连接到 unix:/tmp/django.socket 失败(13:权限被拒绝),
我应该设置什么权限才能轻松重新启动 django fcgi?
答案1
Nginx 正在某个用户下运行(在 Debian 上通常是 www-data),您可以通过以下方式检查:
ps aux | grep nginx | grep worker
用户将位于第一列。
此用户必须具有 /tmp/django.socket 的读写权限。您可以通过在与 nginx 相同的用户下运行 django(即 Debian 上的 www-data)来解决这个问题,或者您必须将 nginx 用户添加到与运行 django 的用户相同的组中,并且套接字必须具有组的读写权限。
第一个解决方案更简单,而且(对我来说)更好。
答案2
我遇到了同样的问题。我在通过 unix 套接字运行的 Gunicorn 上运行 django-site(在 fedora 19 上)。但 nginx 没有启动。我看到了 nginx-errors.log 文件
2014/03/15 04:25:01 [crit] 18309#0: *422 connect() to unix:/webapps/django/run/gunicorn.sock failed (13: Permission denied) while connecting to upstream
我正确设置了所有文件的权限和所有者。最后我了解到这是由于 SElinux 造成的,并找到了解决方案这里
更新
继第一条评论之后
我提供的链接上描述的解决方案非常长。所以我只是在这里复制了部分解决方案 -
一个快速的解决方案是禁用 selinux
setenforce 0
此命令将禁用所有程序的 selinux。要允许 nginx 在启用 selinux 时读取 unix 套接字,请按照以下步骤操作 -
默认情况下,SELinux 日志消息通过 Linux 审计系统 auditd 写入/var/log/audit/audit.log
。如果 auditd 守护进程未运行,则消息将写入/var/log/messages
。SELinux 日志消息标有 AVC 关键字,以便可以轻松地将它们从其他消息中过滤掉,就像使用 grep 一样。
因此,通过 greping nginx,/var/log/audit/audit.log
我发现了那些相关的 AVC 消息,这些消息确实表明 nginx 与 gitlab.socket 的连接被拒绝。
type=AVC msg=audit(1377542938.307:248364): avc: denied { write } for pid=2597 comm="nginx" name="gitlab.socket" dev="vda1" ino=1180273 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=sock_file
type=AVC msg=audit(1377542938.307:248364): avc: denied { connectto } for pid=2597 comm="nginx" path="/home/git/gitlab/tmp/sockets/gitlab.socket" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:initrc_t:s0 tclass=unix_stream_socket`
使用名为 audit2allow 的工具,我们可以清除 AVC 消息。如果您尚未安装该工具,则该工具随 policycoreutils-devel 包一起提供。
grep nginx /var/log/audit/audit.log | audit2allow
结果是:
#============= httpd_t ==============
#!!!! This avc is allowed in the current policy
allow httpd_t http_cache_port_t:tcp_socket name_connect;
# !!! This avc is allowed in the current policy
allow httpd_t httpd_log_t:file setattr;
#!!!! This avc is allowed in the current policy
allow httpd_t httpd_sys_content_t:sock_file write;
#!!!! This avc is allowed in the current policy
allow httpd_t initrc_t:unix_stream_socket connectto;
#!!!! This avc is allowed in the current policy
allow httpd_t user_home_dir_t:dir search;
#!!!! This avc is allowed in the current policy
allow httpd_t user_home_t:dir { search getattr };
#!!!! This avc is allowed in the current policy
allow httpd_t user_home_t:sock_file write;
#!!!! This avc is allowed in the current policy
allow httpd_t var_run_t:file { read write };
这些是应与 SELinux 一起使用的策略。请注意,user_home 至关重要,因为 GitLab 的 APP_ROOT 位于 /home/git/ 中。同样,您会注意到与被拒绝的套接字连接相关的策略:unix_stream_socket connectto。
然后我们可以继续使用 audit2allow 创建自定义策略模块来允许这些操作:
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp`
我们可以使用 semodule -l 列出已加载的模块来检查策略模块是否正确加载。
此后,请记住使用 setenforce 1 再次启用 SELinux。