先說明下為什麼要寫這篇文章,以及糾結於這個小問題。首先開啟靜態檔案的gzip壓縮非常有利用提高網站的存取速度,並且有效減少蜘蛛爬行靜態頁面的time-taken,同時也不會像開啟動態檔案壓縮一樣可能會對百度蜘蛛造成200 0 64的抓取問題,所以一方面,網站速度快有利於提高用戶體驗,另一方面,google管理員博客在今年已經明確表示網站速度是排名的因素之一,而對於拿國外主機做百度中文站優化,time-taken不理想會導致百度蜘蛛內頁抓的少,國平之前在自己博客文章網頁加載速度是如何影響SEO效果的中也提到過,在固定的一段時間內蜘蛛抓取網站的總時間是固定的,那麼抓取速度上去了,抓取頁面數就會更多,反之則少。
好吧,開始正文,在上篇文章《蜘蛛抓取靜態頁面與觸發gzip壓縮的實驗結果》中的問題二,我提出了gzip靜態頁面的壓縮版本在伺服器上保存方式的猜測,在困惑了許久之後,發現導致兩個主機返回gzip結果不同的最終原因是iis版本而不是我猜測的快取資料夾設定太小
事實上,iis7比iis6在靜態壓縮上有了較大的更新,在IIS6中,靜態壓縮是在一個不同的線程上進行的,所以在收到一個HTTP請求後,第一個發送給瀏覽器的HTML版本是沒有壓縮過的,而同時IIS6會開始使用一個不同的執行緒對這個檔案進行壓縮並且將這個壓縮後的版本長期保存在壓縮檔案的快取資料夾內。而在以前,也就是IIS6伺服器上,在壓縮完成之後凡是對該被壓縮版本的靜態檔案的HTTP請求,IIS6都會直接從快取資料夾中直接呼叫壓縮後的版本並回傳給瀏覽器。
但是在IIS7中,壓縮是在主執行緒上進行的,而且為了節省壓縮的成本,IIS7不對所有的HTTP請求而只對哪些經常會被使用者存取的靜態檔案進行壓縮版本的長期保存,這也就是為什麼我在之前第一次訪問沒有壓縮,短期內再次訪問返回的是壓縮版本,但是再過幾分鐘訪問返回的又是未壓縮版本的原因。這裡我們可以理解為IIS7並沒有將壓縮版本實際保存到快取資料夾中,而是只在伺服器記憶體中做了保存,或者是臨時將壓縮版本保存到快取資料夾中,一會之後進行刪除。
而IIS7定義什麼檔案是經常存取的符合壓縮標準的方法是system.webServer/serverRuntime中的以下兩個屬性,frequentHitThreshold和frequentHitTimePeriod 。如果IIS在frequentHitTimePeriod時間段內接收到了對某個靜態檔案的超過frequentHitThreshold閘值次數的訪問,那麼IIS7就會像IIS6一樣壓縮該靜態檔案並且將這個壓縮後的版本長期保存在壓縮檔案的快取資料夾內。如果使用者造訪網站某檔案時,已經在快取資料夾中存在該檔案的快取版本,那麼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的朋友們,建議可以手動設置,而虛擬主機用戶能不能設置就得看服務商了,我就很悲劇的改不了。大家試試看吧