Nginx提供静态文件并禁止403

isa*_*ent 47 nginx uwsgi

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

location /static {
       autoindex on;
       #root /root/downloads/boxes/;
       alias /root/downloads/boxes/;
      }
Run Code Online (Sandbox Code Playgroud)

但是,最后,你失败了.你从浏览器得到"403禁止"......

---------------------------------------- 下面的答案: ------ ----------------------------------

解决方案非常简单:


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

nginx.conf中:

?user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

终端:

ps aux | grep nginx
Run Code Online (Sandbox Code Playgroud)

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

chown -R www-data:www-data /root/downloads/boxes/
Run Code Online (Sandbox Code Playgroud)

------------------------------ 一件更重要的事情是: -------------- ----------------

这些父目录"/","/ root","/ root/downloads"应该赋予'www-data''nobody'执行权限(x).即

ls -al /root
chmod o+x /root
chmod o+x /root/downloads
Run Code Online (Sandbox Code Playgroud)

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

git*_*rik 59

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

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

user www-data
Run Code Online (Sandbox Code Playgroud)

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

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

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

chown :www-data my-file.html
Run Code Online (Sandbox Code Playgroud)

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

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

  • "用户root"让问题消失了,再也没有表现出来.(可能过度换气了!;-) (8认同)
  • 这可能是一个简单的修复,但以root身份运行程序可能很危险.如果在Nginx中存在漏洞,并且它以root身份运行,那么破解者可能会接管完整的操作系统. (4认同)

Jas*_*son 15

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

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

# cp -r /project/static /var/www/static
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

测试 nginx 配置并重新加载

# sudo nginx -t
# sudo systemctl reload nginx
Run Code Online (Sandbox Code Playgroud)

  • 除了这个之外,每个答案都不起作用。太感谢了! (2认同)

san*_*des 10

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

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

sudo usermod -a -G your_user nginx

chmod 710/home/your_user

  • 谢谢!我在网上搜索了几个小时,只有你的答案有帮助。欣赏它! (4认同)
  • “Ubuntu”解决方案导致我现在无法再通过 ssh 登录了! (2认同)

小智 7

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

  1. 假设我们将站点部署为 user admin,即她拥有站点目录和其中的所有内容。我们希望因为这个用户(太多的权限)运行Nginx的。它可以用于测试,而不是用于生产。
  2. 默认情况下,Nginx 以用户身份运行 worker 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站点
    drwx-- x--- admin nginx static
    -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/*

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


mas*_*one 6

接受的答案

sudo chown -R :www-data static_folder

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


Joe*_*Joe 6

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

sudo setsebool -P httpd_can_network_connect on 
chcon -Rt httpd_sys_content_t /var/www/
Run Code Online (Sandbox Code Playgroud)

  • 只是“chcon -Rt httpd_sys_content_t /var/www/”就像一个魅力 (2认同)

roj*_*j4s 5

在 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
Run Code Online (Sandbox Code Playgroud)

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

location /static {
   autoindex on;
   alias /usr/share/nginx/root_boxes/;
  }
Run Code Online (Sandbox Code Playgroud)