使用Nginx + Gunicorn + Django提供静态文件服务

11

这是我的nginx配置:

    server {
        listen 80;
        server_name localhost;

        keepalive_timeout 5;

        access_log /home/tunde/django-projects/mumu/nginx/access.log;
        error_log /home/tunde/django-projects/mumu/nginx/error.log;

        root /home/tunde/django-projects/mumu;

        location / {
            try_files $uri @proxy_to_app;
        }

        location @proxy_to_app {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://127.0.0.1:8000;
        }
    }

我的settings.py文件看起来像这样:

    import os
    settings_dir = os.path.dirname(__file__)
    PROJECT_ROOT = os.path.abspath(os.path.dirname(settings_dir))

    STATIC_ROOT = '/home/tunde/django-projects/mumu/STATIC/'
    STATIC_URL = '/static/'

    STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static/'),
    )

我的 supervisord.conf 文件看起来像这样:

[program: mumu]
command = /home/tunde/ENV1/bin/gunicorn -w 1 --bind=127.0.0.1:8000 mumu.wsgi:application
directory = /home/tunde/django-projects/mumu/
stdout_logfile= /home/tunde/django-projects/mumu/supervisor/logfile.log
stderr_logfile= /home/tunde/django-projects/mumu/supervisor/error.log
user = tunde
问题在于静态文件未被提供服务,我不知道哪里出了问题。类似 /static/css/styles.css 的 url 返回 404。非常感谢您的帮助。
2个回答

21

您需要创建一个nginx位置块,匹配您的django应用程序的STATIC_URL位置。根据您的配置,nginx还将静态资源请求转发到django应用程序。我猜您在django应用程序日志中看到了404错误?您希望nginx处理这些请求,而不是django。

location /static {
    alias /home/tunde/django-projects/mumu/STATIC/; 
}

请务必运行Django管理命令collectstatic,以确保所有静态资产都被复制到STATIC_ROOT目录中。


谢谢@scott,由于以前与Django忽略存储在名为“static”的文件夹中的静态文件的经验,我决定更改静态文件的位置和名称。在nginx重新启动后,我的配置可以正常工作,而无需添加您建议的位置块。 - Tundebabzy
当您查看上级日志文件时,是否会看到静态文件(img、css、javascript)的请求通过? - Scott Woodall
我的logfile.log,即supervisord.conf中的stdout_logfile,完全为空。 - Tundebabzy
即使添加了新的位置块,每个请求仍然会出现在我的gunicorn日志中......nginx日志中没有任何内容。 - Tundebabzy
@rantanplan,我已经添加了location块,但是我是在/etc/nginx/sites-enabled/oga.conf中进行的,因为nginx.conf中有include /etc/nginx/sites-enabled/*。让我尝试将其放入nginx.conf中,看看会发生什么。 - Tundebabzy
显示剩余2条评论

1
location / {
    try_files $uri @proxy_to_app;
}

请将 $uri -> $request_uri 进行更改。
location / {
    try_files $request_uri @proxy_to_app;
}

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