【发布时间】:2016-11-13 08:35:55
【问题描述】:
我不知道 nginx 是如何处理静态文件的
/etc/nginx/站点可用/默认:
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 设置.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
请帮忙,或者如果我遗漏了任何东西,请告诉我。
【问题讨论】:
-
欢迎来到 Stack Overflow!感谢您发布如此详细的问题描述,这对您有很大帮助。在我们深入了解您的问题的要点之前,请先做几件事。如果 NGINX 没有看到配置文件,它如何为您的静态文件返回 404?你最后说的链接是正确的,但是如果它使用
include /etc/site-enabled/*;或include /etc/site-enabled/*.conf;,你需要签入nginx.conf如果它是*.conf,你需要将default重命名为@987654329 @。另外,你的site-enabled和site-available坐在/etc/有点奇怪 -
这不是标准安装。对于您的自定义 4xx 模板:如果 NGINX 提供此服务,则它需要是静态 HTML 文件。它不能有任何模板标签,因为它没有被 Django 处理。我的建议是为此使用 Django 的内部错误模板。最后,关于你的静态文件,配置是正确的。我唯一要更改的是
location ^~ /static/ {,以便 NGINX 知道它必须进行正则表达式匹配而不是直接字符串比较。 -
嗨 Keenan,感谢您的快速回复。我检查了我的 nginx.conf,它是
include /etc/site-enabled/*;,所以文件名是正确的,即default -
我也尝试了
location ^~ /static/ {,但仍然 nginx 不提供静态文件。 -
奇怪。运行
python manage.py collectstatic时的输出是什么?即它收集到哪个目录?