Django app + nginx 无法服务器静态文件

问题描述 投票:0回答:3

我有一个非常不寻常的问题,我的静态文件都没有加载

404
被抛出。需要注意的是,我使用的生产环境设置了
DEBUG=False
,因此静态文件完全由
nginx
服务器提供服务。

设置/生产.py

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
STATIC_URL = '/static/'
DEBUG = TEMPLATE_DEBUG = False

nginx/启用站点/myapp

server {
    listen   80; ## listen for ipv4; this line is default and implied
    server_name myapp.com;
    access_log /var/log/nginx/myapp.log;
    error_log /var/log/nginx/myapp.log;

    root /home/apps/myapp/;

    location / {
            gzip_static on;
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:3031;
    }

    location /static/ { # STATIC_URL
            alias /home/apps/myapp/static/; # STATIC_ROOT
            expires 30d;
    }
    location /media/ { # MEDIA_URL
            alias /home/apps/myapp/media/; # MEDIA_ROOT
            expires 30d;
    }
}

我的应用程序日志

2014/04/08 04:20:11 [error] 22178#0: *590 open() "/home/apps/myapp/staticgrappelli/stylesheets/mueller/grid/output.css" failed (2: No such file or directory), client: 77.89.196.6, server: myapp.com, request: "GET /static/grappelli/stylesheets/mueller/grid/output.css HTTP/1.1", host: "myapp.com", referrer: "http://myapp.com/admin/"
77.89.196.6 - - [08/Apr/2014:04:20:11 +0200] "GET /static/grappelli/stylesheets/mueller/grid/output.css HTTP/1.1" 404 200 "http://myapp.com/admin/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"

请注意,在此示例中,我的静态根

/
和应用程序静态文件
/home/apps/myapp/static
之间缺少
grappelli/stylesheets/mueller/grid/output.css

有谁知道为什么会发生这种情况以及如何解决它?

更新(解决方案)

好的,问题是

Django's
静态文件默认从
www.myapp.com/static/
文件夹提供,因此没有理由在
/static/
配置文件中指定
nginx
文件夹。因此,如果其他人有同样的问题,只需从
nginx/sites-enabled/myapp
文件中删除以下部分即可:

location /static/ { # STATIC_URL
        alias /home/apps/myapp/static/; # STATIC_ROOT
            expires 30d;
        }
        location /media/ { # MEDIA_URL
            alias /home/apps/myapp/media/; # MEDIA_ROOT
            expires 30d;
        }
python django nginx static
3个回答
1
投票

好的,问题是

Django's
静态文件默认从
www.myapp.com/static/
文件夹提供,因此没有理由在
/static/
配置文件中指定
nginx
文件夹。因此,如果其他人有同样的问题,只需从
nginx/sites-enabled/myapp
文件中删除以下部分即可:

location /static/ { # STATIC_URL
        alias /home/apps/myapp/static/; # STATIC_ROOT
            expires 30d;
        }
        location /media/ { # MEDIA_URL
            alias /home/apps/myapp/media/; # MEDIA_ROOT
            expires 30d;
        }

0
投票

你在你的服务器上运行过 python manage.pycollectstatic 吗?

确保文件位于静态根目录中。


0
投票

1 - 确保您的主要

urls.py
包含
static
media
路线,它应该如下所示:

$ nano /home/myuser/apps/myapp/urls.py
----
urlpatterns = [
    path('admin/', admin.site.urls),
    # here goes your other routes ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2 - 确保

STATIC_ROOT
STATIC_URL
MEDIA_ROOT
MEDIA_URL
在您的
settings.py
中定义:

$ nano `/home/myuser/apps/myapp/settings.py`
----
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = 'static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = 'media/'

3 - 确保您的

static
media
路径对于 Nginx 来说是正确的:

`$ sudo nano /etc/nginx/sites-available/myapp`
----
# STATIC_URL
location /static/ { 
    alias /home/myuser/apps/myapp/static/;
    expires 30d;
}

# MEDIA_URL
location /media/ { 
    alias /home/myuser/apps/myapp/media/; # MEDIA_ROOT
    expires 30d;
}

4 - 确保您的

statics
已正确生成:

python3 manage.py collectstatic

5 - 确保 Nginx 可以访问您的

static
media

$ cd myproject
$ sudo chown -R www-data:www-data /home/myuser/apps/myapp/media/
$ sudo chown -R www-data:www-data /home/myuser/apps/myapp/static/
$ sudo chmod -R 755 /home/myuser/apps/myapp/media/
$ sudo chmod -R 755 /home/myuser/apps/myapp/static/

6 - 重新启动 Nginx:

$ sudo systemctl restart nginx

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.