利用nginx加速web訪問

原由
----------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; 
}
相關文章
相關標籤/搜索