Nginx在静态文件上抛出403 Forbidden错误

31
我有一个Django应用程序,使用Python 2.7,使用Gunicorn和Nginx。
如果我尝试查看位于以下位置的“static”文件夹中的任何内容,则Nginx会抛出“403 Forbidden Error”错误:
/home/ubuntu/virtualenv/myapp/myapp/homelaunch/static

nginx配置文件(/etc/nginx/sites-enabled/myapp) 包含以下内容:

server {
        listen       80;
        server_name     *.myapp.com;
        access_log /home/ubuntu/virtualenv/myapp/error/access.log;
        error_log /home/ubuntu/virtualenv/myapp/error/error.log warn;
        connection_pool_size 2048;

        fastcgi_buffer_size 4K;
        fastcgi_buffers 64 4k;

        root /home/ubuntu/virtualenv/myapp/myapp/homelaunch/;

        location /static/ {
            alias /home/ubuntu/virtualenv/myapp/myapp/homelaunch/static/;
        }

        location / {
            proxy_pass http://127.0.0.1:8001;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
        }
    }

error.log包含以下内容:

2013/11/24 23:00:16 [error] 18243#0: *277 open() "/home/ubuntu/virtualenv/myapp/myapp/homelaunch/static/img/templated/home/img.png" failed (13: Permission denied), client: xx.xx.xxx.xxx, server: *.myapp.com, request: "GET /static/img/templated/home/img2.png HTTP/1.1", host: "myapp.com", referrer: "http://myapp.com/"

access.log 包含

xx.xx.xx.xxx - - [24/Nov/2013:23:02:02 +0000] "GET /static/img/templated/base/animg.png HTTP/1.1" 403 141 "http://myapp.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101 Firefox/25.0"
xx.xx.xx.xxx - - [24/Nov/2013:23:02:07 +0000] "-" 400 0 "-" "-"

我试图查看位于/static/目录下的.css文件,但是会在源代码中抛出以下错误:

<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.1.19</center>
</body>
</html>
9个回答

35

MacOS El Capitan: 在 nginx.conf 文件的顶部写入 user username group_name

我的用户名是 Kamil,因此我写入:

user Kamil staff;

(在 macOS 中,“staff” 一词非常重要)。这样做就可以解决问题了。此后,您无需更改项目文件夹和文件的任何权限。


1
有人给这个家伙颁个奖吧。 - harryghgim

29

看起来用户 nginx 正在以 (nginx?) 的身份运行,但是缺少读取本地文件 /home/ubuntu/virtualenv/myapp/myapp/homelaunch/static/img/templated/home/img.png 的权限。你可能需要检查文件权限以及层次结构中目录的权限。


2
我尝试执行sudo chmod 777 -R static(只是为了看看是否有任何区别,但实际上没有)。 - CodeTalk
3
用户很可能缺少在层次结构中某个或某些目录的stat/list权限。最好的解决方法可能是使用组成员身份,但如果您对每个目录(home、ubuntu、virtualenv等)执行“chmod a+x”,我猜它会起作用。目录上的可执行位控制用户是否被允许列出其内容。 - bryn
1
很可能是在 /home/ubuntu 上缺少了 +x 权限 (不是子目录,而是父目录)。Nginx 是以哪个用户身份运行的?根据设置,一个更加杂乱的解决方案可能是 gpasswd -a nginx ubuntu(其中 nginx 是 Nginx 的用户身份,ubuntu 是用户 ubuntu 的私有组)。 - bryn
1
ps -ef | grep nginx 应该会给出正在运行的nginx进程列表。 ps -ef | grep nginx | cut -d' ' -f1 只会给你用户(最左边的列)。 - bryn
1
@GovindaDasu 简短的回答是“可能是,是的”(如果你指的是chmod a+x),但你可以通过仅为给定用户或组设置目录上的+x来限制它...或者你可以在/home之外设置一个目录结构。如果你的其余设置都没问题(也许在nginx中禁用不需要的目录列表?),那么chmod a+x可能就足够了! :) - bryn
显示剩余5条评论

13

