无法让nginx提供收集的静态文件

3
我正在尝试让nginx与gunicorn一起工作。我有一个目录/project/static/,其中存放静态文件。这些文件被收集到一个目录/project/livestatic/中,使用如下所示的settings.py配置:
STATIC_ROOT = '/project/livestatic'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    '/project/static',
)

我将使用以下nginx配置:

我正在使用以下nginx配置:

worker_processes 1;
user nobody nogroup;
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;

events {
    worker_connections 1024;
    accept_mutex off;
}

http {
    include mime.types;
    default_type application/octet-stream;
    access_log /tmp/nginx.access.log combined;
    sendfile on;

    upstream app_server {
        server 127.0.0.1 fail_timeout=0;
    }

    server {
        listen 80 default;
        client_max_body_size 4G;
        server_name domain.org;

        keepalive_timeout 5;

        # path for static files
        location /static/ {
            autoindex on;
            root /var/www/startupsearch_live/livestatic/;
        }

        location / {
            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:8888;
        }
    }
}

在开发服务器(忽略nginx)下,这个配置可以正常工作,并且我可以通过在格式中链接到静态文件/static/file.extension来提供静态文件。然而,一旦nginx/gunicorn参与进来,这就不起作用了,尝试访问domain.org/static/会出现django 404页面,表明nginx根本没有提供文件。我做错了什么?
1个回答

10

这个问题在这里经常被问到...

location /static/ {
    alias /var/www/startupsearch_live/livestatic/;
}

如果像你这样使用root,则会请求/static/foo.jpg并将其解析为/var/www/startupsearch_live/livestatic/static/foo.jpg

alias不会将位置附加到它上面,它会一对一地映射。


在提问之前,我做了一些研究;但出于某种原因,这并没有起作用。即使重新启动gunicorn和重新加载nginx,我仍然得到Django 404错误,所以似乎“location /”设置在某种程度上覆盖了“location /static/”,但我不确定。 - Randall Ma
1
更新:结果系统重启解决了它...我会将你的答案标记为正确,因为我猜想无论如何我以后都会遇到那个问题。 - Randall Ma
@RandallMa 即使9年后,简单的重启在我的项目中也解决了相同的问题。 - Andrey Mazur
重启并不是解决问题的方法,而是一种应用解决方法的方式。 - undefined

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