【问题标题】:Nginx is throwing an 403 Forbidden on Static FilesNginx 在静态文件上抛出 403 Forbidden
【发布时间】:2013-12-09 13:04:46
【问题描述】:

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

【问题讨论】:

    标签: python django configuration nginx


    【解决方案1】:

    用户 nginx 似乎以 (nginx?) 的身份运行,缺少读取本地文件 /home/ubuntu/virtualenv/myapp/myapp/homelaunch/static/img/templated/home/img.png 的权限。您可能想检查文件权限以及层次结构中目录的权限。

    【讨论】:

    • 我试着做 sudo chmod 777 -R static (只是想看看它是否有任何区别,它没有
    • 因此用户可能缺少统计/列出层次结构中一个或多个目录的权利。这可能最好使用组成员身份来解决,但是如果您在每个目录(home、ubuntu、virtualenv 等)上执行chmod a+x,我猜它会起作用。目录上的可执行位控制是否允许用户列出内容。
    • 它更可能是 /home/ubuntu 上的“缺失”+x(所以不是子目录,而是父目录)。 nginx 以哪个用户身份运行?一个不同的,或多或少的脏修复(取决于设置)可能是gpasswd -a nginx ubuntu(其中 nginx 是用户 nginx 正在运行,ubuntu 是用户私有组用户ubuntu)。
    • ps -ef | grep nginx 应该给出正在运行的 nginx 进程的列表。 ps -ef | grep nginx | cut -d' ' -f1 应该只给你用户(最左边的列)。
    • @GovindaDasu 简短的回答是“可能,是的”(如果您的意思是chmod a+x),但您可以通过仅在给定用户或组的目录上设置+x 来限制它。 ..或者你可以在/home之外建立一个目录结构。如果您的其余设置没问题(也许在不需要的地方禁用 nginx 中的目录列表?),chmod a+x 可能就好了! :)
    【解决方案2】:

    尝试在 nginx.conf 顶部的服务器部分上方指定一个用户。

    user www-data;
    

    【讨论】:

    • 如果我这样做,然后重新启动 nginx,它会说 - /etc/nginx/sites-enabled/myapp:1 中的未知指令“用户”
    • 我在 nginx.conf 中做了这个,但没有解决任何问题
    【解决方案3】:

    在阅读了这么多文章之后,我遇到了几个小时: http://nicholasorr.com/blog/2008/07/22/nginx-engine-x-what-a-pain-in-the-bum/

    对 chmod 整个 django 应用程序目录有评论,所以我做了:

    sudo chmod -R myapp
    

    这解决了它。难以置信!

    感谢那些提供解决方案来解决此问题的人。

    【讨论】:

    • chmod 777 -R myapp 对我有用。以上代码有语法错误。
    • chmod 777 不是解决方案。您正在使您的文件全局读/写/可执行;所有这些都是潜在的坏事。请阅读文件权限,永远不要向任何人建议。
    【解决方案4】:

    对我有用的最低修复是:

    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

    【讨论】:

    • 这对我有用。建议的其余设置已经存在。
    【解决方案5】:

    MacOs El Capitan:在nginx.conf顶部写user username group_name

    我的用户名是卡米尔,所以我写:

    user Kamil staff;
    

    (“员工”这个词在 macOS 中非常重要)。这可以解决问题。之后,您无需更改项目文件夹和文件中的任何权限。

    【讨论】:

      【解决方案6】:

      Web 服务器用户似乎没有静态文件的读取权限。 您可以通过两种方式解决此问题:

      1. (最简单、更安全)以应用用户身份运行 nginx,而不是默认的nginx 用户。为此,请在 nginx.conf

        中添加以下内容
        user your_app_user
        

        your_app_user 替换为适合您应用的unix 用户名。在这种情况下,your_app_user 已经拥有对静态内容的必要权限。

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

      【讨论】:

        【解决方案7】:

        不久前我遇到了同样的问题。这可能是多种因素的组合。我找到了如何通过替换nginx.conf 文件中的用户来修复403 access denied

        • 我使用 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 
        
        • 我在how to deploy your site on 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
        

        还有 tada.. :) 没有更多问题了。

        【讨论】:

        • 谢谢你救了我的命
        猜你喜欢
        • 2015-04-28
        • 2013-01-26
        • 2020-01-21
        • 2018-05-06
        • 2019-01-30
        • 2021-10-04
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多