1. 程式人生 > >為什麼IIS7/7.5的Gzip不起作用

為什麼IIS7/7.5的Gzip不起作用

我在IIS7配置Gzip壓縮一文中介紹了IIS7對於gzip壓縮的相關配置,以及預設情況下,由於IIS7將Javascript配置為動態壓縮(Dynamic Compression),受CPU還有其他因素的影響,不一定會返回gzip壓縮後的內容。 但是前陣子發現,儘管將Javascript配置成了靜態壓縮,請求Javascript指令碼檔案的時候偶爾還是會出現沒有gzip的情況。這篇文章和大家分享一下我遇到的這個問題以及解決這個問題的過程和思路,希望對大家有所幫助。

“隨機”的gzip行為

問題的症狀非常簡單而又奇怪。有時候連續訪問指令碼多次,剛開始沒有gzip,再次訪問又有gzip。等過好一會再去訪問,gzip又沒有了。有的時候則是無論怎麼訪問都不給我返回gzip後的響應。

問題的分析

排除了CPU負載過大的因素,因為發現當深夜機器CPU負載正常的時候也一樣出現這樣的問題。

在系統日誌中發現以下Warning條目,引起了我的注意:

Warning    2010/4/13 6:32:41    IIS-W3SVC-WP    2264    None

The directory specified for caching compressed content C:\inetpub\temp\IIS Temporary Compressed Files\XXX is invalid.  Static compression is being disabled.

通過日誌篩選,發現從09年7月份就一直出現這樣的Warning了,而且出現頻率是隔1-3天左右。

這個資料夾是IIS用於存放壓縮後的靜態內容快取。按照上面日誌的意思,是說這個目錄出了問題,導致靜態壓縮功能被禁用了。但是我明明可以訪問這個資料夾,而且裡頭確實還放著快取的指令碼。

IIS論壇上提這個問題的帖子很多,但最終得到解答的沒看到。不過其中一些人的回覆倒是給了我不少思路。其中有人說道可能是資料夾許可權問題,我看了看那個壓縮快取目錄,上面的許可權的確是應用程式池的身份,沒有問題。使用ProcessMonitor監測了w3wp.exe程序的活動情況,沒有看到這個程序在訪問檔案系統時出現錯誤。

後來在網上看到了Kanwaljeet Singla(IIS開發團隊成員)的一篇文章,介紹IIS7相比IIS6在壓縮模組上的改動,文中提到了一點,從IIS7開始,為了降低開銷,IIS只對那些頻繁訪問的靜態資源啟用壓縮。通過IIS7新引入的兩個配置選項frequentHitThreshold和frequentHitTimePeriod,我們可以設定,當某個資源在frequentHitTimePeriod時間內被連續訪問了frequentHitThreshold次,那麼就算是“頻繁訪問”了。預設的配置是10秒鐘內連續對同一Url發起2次請求就算此Url對應的資源屬於頻繁訪問的資源,IIS伺服器就會對其進行壓縮,然後丟入快取目錄。

這也就解釋了為什麼有時候第一次請求指令碼的時候,伺服器沒有返回gzip壓縮後的內容,而是等你接著下一次訪問的時候才會返回gzip響應。

連續訪問Javascript才會gzip

但是按照這篇文章提到的IIS的設計理念,一旦資源被壓縮快取過,那麼以後就不會再應用這個“頻繁訪問”的檢測邏輯了,因為畢竟已經沒有壓縮開銷了。而我非常確信這個指令碼已經被快取在伺服器硬碟上了,那為什麼我過一段時間再去訪問的時候還是沒有gzip呢?

在IIS7中有一個功能,叫做失敗請求跟蹤(Failed request tracing),允許技術人員跟蹤那些出問題的請求在IIS內部都發生了什麼事。為了揭開我的疑問,我對此網站開啟了失敗請求跟蹤。

IIS7的Bug?!

開啟IIS7管理器,定位到相應的網站右側的操作面板,開啟“失敗請求跟蹤”。預設跟蹤日誌檔案是存放在%SystemDrive%\inetpub\logs\FailedReqLogFiles目錄中。

image image

然後在功能面板中找到“失敗請求跟蹤規則”進行配置:

image

為了防止其他指令碼的干擾,在這裡我限定了只跟蹤測試的指令碼

image

響應狀態填寫200即可

image

接下來是選擇跟蹤提供程式,也就是給你提供跟蹤日誌源的程式,由於我們的指令碼只經過靜態檔案處理器,因此這裡我們只需要選擇www server處理程式即可。

image

然後我們就可以去測試一下訪問出問題的指令碼了。一旦IIS中途處理遇到些問題,那麼就會以xml形式記錄下相關的日誌。開啟FailedReqLogFiles目錄,裡頭會有一些fr000001.xml這樣格式的檔案,每個檔案代表一次失敗請求。我們開啟這個檔案,查詢compression關鍵詞,發現了以下內容:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <System> <Provider Name="WWW Server" Guid="{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"/> <EventID>0</EventID> <Version>1</Version> <Level>4</Level> <Opcode>3</Opcode> <Keywords>0x40</Keywords> <TimeCreated SystemTime="2010-05-13T16:59:08.086Z"/> <Correlation ActivityID="{00000000-0000-0000-FD2B-008041000061}"/> <Execution 

相關推薦

為什麼IIS7/7.5的Gzip作用

