权限被拒绝 – nginx和uwsgi套接字

那么我目前正在试图让我的django应用程序使用nginx和uwsgi服务。 我目前正在使用安装了uwsgi的虚拟环境。 不过,当我尝试访问该页面时,目前正在收到502错误的网关错误。

我正在经历的错误。

2014/02/27 14:20:48 [crit] 29947#0: *20 connect() to unix:///tmp/uwsgi.sock failed (13: Permission denied) while connecting to upstream, client: 144.136.65.176, server: domainname.com.au, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:///tmp/uwsgi.sock:", host: "www.domainname.com.au" 

这是我的nginx.conf

  # mysite_nginx.conf # the upstream component nginx needs to connect to upstream django { server unix:///tmp/uwsgi.sock; # for a file socket #server 127.0.0.1:8001; # for a web port socket (we'll use this first) } # configuration of the server server { # the port your site will be served on listen 80; # the domain name it will serve for server_name .domainname.com.au; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias /home/deepc/media; # your Django project's media files - amend as required } location /static { alias /home/deepc/static; # your Django project's static files - amend as required } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include /home/deepc/.virtualenvs/dcwebproj/dcweb/uwsgi_params; # the uwsgi_params file you installed } } 

这是我的uwsgi.ini文件

 [uwsgi] socket=/tmp/uwsgi.sock chmod-socket=644 uid = www-data gid = www-data chdir=/home/deepc/.virtualenvs/dcwebproj/dcweb module=dcweb.wsgi:application pidfile=/home/deepc/.virtualenvs/dcwebproj/dcweb.pid vacuum=true 

从我读到的谷歌它的www数据组和/ tmp /目录的权限问题。 但是,我是新来的,并试图改变文件夹的权限级别无济于事。 有人能指出我正确的方向吗? 这是一个权限问题。

也是不错的做法,把袜子文件在tmp目录?

谢谢

我认为你只需要改变你的套接字文件为666(664是好的万维网数据),或删除它,并再次运行uwsgi服务器。

在我的uwsgi.ini中:

 chmod-socket = 664 uid = www-data gid = www-data 

哇,这个问题需要我几乎一整天的时间!

我用的是uwsgi 2.0.14, nginx 1.10.1, django 1.10

综上所述,最重要的是要确保两个以下的用户socket文件都具有rwx权限:

  1. nginx的用户;
  2. uWSGI的用户;

所以,你可以一一检查。


首先你可以通过刷新url来检查web服务器nginx是否有权限,比如说http://192.168.201.210:8024/morning/ ,而不运行uwsgi。 如果你看到/var/log/nginx/error.log 没有这样的文件或目录 ,像这样:

 2016/10/14 16:53:49 [crit] 17099#0: *19 connect() to unix:///usr/share/nginx/html/test/helloworld.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.201.140, server: belter-tuesday.com, request: "GET /morning/ HTTP/1.1", upstream: "uwsgi://unix:///usr/share/nginx/html/test/helloworld.sock:", host: "192.168.201.210:8024" 

只要创build一个名为helloworld.sock的文件,并且如果在日志文件中看到权限被拒绝 ,则刷新URL并再次检查日志文件,如下所示:

 2016/10/14 17:00:45 [crit] 17099#0: *22 connect() to unix:///usr/share/nginx/html/test/helloworld.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.201.140, server: belter-tuesday.com, request: "GET /morning/ HTTP/1.1", upstream: "uwsgi://unix:///usr/share/nginx/html/test/helloworld.sock:", host: "192.168.201.210:8024" 

这意味着networking服务器nginx并没有读取,写入和执行的全部权限。 所以你可以授予这个文件的权限:

sudo chmod 0777 helloworld.sock

然后,刷新url并再次检查日志文件,如果您在日志文件中看到连接被拒绝 ,如下所示:

 2016/10/14 17:09:28 [error] 17099#0: *25 connect() to unix:///usr/share/nginx/html/test/helloworld.sock failed (111: Connection refused) while connecting to upstream, client: 192.168.201.140, server: belter-tuesday.com, request: "GET /morning/ HTTP/1.1", upstream: "uwsgi://unix:///usr/share/nginx/html/test/helloworld.sock:", host: "192.168.201.210:8024" 

这是一个好兆头,这意味着你的web服务器nginx从现在开始有权使用helloworld.sock文件。


接下来运行uwsgi并检查uwsgi的用户是否有权使用helloworld.sock 。 首先,删除我们之前创build的文件helloworld.sock

运行uwsgi: uwsgi --socket /usr/share/nginx/html/test/helloworld.sock --wsgi-file wsgi.py

