先說明下為什麼要寫這篇文章,以及糾結於這個“小問題”。首先開啟靜態文件的gzip壓縮非常有利用提高網站的訪問速度,並且有效減少蜘蛛爬行靜態頁面的time-taken,同時也不會像開啟動態文件壓縮一樣可能會對百度蜘蛛造成200 0 64的抓取問題,所以一方面,網站速度快有利於提高用戶體驗,另一方面,google管理員博客在今年已經明確表示網站速度是排名的因素之一,而對於拿國外主機做百度中文站優化,time-taken不理想會導致百度蜘蛛內頁抓的少,國平之前在自己博客文章網頁加載速度是如何影響SEO效果的中也提到過,在固定的一段時間內蜘蛛抓取網站的總時間是固定的,那麼抓取速度上去了,抓取頁面數就會更多,反之則少。
導致兩個主機返回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的朋友們,建議可以手動設置,而虛擬主機用戶能不能設置就得看服務商了,我就很悲劇的改不了。大家試試看吧