先說明下為什么要寫這篇文章,以及糾結于這個“小問題”。首先開啟靜態(tài)文件的gzip壓縮非常有利用提高網(wǎng)站的訪問速度,并且有效減少蜘蛛爬行靜態(tài)頁面的time-taken,同時也不會像開啟動態(tài)文件壓縮一樣可能會對百度蜘蛛造成200 0 64的抓取問題,所以一方面,網(wǎng)站速度快有利于提高用戶體驗,另一方面,google管理員博客在今年已經明確表示網(wǎng)站速度是排名的因素之一,而對于拿國外主機做百度中文站優(yōu)化,time-taken不理想會導致百度蜘蛛內頁抓的少,國平之前在自己博客文章網(wǎng)頁加載速度是如何影響SEO效果的中也提到過,在固定的一段時間內蜘蛛抓取網(wǎng)站的總時間是固定的,那么抓取速度上去了,抓取頁面數(shù)就會更多,反之則少。
好吧,開始正文,在上篇文章《蜘蛛抓取靜態(tài)頁面與觸發(fā)gzip壓縮的實驗結果》中的問題二,我提出了gzip靜態(tài)頁面的壓縮版本在服務器上保存方式的猜測,在困惑了許久之后,發(fā)現(xiàn)導致兩個主機返回gzip結果不同的最終原因是iis版本而不是我猜測的緩存文件夾設置過小。
事實上,iis7比iis6在靜態(tài)壓縮上有了較大的更新,在IIS6中,靜態(tài)壓縮是在一個不同的線程上進行的,所以在收到一個HTTP請求后,第一個發(fā)送給瀏覽器的HTML版本是沒有壓縮過的,而同時IIS6會開始使用一個不同的線程對這個文件進行壓縮并且將這個壓縮后的版本長期保存在壓縮文件的緩存文件夾內。而在以前,也就是IIS6服務器上,在壓縮完成之后凡是對該被壓縮版本的靜態(tài)文件的HTTP請求,IIS6都會直接從緩存文件夾中直接調用壓縮后的版本并返回給瀏覽器。
但是在IIS7中,壓縮是在主線程上進行的,而且為了節(jié)省壓縮的成本,IIS7不對所有的HTTP請求而只對哪些經常會被用戶訪問的靜態(tài)文件進行壓縮版本的長期保存,這也就是為什么我在之前第一次訪問沒有壓縮,短期內再次訪問返回的是壓縮版本,但是再過幾分鐘訪問返回的又是未壓縮版本的原因。這里我們可以理解為IIS7并沒有將壓縮版本實際保存到緩存文件夾中,而是只在服務器內存中做了保存,或者是臨時將壓縮版本保存到緩存文件夾中,一會之后進行刪除。
而IIS7定義什么文件是經常訪問的符合壓縮標準的方法是system.webServer/serverRuntime中的以下兩個屬性,frequentHitThreshold和frequentHitTimePeriod 。如果IIS在frequentHitTimePeriod時間段內接收到了對某個靜態(tài)文件的超過frequentHitThreshold閘值次數(shù)的訪問,那么IIS7就會像IIS6一樣壓縮該靜態(tài)文件并且將這個壓縮后的版本長期保存在壓縮文件的緩存文件夾內。如果用戶訪問網(wǎng)站某文件時,已經在緩存文件夾中存在該文件的緩存版本,那么IIS7是不會再判斷frequentHitThreshhold這個邏輯而是直接返回壓縮版本給瀏覽器。
這種設置的確很蛋疼,但是微軟官方給出的答復是這樣有利用提高服務器性能。。。那么如果想要讓IIS7能夠向IIS6一樣做壓縮的話,有兩種解決方法,當然都是修改frequentHitThreshold和frequentHitTimePeriod這兩個值:
第一種是在web.config中添加以下內容,將frequentHitThreshold調至1,將frequentHitTimePeriod調制10分鐘
<system.webServer>
<serverRuntime enabled="true"
frequentHitThreshold="1"
frequentHitTimePeriod="00:10:00"/>
</system.webServer>
第二種方法是打開%windir%\system32\inetsrv\appcmd.exe,然后再命令行界面中輸入以下命令字符串,然后回車
set config -section:system.webServer/serverRuntime -frequentHitThreshold:1
微軟官方建議比較不激進的辦法是不要調低frequentHitThreshold而是提高frequentHitTimePeriod,這樣對服務器性能更適中。這里要提到的是,對于擁有VPS的朋友們,建議可以手動設置,而虛擬主機用戶能不能設置就得看服務商了,我就很悲劇的改不了。大家試試看吧