请教各位大牛一个问题: 现在的项目从客户端到webAPP 经过nginx+tomcat,经过压力测试,事务响应时间很长, 所以想着在nginx/tomcat加上静态页面的缓存, 但是大多文章说的主要是nginx上面使用proxy_cache. 请注意 我这里说的缓存不是针对静态文件(js,css,html,image等), 而是针对整张页面或者局部页面的缓存, 这就有一个问题, nginx不是serlvet容器对于jsp是不能解析的.
我现在的想法是:
1.项目代码上对出口的jsp进行过滤filter, 将jsp转化成html格式, 然后更新到nginx服务器的指定目录下
2.nginx上配置,对于所有请求先去之前指定的静态页面主目录去找有没有页面, 没有的话再去upstream去请求后端的webapp处理, 同样处理完之后经过filter转化成html在更新存放静态页面的目录.
请教各位大牛, 不知道我的想法是否正确, 还有什么正确的主流的的思路和建议,请不吝赐教.
像你这个问题需要拆开分析。nginx做静态文件访问是很强,但是首先你要考虑生成静态文件后的代价:1.什么时候生成;2.什么时候更新;3.信息不及时会不会导致不良后果;4.因为你是生成物理html文件的,如果你们项目数据量很多、页面很多,最终生成的文件是否会很多、很大,这么多文件维护起来有没有难度。
痛点:曾经做过访问结构统计,写xml。平常访问是没有问题,但在高并发下,你想死的心都有。打开文件不对,一看是前面还没写完,另外一个用户就访问了,又写,导致文件格式不对。
建议:对项目进行拆分,检查数据库访问时间、程序处理时间、页面展示时间。看下响应时间长是因为哪里出的问题。
如果实在要缓存,建议数据库开启缓存,程序将数据缓存至内存中,前端服务器设置缓存,莫要去让程序判断是否写页面。
如果最终还是要写html。你的第二点就不可用,因为是程序主动生成html,例如:新闻类更新时,由编辑人员点击发布,此时可能就写了一个静态的html,而不是由用户去访问出发写html,避免高并发会出现的问题。
文笔不好,第一次在iteye回答问题,如有疑问可私信,或者发我邮箱。
你这个想法很好,顺便说一下,既然用到了nginx,nginx就能获取到html,不用filter了。nginx有一个模块srcache,把html缓存到memcache中。
这个要分情况来看的吧.
最简单的情况就是页面一旦生成就不会再被改变了,那这只需要在第一次访问的时候或者由后台线程去生成一次即可.
如果是有改变的那就复杂一些了.
1.有改变,但是不需要很实时的去展现这些改变.那你可以为这些已经生成的静态化页面由专门的线程去定时重新生成一下.
2.有改变,需要马上看到结果.这里的话,我建议你不如直接利用缓存将数据进行缓存免去后台数据库的访问时间.这样你将获得的数据缓存在内存中,基本上就只剩下组装页面和响应的时间了,会大大加快请求处理速度的.
可以用ehcache 可以在tomcat端缓存界面或者局部缓存 想过非常棒
http://www.cnblogs.com/daxin/archive/2013/05/31/3111597.html
可以自定义失效时间 非常灵活
只是关注而已
可尝试下Varnish
如果你内存够大就不用转成HTML了,直接URL缓存,其实HTML加载也是耗时的,只是相对于动态页面来说强一些