2011/05/19

將 web sites 從 Server A 轉移至 Server B (IIS 7)

先前公司內部有一台 host 了 30 幾個 sites 的 web server 掛掉了, 後來在重建的過程中只能手動將這 30 幾個 sites 慢慢的一個一個設回來真是搞死人, 所以才開始研究 IIS 的備份和還原這件事, 這個問題搞了好幾天終於在剛剛獲得了解決, 趕快把過程記錄下來以免自己忘記.

首先先把 Server A 上所有 site 的 home directory 全部複製到 Server B 的相同路徑之下.

在 Server A 上把 IIS 的設定備份下來. 在 %WINDIR%\system32\inetsrv 下執行 appcmd add backup [name]
其中 name 是備份檔名, 可以自訂檔名也可以留空白由系統自訂.


在 %WINDIR%\system32\inetsrv 下執行 appcmd list backup 可以看見 Server 上全部的 IIS 備份檔.


這些 IIS 的備份檔有兩種, 一種名稱為 CFGHISTORY_**********, 這是系統自動備份的, 放置的路徑在 %SYSTEM%\interpub\history\ 之下.


另一種檔名不是 CFGHISTORY_********** 的則是由管理員手動所建立的備份, 放置的路徑在 %WINDIR%\system32\inetsrv\backup\ 之下.


挑選想要回覆的備份檔, 將它從 Server A 上複製到 Server B 裡面同樣路徑的地方, 然後在 Server B 的 %WINDIR%\system32\inetsrv 下執行 appcmd restore backup [name]
name 就是 IIS 備份檔的名稱.


理論上只要 site 的 home directory 路徑相同, 經過上面步驟就可以把 web site 從 Server A 遷移至 Server B 了.

原本 Server A 上有 30 幾個 sites.


一瞬間全都轉移至 Server B 上頭了, 就不用手動一個一個 site 新增、設定.


========== 我是分隔線 ==========

不過在實做上卻遇到了些問題:

● 在 Server B 上 appcmd restore backup 這個指令只能用一次, 在第二次之後就會出現 ERROR (hresult:8007005, message: Command execution failed. Access is denied.) 的錯誤訊息.


一開始不知道怎麼解, 只好把 IIS 從 Server B 上移掉之後再重新安裝一次, 很花時間, 後來發現是因為在 restore 之後 rewrite_schema.xml 這個檔案會被加上唯獨屬性, 所以只要用 attrib -r c:\windows\system32\inetsrv\config\schema\rewrite_schema.xml 的指令把唯獨屬性拿掉即可再次進行 restore 的動作.


● 上面的問題解決之後在 Server B 的 IIS 當中每個 site 卻都出現錯誤訊息.


後來發現如果 Server A 是用 domain account 啟動 application pool 的話, 還原到 Server B 之後 application pool 可能無法啟動或是會自動停止, 所以要先在 Server A 上匯出 application pool 的密碼, 執行:
aspnet_regiis -px "iisConfigurationKey" "c:\iisConfigurationKey.xml" -pri
aspnet_regiis -px "iisWasKey" "C:\iisWasKey.xml" -pri

然後把兩個 .xml 檔複製到 Server B 的 C:\ 後再執行匯入 application pool 的密碼到 Server B 上頭:
aspnet_regiis -pi "iisConfigurationKey" "C:\iisConfigurationKey.xml"
aspnet_regiis -pi "iisWasKey" "C:\iisWasKey.xml"

● 當 Server B 的 IIS 裡面沒有其他錯誤之後從 client 端去瀏覽卻都是 HTTP 503 Service Unavailable 的錯誤訊息.


這問題找了很久才發現是 Server B 上的 application pool 會無故停止, 而且會產生 event id=5002、5139 和 8192 等三種與 application pool 相關的錯誤訊息.

event id=5002: M$ 的說明一M$ 的說明二


event id=5139: M$ 的說明


event id=8196


找了好久好久, 找到天荒地老之後才發現原來是我在 Server B 上漏裝了 ASP.NET, 將這個元件裝起來之後 Server B 就 work 了 =.="

1 則回應:

匿名 提到...

Windows老闆,還真是「造福人群」。創造那麼多「就業機會」。
just kidding.

張貼留言

歡迎留下您寶貴的意見, 但廣告以及無意義的夢囈會被砍哦~