Nginx+uWsgi+Django 'Permission denied while connecting to upstream'(套接字)

Nginx+uWsgi+Django 'Permission denied while connecting to upstream' (socket)

我已经看到很多关于这个主题的问题,我已经尝试了尽可能多的方法,但它仍然没有解决我的问题所以我希望这个 post 可能会有帮助。

我正在按照本网站的教程使用 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

etc/nginx/sites-enabled/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到我的用户组和运行ninguwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664

3. 通过添加这些新行来更改 ini 文件
chown-socket=ec2-user:nginx uid=nginx gid=nginx 然后 运行ning uwsgi --ini uwsgi.ini 这个 returns 和 'Permission denied for chown' 但是当我 运行 带有 sudo 的命令时,我得到 sudo: uwsgi: command not found(系统范围内安装uWSGI)

4. 将所有文件放在不同的目录中(在用户 ec2-user 之外),但这不允许我访问它们,除非我 运行 为 root,即使这样它也不起作用

5. 运行ning 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
etc/nginx/sites-enabled/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

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

  1. 不要将您的 socked 放在系统中任何用户的主目录中,尤其是 root!一些 unix 操作系统默认阻止访问除该目录的所有者和 root 之外的任何人的主目录。将 nginx 用户添加到该用户的私有组(对于大多数系统,每个用户都有自己的主要组)可以帮助解决这个问题,但它几乎永远不会对 root 起作用。

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

  3. 检查你的socket权限至少是660,没有必要给任何人权限,所以不要那样做。

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

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

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