27 July 2016

最近工作不是特别忙,加上公司同事一直反映系统访问比较卡。打算把性能优化这块一点一点做起来。 今天先说动态资源和静态资源分离

为什么要动态和静态资源分离

我们公司系统使用的是nginx+jetty,nginx做请求转发,jetty做servlet引擎。

现在的web网站,为了用户体验。js和css文件动辄几十上百个;js动辄就几百k,甚至一到两M的也不乏少数。

既然用了nginx和jetty,那么就应该让它们各自干各自擅长的活。

况且nginx也提供了这样的功能。

nginx中可以针对各种请求按照正则表达式进行匹配转发。那么很简单,我们可以后静态资源,也就是后缀为js,css,jpg,png,gif等文件让nginx直接返回,不用再转发给jetty处理了。

nginx配置:

在server节点中增加:

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
                expires 10d; #静态资源缓存时间
                root /path/to/webapp/resource;       # 局部配置
  }

测试

关掉jetty服务,直接访问静态资源地址,能够正常访问即可。

后续

配置完毕后,发现静态资源后来请求的时候返回状态都是304,查了一下资料(点击查看原文):

304 的标准解释是:Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。 服务器告诉客户,原来缓冲的文档还可以继续使用。

如 果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。 因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。 对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面, 往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。 转自:





Fork me on GitHub