使用 AWStats 分析 IIS Log 要注意分析 Log 的時間點

因為我的 Blog 有使用 AWStats 進行流量分析,但奇怪的是每天的凌晨 6 點到 7 點的流量都是 0,而且是每個月都出現一樣的狀況(如下圖示):

我的 Blog 有使用 AWStats 進行流量分析,但奇怪的是每天的凌晨 6 點到 7 點的流量都是 0

我一開始曾經嘗試在凌晨 1:00 的時候進行 Log 分析,但卻感覺每天的統計還是會漏資料,之後我改成每天凌晨 5:30 進行流量的分析,過了一段時間還是覺得有漏資料,因此感覺很奇怪,所以我就決定要將問題找出,幸運的,我也找出問題了。

基本上,預設 IIS 每天都會產生一份 Log,如下圖示:

image

這個問題的癥結點就在於「IIS 何時才會產生下一天的 Log 檔」,經我詳細的研究觀察後發現,原來 IIS 的 Log 的分段點是在格林威治時區(GMT) 00:00 時分段的,由於我們在 Windows Server 2003 中設定的時區是 GMT +0800,所以正確的分段點是在台灣時間的早上 8:00 整會產生新一天的 Log 檔!

問題找到之後,我就將執行流量分析的排程時間改成早上 8:30 進行前一天的 Log 分析,分析的結果就很正確了。

  

此文章由 will 發表於 2008/7/4 下午 12:15:34

永久連結 | 評論 (2) | 此文章的RSSRSS comment feed |

分類: IIS | 系統管理

標籤: , ,

收藏:

調整 IIS 將輸出的內容全部壓縮

有個很簡單的方式可以將透過 IIS 6.0 輸出的網頁內容(包括靜態檔案與程式輸出的內容)全部都自動壓縮過,讓整體網頁的下載速度加快,也節省頻寬耗用。

首先,先開啟「網際網路資訊服務 (IIS) 管理員」,然後在「網站」節點按下滑鼠右鍵,選取「內容(R)」:

 先開啟「網際網路資訊服務 (IIS) 管理員」,然後在「網站」節點按下滑鼠右鍵,選取「內容(R)」

然後切換到「服務」頁籤(Tab)後,勾選 HTTP 壓縮選項中的「壓縮應用程式檔案」與「壓縮靜態檔案」即可。另外有個「暫時目錄」欄位,可以設定這些壓縮的暫存檔要存放在哪個目錄下,如果你 C 磁碟機不夠用的話,可以重新指定一個目錄用來存放這些暫時存放的檔案。

image

輸出的壓縮預設都是使用 gzip 壓縮格式,而大部分的瀏覽器都是可以支援的,相容性沒有多大的疑慮。

  

此文章由 will 發表於 2008/7/3 下午 07:50:12

永久連結 | 評論 (3) | 此文章的RSSRSS comment feed |

分類: IIS | 系統管理

標籤: ,

收藏:

解說 FTP Protocol 的運作原理

我想 FTP 可能有人每天都在用,但卻很少人知道 FTP 運作原理,更尤其是在連不上 FTP 的時候常常都是一頭霧水,在問別人時也可能會發現有人可以連、有人不能連,有的人連的上可以登入成功但是卻無法列出檔案清單,種種的問題只要能了解 FTP 的運作原理就可以很輕易的了解問題出在哪裡,進而解決問題。

基本觀念

使用 FTP 傳輸時,至少會使用到兩個 Port 來建立連線通道:

  • 一個為指令通道(Command Channel),預設使用 Port 21 建立連線,用來傳輸 FTP 指令,例如:列出檔案清單(LIST)、變更目錄(CWD)、取得目前的目錄(PWD)、......等。
  • 另一個為資料通道(DATA Channel),預設使用 Port 20,但是會因 FTP Client 選擇使用的「連線模式」不同而有所不同。

一般來說,指令通道的連線與下指令都沒有什麼問題,有問題的通常是在資料通道的建立,而資料通道的建立方式是由 FTP Client 所下的指令決定的,以 FileZilla 設定為例(如下圖):

image

FTP Client (e.g. FileZilla) 每次建立連線時都會下 PORT 或 PASV 指令,如下範例:

指令:    PASV
回應:    227 Entering Passive Mode (59,37,124,43,158,251)

而每次下指令傳輸資料時,都會建立一次 data connection,包括取得遠端的檔案清單(LIST)時回傳的檔案列表、下載檔案、或上傳檔案。

連線模式

FTP 的連線模式分兩種:主動模式 ( Active mode ) 與 被動模式 ( Passive mode )

  • 主動模式 ( Active mode )

