84

只是想帮助别人。是的,您只想使用 nginx 提供静态文件,并且在nginx.conf中一切正常:

location /static {
       autoindex on;
       #root /root/downloads/boxes/;
       alias /root/downloads/boxes/;
      }

但是,最后,你失败了。您从浏览器收到“403 禁止”...

----------------------------------------答案如下: ------ ----------------------------------

解决方案非常简单:


方式 1:以 '/root/downloads/boxes/' 所有者的用户身份运行 nginx

nginx.conf中:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;

是的,在第一行“ #user noboy; ”,只需删除“ # ”,并将“ nobody ”更改为您自己在Linux/OS X中的用户名,即更改为“ root ”进行测试。重启nginx。

注意,你最好不要以root身份运行nginx!这里只是为了测试,对黑客来说是危险的。

有关更多参考,请参阅nginx(引擎 X)- BUM 中的痛点![13:权限被拒绝]


方式 2:将 '/root/downloads/boxes/' 所有者更改为 'www-data' 或 'nobody'

终端

ps aux | grep nginx

获取运行 nginx 的用户名。它应该是'www-data''nobody'由 nginx 的版本决定。然后点击终端(例如使用'www-data'):

chown -R www-data:www-data /root/downloads/boxes/

------------------更重要的一点是: -------------- ----------------

这些父目录"/""/root""/root/downloads"应该将执行(x)权限授予'www-data''nobody'。IE

ls -al /root
chmod o+x /root
chmod o+x /root/downloads

有关更多参考,请参阅解决“403 Forbidden”错误所有文件都禁止 Nginx 403

4

11 回答 11

77

您应该授予 nginx 读取文件的权限。这意味着您应该授予运行 nginx 进程的用户读取文件的权限。

运行 nginx 进程的这个用户可以使用 nginx 配置中的user指令进行配置,通常位于顶部的某处nginx.conf

user www-data

http://wiki.nginx.org/CoreModule#user

您给的第二个参数user是组,但如果您不指定它,它使用与用户相同的参数,因此在我的示例中,用户和组都是www-data.

现在,您要使用 nginx 提供的文件应该具有正确的权限。Nginx 应该具有读取文件的权限。您可以向组www-data授予对文件的读取权限,如下所示:

chown :www-data my-file.html

http://linux.die.net/man/1/chown

您可以更改文件的chown用户和组所有者。在此命令中,我只更改组,如果您也更改用户,您将在冒号之前指定用户名,例如chown www-data:www-data my-file.html. 但是正确设置组权限应该足以让 nginx 能够读取文件。

于 2013-05-29T12:34:19.957 回答
25

由于 Nginx 直接处理静态文件,它需要访问适当的目录。我们需要为我们的主目录赋予它可执行权限。

最安全的方法是将 Nginx 用户添加到我们自己的用户组中。然后,我们可以将可执行权限添加到主目录的组所有者,从而为 Nginx 提供足够的访问权限来提供文件:

CentOS / Fedora

  sudo usermod -a -G your_user nginx

  chmod 710 /home/your_user 

SELinux设置为全局许可模式,运行:

sudo setenforce 0

欲了解更多信息,请访问 https://www.nginx.com/blog/using-nginx-plus-with-selinux/

Ubuntu / Debian

  sudo usermod -a -G your_user www-data

  sudo chown -R :www-data /path/to/your/static/folder
于 2017-09-06T20:13:39.867 回答
10

接受答案

sudo chown -R :www-data static_folder

用于更改该文件夹中所有文件的组所有者

于 2016-11-26T08:47:52.550 回答
8

