雖然在 2014 年的今天,依然還是有許多第三方元件無法正確執行在 64 位元的 CPU 架構下。當我們想要將 ASP.NET 網站跑在 32 位元的應用程式集區上時,IIS 的應用程式集區勢必做出設定,雖然這是個非常容易的設定,但有時候網站卻會在應用程式集區設定完「啟用 32 位元應用程式」之後立刻陣亡,搭配著的晦澀不明的錯誤訊息,真的會有點吐血。接下來,就讓我們一起探究問題的根源吧!
以前我們只要針對要設定的應用程式集區,調整其「進階設定」的「啟用 32 位元應用程式」為 True 即可設定完成。
不過,你很有可能在調整了這個設定之後讓網站掛掉,且應用程式集區也會直接停止,上圖即是將「啟用 32 位元應用程式」切換到 True 並在瀏覽網站後讓應用程式集區掛掉的狀況,所以 DefaultAppPool 才會是停止的狀態。這時網頁的錯誤訊息如下:
Service Unavailable
HTTP Error 503. The service is unavailable.
如果你開啟事件檢視器查看,很有可能看到一些沒什麼幫助的錯誤訊息,例如:
- 正在自動停止應用程式集區 'DefaultAppPool',因為服務該應用程式集區的處理序中發生一連串的失敗。
- 服務應用程式集區 'DefaultAppPool' 的工作者處理序 '6260' 中,有個通訊協定 'http' 的接聽程式通道回報接聽程式通道失敗。資料欄位包含錯誤號碼。
事實上,是你看錯地方了!真正有幫助的錯誤訊息,其實在【Windows 紀錄 / 應用程式】這邊:
所以對我們真正有益的錯誤訊息是:
- 無法下載 C:\WINDOWS\system32\inetsrv\rewrite.dll 模組 DLL。資料為該錯誤。
從這個錯誤訊息看來,自然可以判斷出跟 URL Rewrite 模組有關,不過當你第一次看到「資料為該錯誤」時,應該只會怪自己中文造詣不好對吧!(誤) XD
一般來說我都會透過 Web Platform Installer (Web PI) 來幫我安裝 IIS 模組,當安裝 URL Rewrite 模組的時候,Web PI 其實會自動幫我安裝 x64 位元的版本,如果我想另外下載 x86 的版本,還沒辦法安裝呢!如下圖示:
由於 IIS 的 URL Rewrite 模組無法在 64 位元作業系統安裝 x86 版本 (2014/5/14 更新: 經測試,只有 Windows 8.1 的 IIS 8.5 才無法讓 URL Rewrite 模組執行在 32-bit 模式下,其他像是 Windows Server 2012 R2 上面的 IIS 8.5 並不會發生問題),如果你要將網站執行在 64 位元電腦的 x86 架構下,則必須移除這個網站的 URL Rewrite 模組,不過我們要的並不只是不單單將有問題的模組移除而已,我們還希望同一台主機的其他網站還能正常使用 URL Rewrite 模組,那這要怎樣設定呢?請參考以下步驟!
1. 以系統管理人員身分執行 Notepad 或其他文字編輯軟體
2. 開啟 C:\Windows\System32\inetsrv\config\applicationHost.config 檔案
3. 搜尋以下字串
<add name="RewriteModule" image="%SystemRoot%\system32\inetsrv\rewrite.dll"
3. 將這行修改如下,也就是新增下方紅字的部分,然後直接存檔
<add name="RewriteModule" image="%SystemRoot%\system32\inetsrv\rewrite.dll" preCondition="bitness64" />
4. 接著切換到要停用 URL Rewrite 模組的站台 (其應用程式集區已啟用 32 位元應用程式),請用滑鼠雙擊「模組」功能
5. 最後直接移除 RewriteModule 這個模組
設定完成!
事實上,在問題發生的當下,你並不知道哪一個模組發生了問題,所以學會查看事件檢視器,算是身為 IT 人員的必備技能之一,以上破案過程供大家參考!
相關連結