【问题标题】:Nginx serve static file and got 403 forbiddenNginx 提供静态文件并得到 403 禁止
【发布时间】:2013-05-24 09:55:54
【问题描述】:

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

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

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

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

解决方法很简单:


方式一:以 '/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 (engine X) – What a Pain in the BUM! [13: Permission denied]


方式 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"应该赋予execute(x)权限'www-data''nobody'。即

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

更多参考,见Resolving "403 Forbidden" errorNginx 403 forbidden for all files

【问题讨论】:

  • 你也可以把文件权限给nginx所在的组,这是通常做的,也更合乎逻辑一点
  • @rednaw,我也是stackoverflow的新手,很抱歉之前的评论,是的,我在你回答之后做了,但我又失败了。我确实将所有者更改为文件,但浏览器显示“403 禁止”。
  • 你重启nginx了吗?此外,nginx 有一个错误日志文件(通常在/var/log/nginx/),您可以在其中找到更多信息,例如检查错误和访问日志。顺便说一句,也许你应该评论我的答案而不是你的问题。
  • @no_answer_not_upvoted,嘿伙计,小心“root”,如果黑客入侵你的 nginx 服务器,root 将成为黑客。
  • 请不要以root身份运行nginx!

标签: nginx uwsgi


【解决方案1】:

您应该授予 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能够读取文件。

【讨论】:

  • user root 让问题消失了,再也不会出现。 (可能开始换气过度!;-)
  • 这可能很容易解决,但以 root 身份运行程序可能很危险。如果 Nginx 中存在 exploid,并且它以 root 身份运行,那么破解者可能能够接管整个操作系统。
  • 看我的过度换气评论。是的,这是一个值得关注的问题,但通常机器专用于 nginx 或没有关键信息,所以即使破解者接管它也没什么大不了的。如果你在一个服务器上运行 nginx,它确实是有效的,它也有你所有的公司 IP 和你的电子邮件
  • 顺便说一句,我确实赞成您的回答,因为它有助于您确实需要做正确的事情
【解决方案2】:

由于 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

【讨论】:

  • 谢谢!我在网上搜索了几个小时,只有你的回答有帮助。欣赏!!
  • “Ubuntu”解决方案导致我现在无法通过 ssh 登录!
  • ubuntu 解决方案对我有用,谢谢!
【解决方案3】:

接受答案

sudo chown -R :www-data static_folder

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

【讨论】:

  • 一个非常直接的答案。
【解决方案4】:

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

  1. 假设我们将站点部署为用户admin,也就是说,她拥有站点目录和其中的所有内容。我们确实想以该用户身份运行 nginx(权限太多)。它可以用于测试,而不是用于生产。
  2. 默认情况下,Nginx 以用户nginx 运行workers,即配置包含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 根根目录
    drwxr-x--- 管理员 nginx 管理员
    drwx---x--- 管理 nginx WebProject
    drwx---x--- 管理 nginx 站点
    drwx---x--- 管理员 nginx 静态
    -rwxr----- admin 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/*

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

【讨论】:

    【解决方案5】:

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

    sudo setsebool -P httpd_can_network_connect on 
    chcon -Rt httpd_sys_content_t /var/www/
    

    【讨论】:

    • 谢谢!我在远程开发盒上使用 Fedora,不习惯 SELinux。这正是我正在寻找的评论:)
    • 只是chcon -Rt httpd_sys_content_t /var/www/ 就像一个魅力
    • 在 Centos 7 上使用 Nginx 运行 Flask 没有问题。最近更新到 Almalinux,从那时起禁止了 403 并撕毁了我的头发。更改用户权限没有任何好处。这终于对我有用,但在我的静态文件夹上使用了命令而不是 /var/ww/!谢谢!
    【解决方案6】:

    我在一个 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
    

    【讨论】:

    • 除此之外,每个答案都不起作用。非常感谢!
    • 同样,这个答案是唯一适合我的答案。非常感谢。
    【解决方案7】:

    在 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/;
      }
    

    【讨论】:

    • 在使用 chmod 等测试不同的设置之后,这在我看来是最合适(也是最安全)的方式。终于为我工作了。谢啦! :)
    • 这个方法对我很有帮助。我更改了静态文件夹的所有权和权限,但显然我的工作路径不允许 Nginx 访问。我不想在整个根目录向上授予 www-data 用户组权限。很好的解决方案。
    【解决方案8】:

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

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

    接受配置,但如果为 / 启用自动索引,则提供 403 Forbidden404 Not Found

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

    正确定义:

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

    【讨论】:

      【解决方案9】:

      我在这个 403 问题上苦苦思索了很长一段时间。 我正在使用 DigitalOcean 的 CentOS。

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

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

      【讨论】:

        【解决方案10】:

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

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

        su nginx -s /bin/bash
        

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

        chown -R :nginx /root
        

        【讨论】:

          【解决方案11】:

          你可以像以前那样做:

          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;
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-03
            • 2018-02-20
            • 2015-03-13
            • 2015-04-25
            • 2015-04-02
            • 2018-10-23
            相关资源
            最近更新 更多