FTP Client 跟 FTP Server 連線後,會主動利用 PORT 指令提出 DATA Channel 連線的要求,如下:

指令:    PORT 10,18,53,171,17,114
回應:    200 Port command successful.

這裡的 PORT 指令是由 FTP Client 送出的,當需要建立 DATA Channel 時,FTP Server 會主動利用 Server 主機的 Port 20 發出連線到 FTP Client 的主機,而 PORT 指令後的參數說明如下:

  • 前四個數字是 FTP Client 的 IP 位址:10.18.53.171
  • 後兩個數字是 FTP Client 接受連線的 Port 埠號,埠號的計算方式是 (第五個數字 * 256 + 第六個數字),以此範例來說,FTP Client 接受的連線埠號是 17 * 256 + 114 = 4,466

由此可知,如果 FTP Client 處於 NAT 的環境下的話,FTP Server 幾乎無法正常的連線到 FTP Client 的主機,所以現在大部分的連線模式幾乎都建議使用者使用被動模式(Passive mode)。

  • 被動模式 ( Passive mode )

FTP Client 跟 FTP Server 連線後,會主動利用 PASV 指令提出 DATA Channel 連線的要求,如下:

指令:    PASV
回應:    227 Entering Passive Mode (59,37,124,43,158,251)

你可以看到由 FTP Client 送出的 PASV 指令並沒有送出其他的參數,而是在 FTP Server 回應的時候出現了 (59,37,124,43,158,251) 字串,當需要建立 DATA Channel 時,這時就會由 FTP Client 主動連接至 FTP Server 動態開放的 Port 供 FTP Client 連接,其中 (59,37,124,43,158,251) 的說明如下:

  • 前四個數字是 FTP Server 的 IP 位址:59.37.124.43
  • 後兩個數字是 FTP Server 接受連線的 Port 埠號,埠號的計算方式是 (第五個數字 * 256 + 第六個數字),以此範例來說,FTP Server 可接受的連線埠號是 158 * 256 + 251 = 40,699

由此可知,使用被動模式(Passive mode)對 FTP Server 的系統管理員來說,可掌控的部分是比較多的,因為 FTP Server 無法決定使用者是否可使用主動模式連線,但若改使用被動模式連線的話,就幾乎能讓所有人正常的使用 FTP 服務。

其他資訊

  • 在 IIS 的 FTP 服務中,當使用 Passive mode 時,IIS FTP 會自動開啟短暫的 Port 用以建立 DATA Channel 供 FTP Client 連接,IIS 預設會動態使用 Port 1024 ~ 65535 進行 DATA Channel 的連線,若要修改預設的 Port Range 可以參考我昨天的文章:如何調整 IIS FTP 在 Passive mode 使用的 Port Range
  • 在 Linux kernel 中,若有設定 MASQ 的話,Kernel 已經支援「動態開啟 FTP DATA PORT」功能,也就是說在 FTP Client 端在 NAT 內部也能以 Active mode 使用 FTP,這就是為什麼有些人在公司內部使用虛擬 IP 也能夠使用主動模式(Active mode)傳輸檔案的情形。

相關連結

  

此文章由 will 發表於 2008/6/29 下午 11:55:41

永久連結 | 評論 (2) | 此文章的RSSRSS comment feed |

分類: IIS | Linux | 心得分享 | 系統管理

標籤: ,

收藏:

如何調整 IIS FTP 在 Passive mode 使用的 Port Range

FTP 有兩種傳輸模式,一種是主動模式(Active mode),另一種是被動模式(Passive mode),不過由於許多公司都是透過 IP 分享器上網,所以不是所有人都能透過 Active mode 傳輸檔案。而現在的 Server 環境也通常有架設防火牆阻擋沒在使用的 Ports,這種情況下也會讓 Passive mode 無法正常運作,因為當 FTP Server 在使用 Passive mode 傳輸資料時,Server 端會動態的使用 Port 1024 ~ 65535 來進行檔案的傳輸,這樣就很有可能被防火牆阻擋掉正常的連線。

所以我今天要教各位如何修改 IIS FTP 在 Passive mode 資料傳輸的 Port Range,這樣你就可以設定好 Firewall 讓這些 Port 開放給 FTP Server 使用。由於各版本的 IIS 設定的方式都不一樣,我假設要開放的 Port Range 從 5000 ~ 5100,以下是修改的方法:

IIS 5.0

  • 開啟 regedit.exe
  • 找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msftpsvc\ParametersPassivePortRange
  • 修改內容為 5000-5100 即可。

