Nginx提供静态文件并禁止403

时间:2013-05-29 08:21:11

标签: nginx uwsgi

只想帮助别人。是的,你只想使用nginx提供静态文件,你在 nginx.conf 中完成了一切:

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

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

---------------------------------------- 以下答案: ----------------------------------------

解决方案非常简单:


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

nginx.conf

#user  nobody;
worker_processes  1;

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

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

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

有关详情,请参阅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”应该赋予执行(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

9 个答案:

答案 0 :(得分:53)

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

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

user www-data

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

你给user的第二个参数是组,但是如果你没有指定它,它会使用与用户相同的参数,所以在我的例子中,用户和组都是{{1 }}

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

www-data

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

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

答案 1 :(得分:9)

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

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

  

sudo usermod -a -G your_user nginx

     

chmod 710 / home / your_user

答案 2 :(得分:6)

接受回答

  

sudo chown -R :www-data static_folder

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

答案 3 :(得分:3)

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

  1. 假设我们以用户admin部署网站,也就是说,她拥有网站目录及其中的所有内容。我们想要以此用户身份运行nginx(权限太多)。它可以用于测试,而不是用于测试。
  2. 默认情况下,Nginx以用户nginx的身份运行工作人员,即配置包含行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 --- admin nginx static
    -rwxr ----- admin nginx hmenu.css

  6. 接下来,如何拍出这张美丽的照片?要更改dirs的组所有权,我们首先应用sudo chown :nginx /home/admin/WebProject/site/static,然后重复从右侧逐个剥离dirs的命令。

  7. 要更改dirs的权限,我们会应用sudo chmod g+x /home/admin/WebProject/site/static并再次删除dirs。

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

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

  10. (当然,人们可以创建一个专门的小组并更改用户名,但这会使叙述模糊不清的细节。)

答案 4 :(得分:2)

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

col()

答案 5 :(得分:2)

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

答案 6 :(得分:0)

在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

它将使用用户www-data的所有权限将/ root / downloads / boxes装入/ usr / share / nginx / root_boxes。现在,您可以在位置阻止配置中设置该路径

location /static {
   autoindex on;
   alias /usr/share/nginx/root_boxes/;
  }

答案 7 :(得分:0)

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

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

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

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

正确的定义:

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

答案 8 :(得分:0)

在这个403问题上,我花了很长时间。 我正在使用DigitalOcean的CentOS。

我认为要解决此问题只是在/ etc / selinux / config中设置SELINUX = disabled,但我错了。不知何故,我拧了滴。

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