让Nginx处理Django的静态文件

让Nginx处理Django的静态文件

在开发中难免要处理网站的css js image等静态文件,不用顾及性能,安全的问题,交给Django内部处理好了;但如果正式部署到服务器的时候,这样的配置就会影响到性能和安全性了,这时怎么办呢?嗯,交给Nginx处理好了。

假如项目的目录结构如下:
myproject
–app1
–app2
–media
—-css
—-js
—-images
–templates
–setting.py
–urls.py
–manage.py

–…

解释:通常项目文件夹下有若干个app应用,如app1 app2
我们把静态文件方在项目的根目录下,起名为media(这个可以任意起名,但顾名思义,起个明了的名字),media文件夹里分别新建 css,js,images文件夹,用他们放置样式,脚本,图片等用途。
剩下的就是Django生成的settings urls manage配置文件了。

这回计划在开发环境中,使用Django处理静态文件,而正式部署后使用Nginx来处理他们。

首先在urls.py文件中最后加上以上代码

1
2
3
4
5
if settings.DEBUG:    
urlpatterns += patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': os.path.join(settings.SITE_ROOT,'media')},name="media"),
)

具体的意思是:如果是开发环境,让Django的django.views.static.serve来处理,而正式部署时,Django不做任何事情,让Nginx来处理,后面会讲到Nginx的配置问题。

settings.DEBUG其实就是开发和部署的标示变量,部署的时候在settings里给DEBUG变量赋值False,让Django Templates屏蔽一切Debug;赋值True时,相反,是开启Debug,开发中出错以便查看一些错误信息。

开发环境中,settings的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
import os
DEBUG = True
TEMPLATE_DEBUG = DEBUG


SITE_ROOT=os.path.abspath(os.path.dirname(__file__))


MEDIA_ROOT = os.path.join(SITE_ROOT,'media')


MEDIA_URL = '/media/'

正式部署的时候,把变量DEBUG改成False即可。

正式部署的时候,Nginx的静态文件配置很关键,先看代码:

1
2
3
4
5
location ~ ^/media/ {         
root /home/http/django_project/myproject/;
expires 24h;
access_log off;
}

如项目实际路径是:/home/http/django_project/myproject/,那以上的配置代码会到 /home/http/django_project/myproject/ 路径找 media文件夹。一两点值得注意的:

1 刚开始一直没有配置成功,原因是root的没配置正确,写成 root /home/http/django_project/myproject/media/ 了, 导致Nginx老找不到media文件夹。

2 还有一个值得注意的是:location ~ ^/media/ 要和实际的静态文件夹对应哦,如果写成location ~ ^/static/ 那肯定不行的

实际部署脚本

DEBUG=False

Django.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# cat /etc/nginx/conf.d/django.conf
upstream django{
server 127.0.0.1:8088;
}

server {
listen 80;
client_max_body_size 50M;
server_name localhost 127.0.0.1 172.16.4.51;
server_name_in_redirect off;
# error_log /tmp/error.log debug;

location / {
proxy_pass http://django/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}

location ~^/static/ {
root /home/go/monitor/;
expires 24h;
access_log off;
}
}
坚持技术分享,您的支持将鼓励我继续创作!

热评文章