无法在 Django 中使用 nginx 服务静态文件
Posted
技术标签:
【中文标题】无法在 Django 中使用 nginx 服务静态文件【英文标题】:cannot server static files with nginx in django 【发布时间】:2017-12-04 15:42:42 【问题描述】:我正在使用 nginx 作为 Web 服务器运行 django。配置后,我似乎总是得到 404 的静态文件。这是我的配置
base.py
STATIC_ROOT = os.path.join(PROJECT_DIR, "static")
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(PROJECT_DIR, 'static_files'),
]
nginx.conf
upstream django
server unix:///tmp/mysite.sock;
# configuration of the server
server
listen 5000;
server_name server localhost:5000; address or FQDN
charset utf-8;
client_max_body_size 75M;
location /static
alias /Users/del/projects/app-backend/static/;
location ~ ^/(images|javascript|js|css|flash|media|static)/
autoindex on;
root /Users/del/projects/app-backend/static/;
location /
uwsgi_pass django;
include /Users/del/perso/django/library/uwsgi;
我已经确定运行python manage.py collectstatic
,文件实际上是在/static/
文件夹下生成的
【问题讨论】:
你用过collectstatic吗? 是的,我做到了,而且我已经在我的问题中写了。 【参考方案1】:你似乎猜到了 nginx 应该做什么,但不明白 alias 和 root 是如何工作的:
root
设置该位置的父目录。父目录中必须存在同名物理目录:
root /var/www
directory |----- /static
file |----- image.jpg
location /static
和 root /var/www
现在将提供来自 /var/www/static
的文件。 URL http://example.com/static/image.jpg
将服务于/var/www/static/image.jpg
。
结构相同,但 location /s
和 alias /var/www/static
现在将提供来自 /var/www/static
的文件。 URL http://example.com/s/image.jpg
将服务于/var/www/static/image.jpg
。
所以你的简单配置是:
server
root /var/www; # Set root at server level
location /static
expires max;
location /
uwsgi_pass django;
我不知道您需要正则表达式做什么。如果您在模板中始终使用 Django 的static
标签,则无需匹配“/images”等。
最后,由于 static
在正则表达式中,并且正则表达式模式优先于字符串匹配,因此您在 URL 中对 /static/
的所有引用都将在 app-backend/static/static
中查找。
【讨论】:
以上是关于无法在 Django 中使用 nginx 服务静态文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Docker 上使用 Nginx 和 Django 提供静态文件?
无法在 osx 上使用 nginx + gunicorn 查看静态文件
为啥建议使用不同的服务来托管 django 的静态文件(如 nginx 或 apache)?