连接到上游时,Nginx + uWsgi + Django'权限被拒绝'(套接字)

时间:2016-02-15 01:57:04

标签: django sockets nginx uwsgi

我已经在SO上看到了很多关于这个主题的问题,我尝试了尽可能多的方法,但它仍然没有为我解决问题,所以我希望这篇文章可能会有所帮助。 / p>

我正在关注本网站的教程,以便通过uWSGI在Nginx上设置Django:http://www.oliverelliott.org/article/computing/tut_setup_nginx_django/

uwsgi.ini文件

[uwsgi]
chdir=/home/ec2-user/project/awssite
module=awssite.wsgi
home=/home/ec2-user/project
master=true
processes=2
socket=/home/ec2-user/project/awssite/awssite.socket
chmod-socket=666
vacuum=true

等/ nginx的/ / awssite_nginx.conf启用位点-

upstream django {
    server unix:///home/ec2-user/project/awssite/awssite.socket;
}
server {
listen          8080;
    server_name     localhost;
    charset utf-8;

    #max upload size
    client_max_body_size 75M;

    #Django media
    location /media {
            alias /home/ec2-user/project/awssite/awssite/media;
    }

    location /static {
            alias /home/ec2-user/project/awssite/awssite/static; 
    }

    location /favicon.ico {
            log_not_found off;
    }

    location / {
            uwsgi_pass django;
            include /home/ec2-user/project/awssite/uwsgi_params;
    }
}

这是/var/log/nginx/error.log

中的错误代码
2016/02/15 01:21:22 [crit] 22159#0: *3 connect() to unix:///home/ec2-user/project/awssite/awssite.socket failed (13: Permission denied) while connecting to upstream, client: CLIENT_IP, server: localhost, request: "GET /menu/ HTTP/1.1", upstream: "uwsgi://unix:///home/ec2-user/project/awssite/awssite.socket:", host: "HOST_IP:8080"

注意:CLIENT_IP& HOST_IP是IP地址值。

这些是我尝试过的,没有用
1. chmod 755主目录并运行uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=666

2.将用户 nginx 添加到我的用户组并运行uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664

3.通过添加这些新行来改变ini文件
chown-socket=ec2-user:nginx uid=nginx gid=nginx然后运行uwsgi --ini uwsgi.ini这将返回'允许拒绝chown'但是当我使用sudo运行命令时,我得到sudo: uwsgi: command not found(uWSGI在系统范围内安装)

4.将所有文件放在不同的目录中(在用户ec2-user之外),但这不允许我访问它们,除非我以root运行,即使它不起作用登记/> 5.使用参数uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664/666 --uid nginx --gid nginx运行--chown-socket=nginx:nginx 注意:664/666意味着我尝试了两种权限

6.重命名nginx.conf.default和nginx.conf.rpmnew文件(以便nginx读取的唯一conf文件为nginx.conf

请问有人可以解释我如何解决这个问题?我将继续添加我尝试过的方法,而不是在我处理这个问题时没有解决这个问题。谢谢:))

编辑:感谢@GwynBleidD回答,我终于明白了。 这是有效的:

将我的套接字文件保存在/tmp中 等/ nginx的/ / awssite_nginx.conf启用位点-

upstream django {
    server unix:///tmp/djangosocket/awssite.socket;
}
....

uwsgi.ini文件

[uwsgi]
chdir=/home/ec2-user/project/awssite
module=awssite.wsgi
home=/home/ec2-user/project
master=true
processes=2
socket=/tmp/djangosocket/awssite.socket
chmod-socket=666
vacuum=true

我将ec2-user(登录用户)添加到了群组nginx 我相应地更改了文件权限 chown -R ec2-user:nginx djangosocket
chmod g+rwx djangosocket

1 个答案:

答案 0 :(得分:7)

如果您的nginx服务器无法访问uWSGI套接字,请尝试执行以下步骤:

  1. 请勿将您的socked放入系统中任何用户的主目录中,尤其是root!某些unix操作系统默认会阻止访问主目录,除了所有者那个目录和root。将nginx用户添加到该用户的私有组(对于大多数系统,每个用户都拥有自己的主组)可以提供帮助,但它几乎不会对root用户起作用。

  2. 检查您的nginx服务器(或您正在使用的任何其他http服务器)运行的用户和组。有时为www-data,有时为nginx,有时为其他内容。创建套接字时,请确保用户名将匹配运行uWSGI服务器的用户名和uWSGI运行时的组名匹配组(或者您可以交换它)。

  3. 检查您的套接字权限是否至少为660.不需要为任何人授予权限,所以不要这样做。

  4. 检查您的nginx和uWSGI是否都有权访问放置套接字的目录以及所有父目录。

  5. 套接字文件的好地方是/var/run目录(对于某些系统,它是/run或两者都有)。它通常作为ramdisk(tmpfs)安装,并且对于系统中的任何人都是可写的,因此每个用户都可以在这里创建套接字(并访问它们)。如果由于某种原因无法在您的系统中访问,您也可以尝试/tmp目录。

    如果您还要从主目录中直接从nginx提供静态文件,请考虑将nginx添加到您的个人组,这样它就可以对您的主目录和静态文件具有读取权限。