IIS 6.0

  • 開啟「命令提示字元」
  • 進入 C:\Inetpub\AdminScripts 目錄
  • 執行 adsutil.vbs set /MSFTPSVC/PassivePortRange "5000-5100"
  

此文章由 will 發表於 2008/6/28 下午 11:40:18

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: IIS | 系統管理

標籤: ,

收藏:

使用 VS2008 開發 ReportViewer 在部署時的注意事項

我最近用 VS2008 開發了一組報表,但在部署到測試機的時後發生了【無法載入檔案或組件 'Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其相依性的其中之一。 系統找不到指定的檔案。】的錯誤:

'/' 應用程式中發生伺服器錯誤。
--------------------------------------------------------------------------------

組態錯誤 
描述: 處理服務此要求所需的組態檔時發生錯誤。請檢視下列的特定錯誤詳細資訊,並適當修改您的組態檔。 

剖析器錯誤訊息: 無法載入檔案或組件 'Microsoft.ReportViewer.WebForms, Version=9.0.0.0, 
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其相依性的其中之一。 系統找不到指定的檔案。

image

因為我們在安裝 Visual Studio 2008 時都已經把所有該安裝的元件都安裝好了,所以部署到沒有 Visual Studio 2008 的主機需要額外安裝 ReportViewer 元件才可以使用。

若您是用 VS2008 開發報表的話,安裝檔可到以下網址下載:

若您是用 VS2005 開發報表的話,安裝檔可到以下網址下載:

  

此文章由 will 發表於 2008/6/16 上午 09:47:40

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | IIS | 系統管理

標籤: , ,

收藏:

如何讓同一個網域設置兩個不同的ASP.NET應用程式

我們最近開發了一個 ASP.NET 2.0 的網站,在開發的時候沒問題,上測試機的時候沒問題,上正式機的時候卻頻頻出狀況,大致的執行環境如下:

  • 開發機(用 ASP.NET Development Server 執行)
    http://localhost:2938/
  • 測試機(用 IIS 6 執行)
    http://mysite.test.com/
  • 正式機(用 IIS 6 執行)
    http://www.myofficalsite.com/app1/

