Nginx 提供静态文件并得到 403 禁止

Posted

技术标签:

【中文标题】Nginx 提供静态文件并得到 403 禁止【英文标题】:Nginx serve static file and got 403 forbidden 【发布时间】: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" error和Nginx 403 forbidden for all files

【问题讨论】:

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

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

    假设我们将站点部署为用户admin,也就是说,她拥有站点目录和其中的所有内容。我们确实想以该用户身份运行 nginx(权限太多)。它可以用于测试,而不是用于生产。 默认情况下,Nginx 以用户nginx 运行workers,即配置包含user nginx 行 默认用户nginx在同名组中:nginx。 我们希望在不更改文件所有权的情况下为用户nginx 提供最小权限。这似乎是最安全的幼稚选项。

    为了提供静态文件,文件夹层次结构中所需的最低权限(请参阅组权限)应该是这样的(使用命令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

    接下来,如何得到这张漂亮的图片?要更改 dirs 的组所有权,我们首先应用 sudo chown :nginx /home/admin/WebProject/site/static,然后重复该命令从右侧一个接一个地剥离 dirs。

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

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

    最后,更改 /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;
    

【讨论】:

以上是关于Nginx 提供静态文件并得到 403 禁止的主要内容,如果未能解决你的问题,请参考以下文章

官方 nginx docker 在提供静态文件时给出 403 Forbidden

Heroku 403 禁止静态 js 文件

Nginx 在静态文件上抛出 403 Forbidden

使用 Nginx + PHP-FPM 拒绝访问 PHP 文件 (403)

关于nginx访问 静态文件 403 的错误

nginx 代理静态资源报 403