原由
----------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;
}