看出差異了吧!因為我們開發的 ASP.NET 網站被安裝在「虛擬目錄」下,而該網站(http://www.myofficalsite.com/)本身就是一個 ASP.NET 2.0 的網站,所以「根目錄的網站(Root Website)」的 Web.config 影響了「虛擬目錄」下的「子網站」的運作,而導致有些控制項被重複載入,或是因為根目錄的網站要載入某些控制項而到了「子網站」時找不到檔案的問題。

我研究了一下找到了解決方案,其實只要加兩行到根目錄網站的 Web.config 即可取消子網站繼承根目錄網站設定,如下:

<location path="." inheritInChildApplications="false">
    <system.web>
    </system.web>
</location>

也就是先開啟根目錄網站的 Web.config 檔案,找到現有的 <system.web> 區段(Section),將整段的最前面加上一行 <location path="." inheritInChildApplications="false"> 標籤,在整段的最後面新增一行 </location> 標籤就可以了,這等於是宣告 ASP.NET 不要將根目錄網站的設定繼承(Inherit)到子網站應用程式(Child Applications)。

這是個很實用的技巧,不過這真的很難找,感覺很少人會討論到這個問題,而我也是之前在看國外 Blog 的時候無意間發現了,最近終於給我用上了。

相關連結

  

此文章由 will 發表於 2008/6/15 下午 12:46:03

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | IIS | 系統管理

標籤: ,

收藏:

解決 IIS Admin Service 無法啟動的問題

今天突然有一台主機的 IIS Admin Service 無法啟動,導致無法使用 IIS 管理員管理網站,當我嘗試使用 net start iisadmin 啟動時,也無法正常啟動。

C:\Documents and Settings\Administrator>net start iisadmin
IIS Admin Service 服務正在啟動 .
IIS Admin Service 服務無法啟動。 

發生跟服務有關的錯誤: 2147549465. 

詳細資料,請輸入 NET HELPMSG 3547。

而我最後的解決方法就是先開啟「Windows 工作管理員」將 inetinfo.exe 這支 Process 強制結束,然後再下 iisreset 指令重新啟動 IIS 就搞定了。

參考網址

  

此文章由 will 發表於 2008/6/14 下午 02:26:32

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: IIS | 系統管理

標籤:

收藏:

如何查看目前 IIS6 有多少人在看哪些網頁

微軟有推出一個 Internet Information Services Diagnostic Tools 工具程式集,可以幫助你分析 IIS 6 的各種問題,其中有個很棒的工具叫做 Request Viewer 可以做到類似 Apache 中 mod_status 產生出來的伺服器執行狀態。如下圖示:

Apache 的 server-status 畫面

Apache 的 server-status 畫面

啟動 IIS Diagnostic Tools 的 Request Viewer

啟動 IIS Diagnostic Tools 的 Request Viewer

IIS Diagnostic Tools 的 Request Viewer 的執行畫面

 IIS Diagnostic Tools 的 Request Viewer 的執行畫面

不過我一開始執行 Request Viewer 的時候發生了一個小狀況,就是會出現【OpenTraceLogFile() failed ( Win32 error: -2147024735 - 指定的路徑不正確。 )】這個錯誤訊息,如下圖所示:

一開始執行 Request Viewer 的錯誤訊息:OpenTraceLogFile() failed ( Win32 error: -2147024735 - 指定的路徑不正確。 )

這個錯誤是因為系統的 TEMP 環境變數中預設值是 %USERPROFILE%\Local Settings\Temp,如果你登入的帳號是 Administrator 的話,這個路徑就在 C:\Documents and Settings\Administrator\Local Settings\Temp:

系統的 TEMP 環境變數

不過這卻會造成 Request Viewer 無法正確存取暫存目錄,解決之道就是將 TEMP 環境變數「改短一點」,例如說你可以在 C:\ 建立一個 TEMP 目錄,並修改 TEMP 環境變數到 C:\TEMP,這樣一來 Request Viewer 就會正確執行了!

相關連結

  

此文章由 will 發表於 2008/5/8 下午 10:21:49

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: IIS | 系統管理

標籤: , ,

收藏:

解決 ASP.NET 中 System.OutOfMemoryException 的問題

這兩天去參加微軟技術菁英學院開的「ASP.NET 應用程式偵錯實戰專班」,雖然才短短兩天的時間,但學到的東西真是獲益良多阿,十分感謝 Terry 與 Louis 針對 Win32 Debugging 與 .NET Debugging 的精闢解析!日後如果有時間的話我也可以多分享一些關於 ASP.NET 偵錯相關技巧與心得,今天我想先分享一些關於 ASP.NET 中關於 System.OutOfMemoryException 的問題與解決方法。

我們之前也有台主機「偶而」會發生 System.OutOfMemoryException 的錯誤,原本想說可能是程式寫不好造成的,但怎麼查都查不太出來問題在哪裡,只要流量一大起來就有可能會導致這個例外狀況,完全是一籌莫展,這次去上課才得知也可能是因為 .NET 的記憶體回收行程 (GC) 所造成的問題。

之所以發生這個問題,是因為多處理器(或多核心)電腦上的 .NET CLR 的 Garbage Collection (GC) 機制預設是使用 Server Mode (伺服器模式) 在運作的,換句話說,就是「每一顆 CPU 都會有獨立的 GC 記憶體空間(堆積, Heap)」,所以如果你的 GC 記憶體空間 用掉了 500MB 且你有 4 顆 CPU 的話,就等於耗費了 2GB 的記憶體,進而發生 System.OutOfMemoryException 例外狀況!

要解決這個問題的方式就是將 GC 設定為 Workstation Mode (工作站模式),這樣就可以整台主機共用同一個 GC Heap,以節省記憶體的使用。要將預設的 GC 修改成 Workstation Mode 必須要修改 %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Aspnet.config 檔案 ( 如果是 .NET 1.1 要修改 %WINDIR%\Microsoft.NET\Framework\v1.1.4322\Aspnet.config 檔案 ):

預設的 Aspnet.config 長這樣:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="false" />
        <legacyImpersonationPolicy enabled="true"/>
        <alwaysFlowImpersonationPolicy enabled="false"/>
        <SymbolReadingPolicy enabled="1" />
    </runtime>
</configuration>

需加上一行 <gcServer enabled="false"/> 如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <runtime>
        <gcServer enabled="false" />
        <legacyUnhandledExceptionPolicy enabled="false" />
        <legacyImpersonationPolicy enabled="true"/>
        <alwaysFlowImpersonationPolicy enabled="false"/>
        <SymbolReadingPolicy enabled="1" />
    </runtime>
</configuration>

這樣就設定完成了!

不過像這種出現 Out of Memory 的例外狀況在 64 位元的作業系統中幾乎不會出現問題,所以如果你是用 64 位元的作業系統(如:Windows Server 2003 64bit ) 的話,是不太需要做這樣的調整的,但你的記憶體還是要夠多才行,否則過多的分頁狀況還是會降低你 ASP.NET 應用程式的執行效能!

除了這點之外,在正式(Production)環境中的 ASP.NET 應用程式一定要在 web.config 中關閉開發時期設定的 debug 與 trace,才不會對記憶體造成額外的負擔。因為 ASP.NET 應用程式在啟用 debug mode 的時候所有的 Symbol 檔(*.pdb)都會被載入到記憶體中,不但會消耗不少記憶體,也會降低執行效能。詳情請見微軟知識庫:Quick things to check when you experience high memory levels in ASP.NET

相關連結

 

  

此文章由 will 發表於 2008/5/7 下午 09:13:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | IIS | 系統管理

標籤: , , , ,

收藏:

如何追蹤 ASP.NET 網站各頁面的執行狀況與效能

通常要監測 ASP.NET 網頁的執行狀況與效能會使用 Trace (追蹤) 功能,大致上追蹤分兩種層級,一種是「網頁層級的追蹤」,另一種是「應用程式層級的追蹤」。

第一種:網頁層級的追蹤

顧名思義就是針對單一網頁的追蹤,你只要在頁面最上方的 Page 指示詞中加入 Trace="true" 屬性就可以啟用了。

    網頁層級的追蹤,顧名思義就是針對單一網頁的追蹤,你只要在頁面最上方的 Page 指示詞中加入 Trace="true" 屬性就可以啟用了

而執行起來後就會出現該頁面中執行時期完整的詳細資訊,包括 HTTP Request 的詳細資訊、追蹤資訊(Page類別中預設事件的執行時間)、整個網頁的控制項樹狀結構、所有的 Session、Cookie、HTTP Header、Form 集合、QueryString 集合、伺服器變數、......等。十分的完整而詳細,對於開發的時候除錯十分的有用。

    網頁層級的追蹤畫面

而在你自己的 Code Behind 事件程式中,就可以使用 Trace.Write 或 Trace.Warn 方法來設定輸出你追蹤的時間點與備註說明,另一方面,對於初學者來說,比較不清楚「事件執行順序」的人也可以透過 Trace 功能協助你瞭解每一個事件的執行順序。而 Trace.Write 方法與 Trace.Warn 方法唯一的不同就是用 Trace.Warn 所輸出的文字是紅色的。

    可以使用 Trace.Write 或 Trace.Warn 方法來設定輸出你追蹤的時間點與備註說明

另外,你也可以在你自己開發的 .NET 元件中使用 HttpContext.Current.Trace.Write 來輸出需要追蹤的訊息。 

    你也可以在你自己開發的 .NET 元件中使用 HttpContext.Current.Trace.Write 來輸出需要追蹤的訊息。

你如果要監控某個事件的執行時間的話,就可以在事件的第一行程式碼寫入一段 Trace.Write 程式,在最後一行寫入 Trace.Write 程式,就可以記錄到這個時間到底執行多少時間了,而你要看的追蹤欄位是「從最末項開始(秒)」這一欄,因為這一欄是指從「上一個追蹤點到這個追蹤點所花費的時間」。

第二種:應用程式層級的追蹤

這個方式可以在整個網站下進行追蹤,不用特別開啟每一頁的追蹤,只要在 web.config 的 <system.web> 區段下宣告以下的設定即可。

[code:html] 


<trace enabled="true" pageOutput="true" requestLimit="100" traceMode="SortByTime" localOnly="true" />


[/code]

開啟後原本的頁面都不會變,但是每一頁在執行的時候都會將追蹤資訊寫入到記憶體中,你可以進入該網站或該虛擬目錄下的  trace.axd 頁面就可以看到所有追蹤的資訊。

例如:http://localhost:1997/trace.axdhttp://localhost/webapp1/trace.axd

應用程式層級的追蹤畫面

每一項追蹤的後面都有「檢視詳細資料」,點進去後就會看到跟「網頁層級的追蹤」一模一樣的資料了,這對於正式主機上的效能監測十分便利,因為有些數據在開發的時候是偵測不出來的,但如果你有辦法再開發時期做好完整的壓力測試的話,當然最好不要在正式執行的環境進行追蹤分析,因為這會對網站的執行效能造成很大的影響。

除了用 Trace 功能之外,要追蹤網頁執行效能還可以用 Log Parser 工具直接從 IIS 產生的 Log 檔進行分析,找出一段時間內執行最久的頁面,然後針對這些執行最久的頁面進行細部的追蹤分析。

底下列出一些使用 Log Parser 分析網頁效能與追蹤潛在問題的文章連結:

相關連結

 

  

此文章由 will 發表於 2008/3/31 上午 12:00:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | IIS

標籤: , , ,

收藏: