Ubuntu 上的 nginx 权限被拒绝

问题描述 投票:0回答:3

我正在尝试按照本指南使用uWSGI和nginx设置我的Django应用程序。我能够使用 Django 的开发服务器运行我的应用程序,并直接从 uWSGI 提供服务。

我在大学管理的 Ubuntu 16.04 虚拟机上运行所有内容,并且我的用户拥有

sudo
访问权限。


我的问题:
当到达本教程的这一点并尝试获取图像时,我从 nginx 收到 403 错误。
下一部分的结果是 502。

/var/log/nginx/error.log
显示

连接到上游时,连接到 unix:///me/myproject/media/image.jpg 失败(13:权限被拒绝)

连接到上游时,连接到 unix:///me/myproject/project.sock 失败(13:权限被拒绝)

分别适用于 403 和 502。

我已经阅读了多个问题和指南(这里一个这里另一个另一个,这不是全部),更改了我的权限,甚至将我的

.sock
移动到另一个文件夹(其中之一) SO答案建议)。

我还能尝试什么?


更新:

我在评论中提到了这一点,但我已经进一步了解了bit。问题的一部分是,显然,我的虚拟机上的

/home
目录是 NFS,这会搞乱很多权限。

我做了什么:

  • 我已经在
    /var/www/myproject/
  • 设置了我的项目
  • 奔跑
    chown -R me:www-data myproject
  • 奔跑
    chmod -R 764 myproject

我的新成果:

  • 没有运行 nginx:
    • uwsgi --http :8000 --module myproject.wsgi

      工作完美
  • nginx 运行时:
    • uwsgi --socket myproject.sock --module myproject.wsgi --chmod-socket=664

      给我502
    • uwsgi --ini myproject.ini

      给我502

所以现在已经不是一般的权限问题了,绝对是nginx的问题...


更新#2:
目前,当

other
对套接字具有
read-write
权限以及对项目其余部分的
read-execute
权限时,一切正常。
所以 nginx 没有被识别,因为它应该......我已经仔细检查过,nginx 正在以
www-data
用户身份运行,这是我的整个项目的组所有者,并且具有
read-execute
权限,就像
other
现在有。


这是我的(更新)

nginx.conf

# myproject_nginx.conf

# the upstream component nginx needs to connect to
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    server unix:///var/www/myproject/myproject.sock;
    # 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      8000;
    # the domain name it will serve for
    server_name my.ip.goes.here; # 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 /var/www/myproject/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /var/www/myproject/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     /var/www/myproject/uwsgi_params; # the uwsgi_params file you installed
    }
}

这是我的(更新)

uwsgi.ini

# myproject_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir          = /var/www/myproject
# Django's wsgi file
module         = myproject.wsgi
# the virtualenv (full path)
home           = /var/www/myenv

# process-related settings
master         = true
# maximum number of worker processes
processes      = 10
# the socket (full path)
socket         = /var/www/myproject/myproject.sock
# ... with appropriate permissions - may be needed
chmod-socket   = 666
uid            = me
gid            = www-data
# clear environment on exit
vacuum         = true
django ubuntu nginx permissions uwsgi
3个回答
1
投票

根据我的经验,Web 服务器周围的大多数权限问题都是通过访问 root 拥有的文件来实现的,但 Apache (nginx) 是在

www-data
用户下运行的。

尝试跑步

sudo chown www-data -R /path/to/your/data/folder


0
投票

正如教程所说:

您可能还需要将您的用户添加到 nginx 的组中(这可能是 www-data),反之亦然,以便 nginx 可以读取和写入您的 插座正确。

尝试一下,看看会发生什么。

同样,我不建议您使用 sudo 或 root 执行操作,而是以普通用户身份执行操作并在必要时授予权限,否则您可能最终会遇到 Nginx 或 uWSGI 需要使用 sudo 执行某些操作的情况文件,它们归 root 所有。


0
投票

解决方案 无论选择哪种解决方案,请记住重新启动 Nginx

sudo /etc/init.d/nginx restart

同样使用--chmod-socket=666权限执行

uwsgi --socket project.sock --module project.wsgi --chmod-socket=666

1。将 .sock 文件和文件夹分配给 www-data 组

在我看来,这是最好的选择,因为它只能访问这些文件夹,而没有创建项目的用户组有权访问的所有内容的权限(正如我们在第二点中所做的那样)。 我们必须将 www-data 指定为 .sock 文件和直至用户名的文件夹的组。

示例:

sudo chown :www-data /home/daniel/
sudo chown :www-data /home/daniel/project
sudo chown :www-data /home/daniel/project/project.sock

2。将 www-data 用户添加到创建 .sock 的用户组中 第一个也是推荐的解决方案是将默认的 Nginx 用户添加到创建项目的用户组中:

这将允许 www-data 用户(由 Nginx 使用)访问 daniel 拥有的文件和目录。

sudo usermod -aG daniel www-data

将 Nginx 用户 (www-data) 添加到您的用户组 (daniel) 可能会产生一些安全隐患,具体取决于您的系统配置方式以及您的用户 (daniel) 拥有的权限。

3.更改 /etc/nginx/nginx.conf 中的用户 与之前的情况类似,将 www-data 用户更改为创建项目的用户会更宽松。 确保 Nginx 在正确的用户下运行。通常,Nginx 在基于 Debian/Ubuntu 的系统上运行在 www-data 用户下,在基于 CentOS/Red Hat 的系统上运行在 nginx 下。

您可以在 Nginx 配置文件(/etc/nginx/nginx.conf)中检查这一点:

user www-data;

重新启动服务

更改权限和配置后,重新启动 Nginx 和 uWSGI 以使更改生效:

sudo systemctl restart nginx 
sudo systemctl restart uwsgi
© www.soinside.com 2019 - 2024. All rights reserved.