我在IIS7配置Gzip壓縮一文中介紹了IIS7對於gzip壓縮的相關配置,以及預設情況下,由於IIS7將Javascript配置為動態壓縮(Dynamic Compression),受CPU還有其他因素的影響,不一定會返回gzip壓縮後的內容。 但是前陣子發現,

在Android 7.0上PopupWindow.showAsDropDown作用的解決方法

使用popupwindow時在android7.0以上使用showAsDropDown方法不起作用,經查詢需要做相容性適配,方法如下: public class Solve7PopupWindow extends PopupWindow { public Solve7PopupWin

導致spring事務配置作用的一種原因

red something 事務配置 nbsp oid -s color con bsp @Component public class AnalyticsApplication { @Autowired private InitializationAc

textArea中的placeholder屬性作用

問題 img tex text tro pan str ext textarea 問題描述: textarea中加的placeholder屬性有給值,但是在jsp頁面中沒有對應的提示信息顯示,如下圖所示: 原因: <textarea>與</texta

AutoCAD 許可管理器作用,或未正確安裝,現在將關閉

選擇 分享 log eight src ref 問題 通過 重新安裝 問題描述 重新安裝了也還是這樣,而且第二次打開都跳不出申請碼界面就關閉了。 問題原因,初步認為:AutoCAD 在首次彈出申請激活類型的類型時,直接選擇了網絡激活,而且沒有激活成功。再

SpringBoot學習遇到的問題(1) - 配置文件有日誌的debug模式等配置項,為什麽作用

boot lease bug fig spa stack 不起作用 網站 cat 這個問題困擾我近乎兩天,通過查找N多資料後終於解決,寫下來共享給大家。 logging.level.root=DEBUG ... 一系列的日誌配置項,都不起作用的原因是springboot啟動

left outer join的on作用

oci join microsoft nbsp mysq soft sel asp msdn left outer join的on不起作用 https://msdn.microsoft.com/zh-cn/library/ms177634.aspx?f=255&am

CSS 中first-child和last-child作用原因

clas 第一個 元素 col 沒有 XML last 發的 n) 今天開發的時候,發現last-child不起作用,看了下原因順便給自己學習CSS選擇器,我們這裏舉個例子,如下代碼:<div><h1>title</h1> <p&g

鼠標滾輪圖片放大縮小功能,使用layer彈框後作用

src con ext 顯示 想是 它的 max msg 隨著 今天在項目中遇到的一個問題:點擊按鈕使用layer彈框彈出一張圖片,需要加一個鼠標滾輪放大縮小,圖片也跟著放大縮小的功能。於是在網上找了一個demo。 DEMO: 1 <!DOCTYPE html P

vue雙向綁定時添加.sync作用的原因

component 2.0 雙向 例子 不同 版本 name 但是 vue <my-component v-bind:my-name.sync="name" v-bind:my-age.sync="age"></my-component> 以上代碼是

ios微信瀏覽器click事件作用的解決方法

ont func 手機 alert 微信 搜索 pan font js代碼 $(document).on( "click", ".weui_cell", functi

Linux下,PHP的SESSION作用的問題

lin mod data article trac ack tracking track rac 改動SESSION目錄的權限就能夠了。 先找到SESSION目錄, 然後 chmod -R 777 /var/lib/php/session 假設沒有此目錄

Custom Email Attribute在客戶端作用原因

con tcl messages 原因 attribute clas nat a-z ble 原文發布時間為:2011-07-16 —— 來源於本人的百度文章 [由搬家工具導入]Custom Email Attribute在客户&#

angular4實戰開發問題——ngclass作用

解決 就會 當我 項目 click clas 定義 刷新 樣式 由於路由機制會導致頁面不刷新。 在項目中,很多都是使用click做的路由跳轉。ngclass有時候會不起作用, 這個時候我是很盲目的,一開始在考慮是不是書寫的問題。ngclass需要有特定的格式?第一個參數為類

安裝jdk配置環境變量JAVA_HOME作用

命令行 問題解決 .com top home 用戶 裝系統 img 環境變量 今天重新安裝系統,需要裝jdk,配置環境變量,於是先配置JAVA_HOME D:\Program Files\Java\jdk1.8.0_144, 然後在配置path路徑,但是cmd到dos命令

過濾器Filter在配置文件中作用

-c 文件夾 -name 都是 文件中 不起作用 gin utl 項目 web.xml內容 <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.s

oracle數據庫訪問order by作用分析

ise oracle post 數據 clas 作用 log url cnblogs Oracle中的rownum與Order By之間的關系 Oracle.ManagedDataAccess.dll 驅動返回結果正確 微軟驅動返回結果不正確,原因未知oracle數據

servlet3.0註解loadOnStartup作用解決方案

color fig 運行 exc back tar med -c spa   多次嘗試3.0在源碼中直接用註解配置loadOnStartup=1,即web應用啟動時創建servlet實例,發現不起作用,但是在web.xml配置則可以正常運行。先上源碼。 package l

web api Route特性(註解)作用

web api route 特性在Web Api 的Controller裏有兩個Action public string Get(string order, int skip, int take) { return "test";

在項目中遇到關於 CSS Overflow Hidden在iPhone & Safari作用

viewport inf 進入 style -h set flex phone src 調試了半天 <!DOCTYPE html> <html> <head> <meta charset="utf-8"