django + Nginx + Gunicorn - 当调试为false时,404为静态文件

时间:2016-11-13 08:35:55

标签: django nginx gunicorn

我不知道nginx如何提供静态文件

/ etc / nginx / site-available / default:

upstream example.com {
  server unix:/home/www/example/env/run/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;
    server_name example.com;
    client_max_body_size 4G;

    access_log /home/www/example/logs/nginx-access.log;
    error_log //home/www/example/logs/nginx-error.log;

    location /static/ {
         alias /home/www/example/codeab/static/;
    }

    location /uploads/ {
        alias   /home/www/example/codeab/uploads/;
    }
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/www/example/env/run/gunicorn.sock;
    }
    # Error pages
    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /home/www/example/templates/;
    }
    error_page 404 /401.html;
    location = /401.html {
        root /home/www/example/codeab/templates/;
        internal;
    }
}

Django setting.py

STATIC_URL = '/static/'
STATICFILES_DIRS =  (
    os.path.join(BASE_DIR, 'static_content/'),
)
STATIC_ROOT = os.path.join(BASE_DIR,'static/')

另外,我在DEBUG = False之前做了collectstatic

似乎nginx没有考虑上面的配置文件,因为404页面没有显示我的自定义401.html页面。

编辑完配置后,我将其链接到

启用的网站
sudo ln -s /etc/site-available/default /etc/site-enabled/default
service nginx reload
sudo service nginx restart

请帮助,或让我知道如果我遗失了任何东西。

3 个答案:

答案 0 :(得分:1)

我不知道确切的解决方案,但它开始致力于将我的gunicorn绑定从xxx.xxx.xx.xx:80更改为xxx.xx.xx.xx:8000 并将配置编辑为 -

location / {
        include proxy_params;
        #proxy_pass http://unix:/home/www/example/env/run/gunicorn.sock;
        proxy_pass http://xxx.xxx.xx.xx:8000;
    }

我评论了sock文件的proxy_pass并添加了新行,如上所示。

答案 1 :(得分:0)

只需从

更改nginx服务器块中的配置即可
location /static/ {
         alias /home/www/example/codeab/static/;
    }

location /static/ {
         alias /home/www/example/codeab/static_content/;
    }

原因,在命令python manage.py collectstatic执行后 静态文件放在static_content文件夹中。

答案 2 :(得分:0)

Nginx从location /static/下的nginx配置文件中定义的目录中提供静态文件,当你在定义的目录中找不到这样的静态资源时,重定向到你在nginx配置中定义的自定义404 html页面。

Django在Django的任何urls.py文件中找不到给定网址时显示自定义404 html页面,只要你在settings.py中设置Debug = False并指向'TEMPLATES'-'DIRS'设置包含您的自定义404 html文件的目录,如Django documentation中所述。

所以,实际上,nginx和Django显示相同的404 html页面的方式是不同的,彼此独立。