写在前面
年初Django开发的网站项目第一版已经上线,因为需求变动太大,所以想按照前后端分离的方式早点推重构再优化,但是时间又不允许,所以就先做第一版的优化,重构的事并行,以后考虑迁移数据。
关于静态文件
压缩
js/css
文件。
我们使用gulp
来压缩js/css
文件。静态文件全部迁移到七牛云存储里面。
原来的静态文件直接放在服务器里,首页图片比较多,之前测试服务器加载完首页js/css/图片,最长的一个文件时间需要3.6秒左右,现在最长的图片只需要170ms左右。在七牛对象存储bucket中可以设置文件的浏览器缓存Cache-Control的max-age的秒数,这样可以让静态文件在客户端浏览器中缓存,比如static/js/index.js
,第一次请求资源时会请求服务器,如果没有超出缓存时间,下载请求时直接加载本地资源。不过这里可能会产生一个问题。如果你的静态文件缓存在本地浏览器或者七牛的CDN中,你在更新服务器代码的时候,就会产生脏数据。用户请求的数据依旧是之前的缓存在本地或者CDN中的数据。解决的方法有几种,第一种是在你的静态文件后面加参数,比如原来请求static/js/index.js
现在改成static/js/index.js?v=20170809
,这两个是不同的URI,会促使服务器重新加载新的静态文件,但是这样做有个问题,只能全量更新,无法增量更新。第二种方式是在你的静态文件前面加前缀,比如/v1/static/js/index.js
,这个缺点也是一样,无法增量更新。第三种方式是在文件名后加md5值,比如static/js/index.c6d9c9fc12c1dbaee77703a4dd731a8b.js
。如果没有改过的文件,还是会加载到缓存中,该过的文件,由于md5值变了,会请求新的文件,所以推荐使用第三种方式。由于我们项目的历史原因,没办法改成第三种,暂时只能通过缓存的设置,我把客户端缓存设置为8小时,七牛的静态文件缓存为1个月,然后通过七牛的refresh的API,批量刷新一下网站中自己写的js/css
的文件夹目录,让七牛的缓存从源中重新拉取文件。这样在半夜更新服务器时,让用户在第二天使用时不会加载脏数据。
关于Media
视频
视频一般就直接上传七牛,CDN加速。图片
图片最早我们是直接用python的wand库切图后,保存到线上服务器中。后来发现切图的时间慢,而且很消耗CPU跟内存的资源,所以现在都是原图直接上传到七牛中,七牛针对图片有图片样式的处理,比如头像,我们有三种标准4040,5050,8080,原来只切成8080的图片,不管哪种样式,通过css的width跟height属性控制其他样式。现在直接定义三个样式,在图片请求加上相关参数,直接就获取了这三个样式的图片,最小化的减少图片的加载。
关于Cache
1.把常访问的页面用cache静态化。
2.把常用的数据全部丢到在redis中,减少从数据库中请求。
数据库
数据库读写分离。提高数据库性能。
代码中减少对数据库查询的请求,一次查完的不要查二次,对经常查询的字段建索引。
下一阶段要做的优化
负载均衡。
分库分表。