【问题标题】:Nginx+uWsgi+Django 'Permission denied while connecting to upstream' (socket)Nginx+uWsgi+Django '连接上游时权限被拒绝'(套接字)
【发布时间】:2016-05-25 20:00:12
【问题描述】:

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

我正在按照本网站的教程使用 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 添加到我的用户组并运行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 这将返回 'Permission denied for 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
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

【问题讨论】:

  • 您可以尝试将您的 chdir 更改为 chdir=/home/ec2-user/project 吗?
  • @Selcuk 不,那没用。据我了解,chdir 是项目中应用程序的路径,而不是项目本身。
  • 我总是 chdir 到项目目录,但我不包括 home 参数。
  • 我明白了,我在项目目录中尝试了chdir 并删除了 home 参数,但是当 uwsgi 读取我的 module 参数时,这给了我错误;不要认为这可以解决我的问题。您还有其他我可以尝试的选择吗? @塞尔丘克
  • 抱歉,刚刚发现您的项目名称是awssite。不,我没有任何建议,因为您的配置对我来说似乎没问题。

标签: django sockets nginx uwsgi


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 有效!不幸的是,/var/run 目录没有提供写访问权限,而是将套接字放入/tmp 工作。我还必须将用户 nginx 添加到我的用户组 ec2-user 以便它可以访问放置套接字的目录。快速提问:有没有办法在我的用户组ec2-user 中没有nginx 的情况下让它工作? (只是为了让 nginx 无法访问 ec2-user 可以访问的所有其他文件和目录)
  • 是的,但是你必须chown目录和socket文件,所以用户或组都会匹配nginx一个。
  • 我在nginx 组中添加了ec2-user 用户。我已经运行了chown -R nginx:nginx /tmp/testfolder,并且在我的uwsgi.ini 文件sudo chown-socket=nginx:nginx 中添加了这一行。这是我得到的错误。 ` 删除 unix 套接字时出错,unlink(): Permission denied [core/socket.c line 198] bind(): Permission denied [core/socket.c line 230] `(当我尝试运行 @987654337 时,我得到了这个@) 有什么想法吗?
  • 好的,想通了!只有用户 (nginx) 对/tmp/testfolder 有 rwx 访问权限,所以我修复了它并且它可以工作!它可以在我不必更改套接字文件的情况下工作,所以我对此感到非常高兴。我将使用更新的 uwsgi.ini 文件编辑我的答案,以供其他人查看现在有效的方法。非常感谢!
  • 为了获得适当的安全性,您应该将该文件夹的用户或组分配给您的用户,并将 chmod 更改为 770
猜你喜欢
  • 2014-03-31
  • 2018-09-13
  • 2014-07-19
  • 2022-01-03
  • 2017-07-23
  • 2015-04-30
  • 2015-07-04
  • 2016-05-12
  • 2014-03-16
相关资源
最近更新 更多