/**
* web服務器緩存響應結果
*
1.web服務器本質就是URL映射
模擬場景:
當Browser(瀏覽器)==》WebServer 發送請求後
WebServer的(剝開不少實際過程進入到本質)工做:
1.解析URL
2.完成URL到實際內容或者資源的映射(URL對應內容或者資源)
3.處理請求並生成響應內容的過程
明白了WebServer的工做,咱們大致就能明白URL映射了
這一個系列工做就比如
http:xxx.xx.xxx/xx/ss/xx/xxx.html ====> (具體磁盤上的資源)
這是一個對應關係
2.緩存響應結果
你們也許想到了,咱們爲何不把這些對應的關係緩存器來呢?
例如不少時候,一個URL在比較長的時間裏對應一個惟一的響應內容
列如靜態內容或者更新不頻繁的的動態內容,若是緩存下來,下次Web服務器即可以在下次收到請求後當即拿出緩存好的響應結果內容返回給瀏覽器,那麼這一個操做行爲是在全部的操做步驟之上完成的,那麼相應的會節省時間與提升性能.
3.怎麼實現?
1.首先弄清楚,緩存內容應該存儲在什麼地方
通常來講: 倆地方本機內存與磁盤上
也能夠採用分佈式設計,存儲到其餘服務器上內存與磁盤
主流的Web服務器基本上均可以提供相似的服務
Apache: 提供2個擴展
mod_disk_cache: 提供磁盤緩存存儲引擎(用磁盤存儲)
mod_mem_cache 提供內存緩存存儲引擎(用內存存儲)
注意1 :在啓用上面兩個擴展之間必定要開啓mod_cache.so擴展,由於這是存儲緩存管理的主程序,
你能夠理解爲入口程序, 這裏面管理了這個兩種存儲引擎
注意2: mod_mem_cahe模塊的使用
主要是 Mod_mem_cahe實現 機制致使它在Apache多進程模型下共享內存的開銷比較大
官方推薦是使用mod_disk_cache,他是多個進程共享緩衝區,而且因爲緩衝區與內存映射的關係
訪問速度要超過Mod_mem_cache
另外Lighttpd ,NIginx也有相似的緩存機制,好比 lighttpd 提供 mmod_trigger_b4_dl 模塊能夠在響應數據輸出以前將它緩存到Memcahce緩存服務器中,並隨後請求的Url映射之間檢查緩存,本質是相同
注意:配置前,我要求對一個靜態文件進行壓力test.
壓力 test工具爲 ab.exe
簡單說一下ab工具使用,主要用測試平臺的吞吐率等
cmd>ab.exe –n 請求總次數 -c 併發數 請求頁面的url
或者進入到apache的bin目錄中
舉例: 併發請求爲10 總請求爲1000 在未使用web緩存前 的併發test
cmd>ab.exe -n 1000 -c 10 http://localhost/RenMeng/index.html
test結果:php
配置:html
注意:看手冊上面有畢竟詳細的配置,也介紹
我在windows上 test的, Linux要先編譯一下,(這個東西不必說了吧)
配置具體都相似
配置我是從手冊上拷貝下來的 用了IF判斷語句的,能夠直接用, 我只是說一下
磁盤緩存引擎的配置,內存緩存引擎哥們大家本身去看手冊就能夠了,並且手冊裏面很是詳細介紹,而且還有其餘的用法與指令,我沒法所有說明web
LoadModule cache_module modules/mod_cache.so
<IfModule mod_cache.c>
#LoadModule disk_cache_module modules/mod_disk_cache.so
# If you want to use mod_disk_cache instead of mod_mem_cache,
# uncomment the line above and comment out the LoadModule line below.
<IfModule mod_disk_cache.c>
#CacheRoot 指定緩存內容的存儲目錄
CacheRoot F:/PHPenv/Apache1/CacheRoot
#CacheEnable 指示緩存的指定了緩存引擎
# "/"意思的是緩存將根目錄下的全部的請求都進行緩存
# 好比:你只是想緩存站點下的某一個目錄,好比圖片目錄
# 那麼就這麼配置 CacheEnable disk / images
CacheEnable disk /
#CacheDirLevels
#CacheDirLength
# 這兩個參數,指定緩存目錄分級結構,爲減小同一 個目錄有大量文件的查找開銷,
CacheDirLevels 5
CacheDirLength 3
</IfModule>
LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>
# When acting as a proxy, don't cache the list of security updates
CacheDisable http://security.update.server/update-list/
</IfModule>
配置完畢後重啓,數據庫
手動請求頁面http://localhost/RenMeng/index.html 並生成緩存apache
截圖windows
具體說一下後端
navjMyA.data緩存的正文信息就是內容
navjMyA.header http頭信息瀏覽器
分開存儲的好處是,緩存過時檢查提供了方便,只須要檢查HTTP頭信息的文件便可緩存
如今壓力test的結果服務器
看一下test結果那麼咱們很輕易的看了性能的提高
補償說一下
其實單純的html頁面,性能的提高並非很讓人驚訝的,
我說一個,高性能平臺或者大規模分佈式都會用的,
」動態內容緩存「
就本人粗淺的瞭解通常是用分佈式memcache來作,memcache其實不是性能最優的選擇,可是基本上大型平臺都會用他,主要是memcache能分佈式開發,綜合來講用他比較好。
最優選擇是APC ,
順便說一下APC分:
1.數據緩存方法 (這個東西就專門用來緩存動態內容的)
2.Opcode緩存功能 (這東西用來作腳本加速的,說白說本質就是把代碼弄成二進制。把搞成編譯型的)
我想說一下APC緩存,是動態程序自身實現的緩存機制的最好表現了,
它比Xcache ,memcahe分佈式 ,比硬盤緩存的性能都高不少。
很差意思,本PC沒法進行test,可是確實是這樣的。
可是沒法作分佈式開發,因此你們最後選擇memcahe來作,
可是他的性能確實是最好的,相比與其餘的。
可是我想說若是web服務器緩存與APC緩存相比來講話,以動態內容爲例子
首先我沒法給出Test結果,可是我能確定,
web服務器緩存比Apc緩存的性能至少高出2個倍
驚訝吧!就是至少高出2倍,
你們應該很難相信我說的是動態內容的緩存結果
我雖然沒法給出測試數據,可是我講一下原理,大家確定能認同
好比:
1.咱們如今訪問一個http:xxx.xx.com/index.php?xa=2&xs=4&xd=cc
2.要鏈接數據庫,先數據庫進行查詢
APC怎麼作,在Linux平臺上tracer工具對進程進行追蹤話更好能體現我說的
把代碼緩存起來,說白了只是代碼,對數據庫還同樣的請求,
web服務器緩存呢,從,磁盤的角度來看,他實際上只是對靜態文件的請求
同志們明白了吧。單純性能來講很是好,
可是也有個問題,這個問題很致命
本來動態內容請求會很快得到緩存,
可是它如何知道緩存是否過時,以及如何控制緩存的有效期的,畢竟是動態內容呢。
下回再來嘮叨這個問題,其實看手冊也能知道的,算了,我剛纔介紹了一下,內容與HTTP頭分開存儲的,
http頭中標記就是判斷過時檢查的
備註:
順便說一個Web服務器作反向代理(Reverse Proxy),
就是webserver工做的第一步後,進行將請求轉發到後端的服務器,這會增長網絡IO開銷,之後有時間會專門討論這一問題。
待續.....................