在深入研究了非常有用的答案后,决定收集与权限相关的所有内容作为食谱。具体来说,具有最大安全性(=最小权限)的最简单解决方案。

  1. 假设我们将站点部署为 user admin,即她拥有站点目录和其中的所有内容。我们不想以该用户身份运行 nginx(权限太多)。它可以用于测试,而不是用于生产。
  2. 默认情况下,Nginx 以用户身份运行工作人员nginx,即 config 包含行user nginx
  3. 默认情况下,用户nginx在同名组中:nginx.
  4. 我们希望在nginx不更改文件所有权的情况下为用户提供最小权限。这似乎是最安全的幼稚选择。
  5. 为了提供静态文件,文件夹层次结构中所需的最低权限(请参阅组权限)应该是这样的(使用命令namei -l /home/admin/WebProject/site/static/hmenu.css):

    dr-xr-xr-x root root /
    drwxr-xr-x root root home
    drwxr-x--- admin nginx admin
    drwx--x--- admin nginx WebProject
    drwx--x--- admin nginx site
    drwx-- x--- 管理员 nginx 静态
    -rwxr----- 管理员 nginx hmenu.css

  6. 接下来,如何获得这幅美丽的画面?要更改 dirs 的组所有权,我们首先应用sudo chown :nginx /home/admin/WebProject/site/static然后重复该命令,从右侧一个接一个地剥离 dirs。

  7. 要更改目录的权限,我们应用sudo chmod g+x /home/admin/WebProject/site/static并再次剥离目录。

  8. 更改 /static 目录中文件的组:sudo chown -R :nginx /home/admin/WebProject/site/static

  9. 最后,更改 /static 目录中文件的权限:sudo chmod g+r /home/admin/WebProject/site/static/*

(当然可以创建一个专门的组并更改用户名,但这会用不重要的细节掩盖叙述。)

于 2017-05-15T17:29:01.020 回答
7

对我来说是 SElinux,我必须运行以下命令:(AWS 上的 RHEL/Centos)

sudo setsebool -P httpd_can_network_connect on 
chcon -Rt httpd_sys_content_t /var/www/
于 2019-08-10T16:34:00.820 回答
5

我在一个 Django 项目中遇到了这个问题。更改用户权限和组不起作用。但是,将整个静态文件夹从我的项目移动到 /var/www 确实如此。

将您的项目静态文件复制到 /var/www/static

# cp -r /project/static /var/www/static

将 nginx 指向正确的目录

# sudo nano /etc/nginx/sites-available/default

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        location /static/ {
                root /var/www;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/run/gunicorn.sock;
        }

}

测试 nginx 配置并重新加载

# sudo nginx -t
# sudo systemctl reload nginx
于 2021-05-02T01:46:49.630 回答
3

在 nginx 中设置 root 用户可能非常危险。必须为所有文件层次结构设置权限可能很麻烦(想象文件夹的完整路径在 10 多个子文件夹下)。

我要做的是在 /usr/share/nginx/any_folder_name 下镜像您要共享的文件夹,并具有 nginx 的配置用户(通常是 www-data)的权限。你可以用 bindfs 来做。

在你的情况下,我会这样做:

sudo bindfs -u www-data -g www-data /root/downloads/boxes/ /usr/share/nginx/root_boxes

它将 /root/downloads/boxes 挂载到 /usr/share/nginx/root_boxes 中,并具有用户 www-data 的所有权限。现在您在位置块配置中设置该路径

location /static {
   autoindex on;
   alias /usr/share/nginx/root_boxes/;
  }
于 2019-04-10T22:40:17.503 回答
3

尝试@gitaarik 接受的答案,如果它仍然给出403 Forbidden404 Not Found并且您的位置目标被/继续阅读。

我也遇到了这个问题,但是上面提到的权限更改都没有解决我的问题。通过添加root指令解决了这个问题,因为我正在定义根位置 ( ) 并且在我应该/使用该指令时意外使用了该指令。aliasroot

配置被接受,但给出403 Forbidden,或者404 Not Found如果为 启用了自动索引/

location / {
  alias /my/path/;
  index index.html;
}

正确定义:

location / {
  root /my/path/;
  index index.html;
}
于 2019-10-18T14:48:22.057 回答
0

很长一段时间以来,我一直在努力解决这个 403 问题。我正在使用 DigitalOcean 的 CentOS。

我以为解决问题只是在 /etc/selinux/config 中设置 SELINUX=disabled 但我错了。不知何故,我搞砸了我的水滴。

这对我有用!sudo chown nginx:nginx /var/www/mydir

于 2019-12-18T19:58:57.867 回答
0

我的 nginx 以 nginx 用户和 nginx 组的身份运行,但将 nginx 组添加到公用文件夹对我不起作用。

我以 nginx 用户的身份检查权限。

su nginx -s /bin/bash

我发现我需要为完整路径添加组。我的路径从 /root 开始,所以我需要执行以下操作:

chown -R :nginx /root
于 2021-12-16T23:57:47.780 回答
0

你可以像做的那样做:

CentOS / Fedora

sudo usermod -a -G your_user_name nginx

chmod 710 /home/your_user_name 

Ubuntu / Debian

sudo usermod -a -G your_user_name www-data

sudo chown -R :www-data /path/to/your/static_folder

在为您的站点提供服务的 nginx 文件中,确保您的位置static如下所示:

location /static/ {
        root /path/to/your/static_folder;
    }
于 2021-12-21T12:57:18.850 回答