首先什么是静态资源呢?一般指服务器发送到客户端的文件,常见的比如js、css、图片、音频等。
我们知道在性能优化这一块,会推荐把静态资源放到cdn上。
那么什么是cdn呢?cdn全称叫Content Delivery Network,即内容分发网络。CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
通过这种方式,我们给主业务服务器分担了很大的带宽压力。在上次社区的改造中,我们把图片资源都迁移到了cdn。在迁移过程中有一个细节引起了我的注意。在此之前的图片资源都放在项目public目录中,迁移到cdn后,图片的请求地址页发生了修改。由原本的www.xxx.com/a.png改为了img.xxx.com/a.png(只是一个例子,不影响理解),我们前端需要批量修改图片路径。当时我想能不能用nginx做方向代理,转到cdn上,这样的话前端就不需要修改代码了(- -其实是我懒。。)虽然后台同事觉得怪怪的,感觉多了一层nginx转发会影响到性能,所以还是否决了我的想法。然后苦逼的前端就只能修改路径了。
后来我在一篇技术文章上看到了cookie free这个概念,了解这个概念的含义后终于了解了为什么不应该用nginx做反向代理了。
我们知道在做资源请求的时候,浏览器会在同源资源的请求(相同协议、相同域名、相同端口)时,会带上cookie。这些cookie在做业务请求的时候很有用(服务器要根据cookie来获取该请求的session信息,从而识别该业务请求),但是对于静态资源则没有一点用处(服务器不会做处理)。因而如果使用一个二级域名,该资源能够正常请求(通过xml做请求仍然会跨域),而且不会带cookie,另外,由于多了域名,会增加浏览器的资源请求并发上限,从而提高了性能。
由此总结,使用cdn技能能够为主业务服务器分压,并能让客户端更快命中资源。而用专属的域名能取消cookie请求的开销,另外能提升客户端的请求并发上限。但也不是说客户端用的域名越多越好,因为会提高dns解析的开销(可以用过prefetch减少开销)。