原由
----------css
在最近新系统的设计中对于首页打开速度的问题作了一些考虑,因为页面上仍是以动态数据为主,因此简单的静态化数据可能并不行,因此须要从业务和技术结合的角度去考虑这个问题。因为有些数据并不敏感,其实能够放入缓存并定时更新。另外就是有些自己是静态,可否加快并发相应速度。html
这里对动态数据想到了2种办法:1)把Action设置成单例,请求的结果直接加在缓存里,再用一个定时线程去刷新这个缓存;2)让输出的结果页静态化,定时更新结果页。
前者控制起来很是灵活,利用双缓冲也能让人感受不到缓冲时的速度降低,缺点就是要改动比较多的代码。后者正好相反,静态化要依靠外层的框架配置,代码彻底不用改动。linux
选型
-----------nginx
目前比较流行的反向代理服务器有squid和nginx,查了一下资料,发现nginx比较擅长反向代理和负载均衡,而squid强在自身的缓存机制,另外lightd貌似多用来作图片服务器。通过比较感受nginx的配置文件简单一些,因此决定用这个先尝试一下。web
性能测试
----------------后端
安装完成固然是先作一下性能测试了,此次一样使用ab来进行压力测试。为了作对比,这里也启动了一个tomcat,nginx配置成其的反向代理。我就在本机进行访问,但测试结果令我惊叹。浏览器
测试命令:ab -n 10000 -k -c 1000 http://localhost:8080/pscms_hlj_web/images/logo.jpg缓存
tomcat:tomcat
Server Software: Apache-Coyote/1.1
Server Hostname: localhost
Server Port: 8080
Document Path: /pscms_hlj_web/images/logo.jpg
Document Length: 17619 bytes
Concurrency Level: 1000
Time taken for tests: 3.671 seconds
Complete requests: 4254
Failed requests: 0
Write errors: 0
Keep-Alive requests: 4254
Total transferred: 76035996 bytes
HTML transferred: 74951226 bytes
Requests per second: 1158.92 [#/sec] (mean)
Time per request: 862.874 [ms] (mean)
Time per request: 0.863 [ms] (mean, across all concurrent requests)
Transfer rate: 20228.99 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 33 67.4 0 261
Processing: 52 255 60.1 272 315
Waiting: 15 129 61.7 127 261
Total: 52 288 108.0 272 559
nginx:服务器
Server Software: nginx/0.7.67
Server Hostname: localhost
Server Port: 8000
Document Path: /pscms_hlj_web/images/logo.jpg
Document Length: 17619 bytes
Concurrency Level: 1000
Time taken for tests: 0.597 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 10000
Total transferred: 179370000 bytes
HTML transferred: 176190000 bytes
Requests per second: 16744.67 [#/sec] (mean)
Time per request: 59.721 [ms] (mean)
Time per request: 0.060 [ms] (mean, across all concurrent requests)
Transfer rate: 293309.69 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 8.1 0 44
Processing: 0 49 19.7 48 97
Waiting: 0 44 19.8 42 93
Total: 0 51 19.4 52 99
nginx的性能远远胜出,这应该是这个页面会被缓存的缘由,另外支持epoll确定也有较高的IO性能提高。但这个测试中也发现tomcat已经很稳的挂掉了,nginx的高并发支持真不是盖的。
结论
----------
真实系统中不可能有那么多静态的内容,由于浏览器本地也会有缓存,可是nginx会在很大程度上提高对并发响应的能力。对于一些不须要频繁更新的动态内容也能够作定时缓存,这样也能够大大加快页面的打开速度并下降后端压力。线上系统能够把图片、js、css、静态html都缓存起来,后端只接受动态内容的请求,从而提速web访问速度。
其余发现
--------------
其实nginx是把缓存的内容通过hash后放到文件中的,虽然测试中来看确定是在内存中拿的结果,可是确定仍是有一次写入。后来查到linux下面有一个自带的文件系统,在/dev/shm下面,默认是内存大小的一半。这样真的能够把缓存的内容指向这个文件里面就好了。
另外,nginx也能够很方便的实现双机热备和负载均衡。负载均衡能够配置weight来调整访问比例,系统会自动把请求进行转向。双机热备会在全部节点都不可用时自动转向,这在系统升级的时候能够作到不中断服务。这些实现作相似以下配置便可:
upstream testproxy {
server 127.0.0.1:8080 weight=10;
server 127.0.0.1:8081 weight=10;
server 192.168.0.11:8080 backup;
}