如果你看到bind():Permission denied [core / socket.c line 230] ,这意味着uwsgi没有绑定helloworld.sock权限。 这是目录test的问题, helloworld.sock的父目录。

 sudo chmod 0777 test/ 

现在,你可以运行uwsgi成功。

但是,也许你仍然看到502坏门户 ,这是可怕的,我已经看到了一整天。 如果你再次检查error.log文件,你会再次看到这个:

 2016/10/14 17:33:00 [crit] 17099#0: *28 connect() to unix:///usr/share/nginx/html/test/helloworld.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.201.140, server: belter-tuesday.com, request: "GET /morning/ HTTP/1.1", upstream: "uwsgi://unix:///usr/share/nginx/html/test/helloworld.sock:", host: "192.168.201.210:8024" 

怎么了???

检查helloworld.sock文件的细节,你可以看到:

 srwxr-xr-x. 1 belter mslab 0 Oct 14 17:32 helloworld.sock 

uWSGI自动给这个文件755权限。

您可以通过添加--chmod-socket来更改它:

 uwsgi --socket /usr/share/nginx/html/test/helloworld.sock --wsgi-file wsgi.py --chmod-socket=777 

好! 最后,你可以看到:

成功查看网络信息


拿走留言

  1. uwsgi_params文件的位置不重要;
  2. 由于我的nginx用户和uwsgi用户不一样,甚至不在同一个组,所以我需要给777权限helloworld.sock及其父目录test/ ;
  3. 如果您将helloworld.sock文件放在您的主目录中,则您将始终拒绝Permission
  4. 有两个地方你需要设置socket文件path,一个在nginx conf文件中,对我来说是helloworld_nginx.conf ; 一个当你运行uwsgi。
  5. 检查SELinux

这是我的helloworld_nginx.conf文件:

 # helloworld_nginx.conf upstream django { server unix:///usr/share/nginx/html/test/helloworld.sock; # for a file socket # server 127.0.0.1:5902; # for a web port socket (we'll use this first) } # configuration of the server server { # the port your site will be served on listen 8024; # the domain name it will serve for server_name .belter-tuesday.com; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Finally, send all non-media requests to the Django server. location /morning { include uwsgi_params; uwsgi_pass django; } } 

在CentOS上,我尝试了所有这些东西,但仍然无效。 最后,我发现这篇文章:

https://www.nginx.com/blog/nginx-se-linux-changes-upgrading-rhel-6-6/

对于开发机器,我们只需运行:

 semanage permissive -a httpd_t 

但对于一个真正的生产服务器,我还没有弄清楚。 您可能需要尝试上述文章中描述的其他内容。

uwsgi.ini

 [uwsgi] uid = yourusername gid = www-data chmod-socket = 664 

为什么? 因为有时应用程序需要读取或写入文件系统,而无法访问Web服务器可访问的文件系统。 我不想为了适应每种情况而改变一大堆所有权和权限。 我宁愿让我的应用程序像我一样运行,并做它需要做的事情。 将该组设置为www-data并将套接字chmoding为664允许该组写入,从而提供Web服务器与应用程序之间唯一必需的通信窗口。

我解决了这个问题一段时间,发现我的uwsgi.ini文件的uidgid标志没有被应用到.sock文件

您可以运行uwsgi,然后使用linux命令ls -l检查.sock文件的权限。

我的解决scheme是用sudo运行uwsgi

 sudo uwsgi --ini mysite_uwsgi.ini 

.ini文件包含标志:

 chmod-socket = 664 uid = www-data gid = www-data 

然后在.sock文件上的权限是正确的, 502 Bad Gateway错误终于消失了!

希望这可以帮助 :)

这个问题让我发疯。 我的环境是centos7 + nginx + uwsgi,使用unix套接字连接。 接受的答案是真棒,只是在那里添加一些点。

根用户,快速testing

首先,closuresselinux,然后将chmod-socket更改为666,最后使用root启动uwsgi。

喜欢这个

 setenforce 0 #turn off selinux chmod-socket = 666 uwsgi --ini uwsgi.ini 

其他用户

如果使用您创build的其他用户来启动uwsgi,请确保主文件夹下的用户文件夹的权限为755,并且所有者和组相对应。

例如

 chmod-socket = 666 usermod -a -G nginx webuser #add webuser to nginx's group cd /home/ chmod -R 755 webuser chown -R webuser:webuser webuser uwsgi --ini uwsgi.ini --gid webuser --uid webuser 

你需要取消注释

 #server 127.0.0.1:8001; 

从上游块,同样做uwsgi.ini中的变化为

 socket = 127.0.0.1:8001