看起来Web服务器用户没有读取静态文件的权限。你有两种解决方法:

  1. (最简单、更安全)将nginx作为您的应用程序用户而不是默认的nginx用户运行。要这样做,请在nginx.conf中添加以下内容:

user your_app_user

用你的应用程序所需的unix用户名替换your_app_user。在这种情况下,your_app_user已经拥有访问静态内容所需的权限。

  • 另一种方法是将Web服务器用户的权限授予静态目录。


  • 10

    The minimum fix that worked for me is:

    sudo chmod -R 664 /home/ubuntu/virtualenv/myapp/myapp/homelaunch/static/
    sudo chmod -R a+X /home/ubuntu/virtualenv/myapp/myapp/homelaunch/static/
    

    (顺便说一下,在我的情况下,静态文件夹被称为collected_static

    这对我有用。建议的其他设置已经存在了。 - Kishor Pawar

    10
    在这种情况下,最好的解决方案是将www-data添加到用户名组中: gpasswd -a www-data username 为了使更改生效,请重新启动nginx nginx -s reload

    1
    刚解决了我的问题 ✅✅✅ - Gedeon Mutshipayi

    8

    尝试在nginx.conf的顶部,在server段之上指定一个用户。

    user www-data;
    

    2
    如果我这样做,然后重新启动nginx,它会显示 - /etc/nginx/sites-enabled/myapp:1中的未知指令"user"。 - CodeTalk
    1
    我在nginx.conf中尝试了这个,但它并没有解决任何问题。 - CodeTalk
    执行此命令后,我必须重新安装nginx...然后再次运行所有的服务。 - Serhii Zelenchuk

    3

    我曾经遇到过同样的问题,可能是多种因素综合作用的结果。我通过在nginx.conf文件中更改用户来解决了403访问被拒绝的问题。

    • 我在Digital Ocean上使用Ubuntu服务器部署了我的网站。
    • 我在新的Ubuntu服务器上创建了一个新用户,并给予管理员权限。
        adduser newuser
    
        usermod -aG sudo newuser 
    
    • 我更新了我的新服务器并安装了几个软件包。
        sudo apt update
    
        sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl 
    
    • 我按照这篇如何在Digital Ocean上部署您的网站的指导进行操作。
    • 由于我更改了用户并使用新用户ssh登录到我的新服务器,因此需要在nginx.conf中替换用户。默认情况下,nginx.conf的用户是www-data
        user www-data;
    
        worker_processes auto;
    
        pid /run/nginx.pid;
    

    然后我用我的sudo用户替换了它,解决了我的问题。

        user newuser;
    
        worker_processes auto;
    
        pid /run/nginx.pid;
    
    • 然后我重启nginx、gunicorn和postgresql(即使最后一个并不是真正必要的)
        sudo systemctl restart nginx 
    
        sudo systemctl restart gunicorn
    
        sudo systemctl restart postgresql
    

    并且,完成了! :) 没有更多问题。

    谢谢你救了我的命。 - Maninder Singh

    2

    在Ubuntu服务器上修复Django静态文件的403错误。

    1. 运行以下命令 -> gpasswd -a www-data your_proj_username

    2. 重新加载nginx -> nginx -s reload

    3. 检查你的目录chmod权限: /home, /home/proj_dir, /home/proj_dir/static

    • 运行此命令 - stat --format '%a' /home 。结果必须是755
    • 运行此命令 - stat --format '%a' /home/your_proj_dir/static 。结果必须是755
    • 运行此命令 - stat --format '%a' /home/your_proj_dir 。结果必须是750
    1. 如果您有不同的值,可以尝试更改以下内容:
    • sudo chmod 755 /home
    • sudo chmod 755 /home/your_proj_dir/static
    • sudo chmod 750 /home/your_proj_dir
    1. 重新加载项目服务器。这将解决所有权限错误。

    -7

    3
    "chmod 777 -R myapp is worked for me. The above code has syntax error." 翻译为:chmod 777 -R myapp 对我有用。上面的代码存在语法错误。 - atilkan
    18
    chmod 777不是解决方案。这会让你的文件全局可读/可写/可执行;所有这些都有潜在的风险。请了解文件权限,并永远不要向任何人建议这么做。 - kungphu

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接