当前位置: 代码迷 >> Web前端 >> 利用nginx加快web访问
  详细解决方案

利用nginx加快web访问

热度:271   发布时间:2013-01-20 10:22:40.0
利用nginx加速web访问

在最近新系统的设计中对于首页打开速度的问题做了一些考虑,由于页面上还是以动态数据为主,所以简单的静态化数据可能并不行,所以需要从业务和技术结合的角度去考虑这个问题。由于有些数据并不敏感,其实可以放入缓存并定时更新。另外就是有些本身是静态,能否加快并发相应速度。

? ? 这里对动态数据想到了2种办法:1)把Action设置成单例,请求的结果直接加在缓存里,再用一个定时线程去刷新这个缓存;2)让输出的结果页静态化,定时更新结果页。
? ? 前者控制起来非常灵活,利用双缓冲也能让人感觉不到缓冲时的速度下降,缺点就是要改动比较多的代码。后者正好相反,静态化要依靠外层的框架配置,代码完全不用改动。

?

选型
-----------

? ? 目前比较流行的反向代理服务器有squid和nginx,查了一下资料,发现nginx比较擅长反向代理和负载均衡,而squid强在自身的缓存机制,另外lightd貌似多用来做图片服务器。经过比较感觉nginx的配置文件简单一些,所以决定用这个先尝试一下。

?

性能测试
----------------

? ? 安装完成当然是先做一下性能测试了,这次同样使用ab来进行压力测试。为了做对比,这里也启动了一个tomcat,nginx配置成其的反向代理。我就在本机进行访问,但测试结果令我惊叹。

? ? 测试命令:ab -n 10000 -k -c 1000 http://localhost:8080/pscms_hlj_web/images/logo.jpg

tomcat:

  1. Server?Software:????????Apache-Coyote/1.1?
  2. Server?Hostname:????????localhost?
  3. Server?Port:????????????8080?
  4. ?
  5. Document?Path:??????????/pscms_hlj_web/images/logo.jpg?
  6. Document?Length:????????17619?bytes?
  7. ?
  8. Concurrency?Level:??????1000?
  9. Time?taken?for?tests:???3.671?seconds?
  10. Complete?requests:??????4254?
  11. Failed?requests:????????0?
  12. Write?errors:???????????0?
  13. Keep-Alive?requests:????4254?
  14. Total?transferred:??????76035996?bytes?
  15. HTML?transferred:???????74951226?bytes?
  16. Requests?per?second:????1158.92?[#/sec]?(mean)?
  17. Time?per?request:???????862.874?[ms]?(mean)?
  18. Time?per?request:???????0.863?[ms]?(mean,?across?all?concurrent?requests)?
  19. Transfer?rate:??????????20228.99?[Kbytes/sec]?received?
  20. ?
  21. Connection?Times?(ms)?
  22. ??????????????min??mean[+/-sd]?median???max?
  23. Connect:????????0???33??67.4??????0?????261?
  24. Processing:????52??255??60.1????272?????315?
  25. Waiting:???????15??129??61.7????127?????261?
  26. Total:?????????52??288?108.0????272?????559?

nginx:

  1. Server?Software:????????nginx/0.7.67?
  2. Server?Hostname:????????localhost?
  3. Server?Port:????????????8000?
  4. ?
  5. Document?Path:??????????/pscms_hlj_web/images/logo.jpg?
  6. Document?Length:????????17619?bytes?
  7. ?
  8. Concurrency?Level:??????1000?
  9. Time?taken?for?tests:???0.597?seconds?
  10. Complete?requests:??????10000?
  11. Failed?requests:????????0?
  12. Write?errors:???????????0?
  13. Keep-Alive?requests:????10000?
  14. Total?transferred:??????179370000?bytes?
  15. HTML?transferred:???????176190000?bytes?
  16. Requests?per?second:????16744.67?[#/sec]?(mean)?
  17. Time?per?request:???????59.721?[ms]?(mean)?
  18. Time?per?request:???????0.060?[ms]?(mean,?across?all?concurrent?requests)?
  19. Transfer?rate:??????????293309.69?[Kbytes/sec]?received?
  20. ?
  21. Connection?Times?(ms)?
  22. ??????????????min??mean[+/-sd]?median???max?
  23. Connect:????????0????2???8.1??????0??????44?
  24. Processing:?????0???49??19.7?????48??????97?
  25. Waiting:????????0???44??19.8?????42??????93?
  26. Total:??????????0???51??19.4?????52??????99?

? ? nginx的性能远远胜出,这应该是这个页面会被缓存的原因,另外支持epoll肯定也有较高的IO性能提升。但这个测试中也发现tomcat已经很稳的挂掉了,nginx的高并发支持真不是盖的。

?

结论
----------

? ? 真实系统中不可能有那么多静态的内容,因为浏览器本地也会有缓存,但是nginx会在很大程度上提升对并发响应的能力。对于一些不需要频繁更新的动态内容也可以做定时缓存,这样也可以大大加快页面的打开速度并降低后端压力。线上系统可以把图片、js、css、静态html都缓存起来,后端只接受动态内容的请求,从而提速web访问速度。

?

其他发现
--------------

? ? 其实nginx是把缓存的内容经过hash后放到文件中的,虽然测试中来看肯定是在内存中拿的结果,但是肯定还是有一次写入。后来查到linux下面有一个自带的文件系统,在/dev/shm下面,默认是内存大小的一半。这样真的可以把缓存的内容指向这个文件里面就行了。

? ? 另外,nginx也可以很方便的实现双机热备和负载均衡。负载均衡可以配置weight来调整访问比例,系统会自动把请求进行转向。双机热备会在所有节点都不可用时自动转向,这在系统升级的时候可以做到不中断服务。这些实现做类似如下配置即可:?

  1. upstream??testproxy??{?
  2. ??server???127.0.0.1:8080 weight=10;?
  3. ??server???127.0.0.1:8081 weight=10;?
  4. ??server???192.168.0.11:8080?backup;?
  5. }