﻿# 介紹好用工具：Web Deployment Tool 1.0 ( 附心得筆記 )

又一個佛心來的工具 [Web Deployment Tools](http://www.iis.net/expand/WebDeploymentTool)，這套工具除了提供基本的 GUI 介面可供站台匯入、匯出外 (如下圖)，還提供指令列工具 ( MSDeploy.exe ) 可供 Web Farm 站台間檔案自動同步，可有效簡化多台 IIS 主機站台檔案更新與同步的問題，這對我們在 Web Farm 環境的部署非常實用。不僅僅支援 IIS 7，[Web Deployment Tools](http://www.iis.net/expand/WebDeploymentTool) 還支援 IIS 6 站台的同步，有興趣的人可以試試看。

[![Web Deployment Tools - 提供基本的 GUI 介面可供站台匯入、匯出](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/83dc05e647d83e20ff71-image_thumb.png "Web Deployment Tools - 提供基本的 GUI 介面可供站台匯入、匯出")](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/bbff1f8a893c590fb492-image.png)

**安裝 Web Deployment Tools 擴充套件 ( 透過 Web Platform Installer 2.0 )**

![安裝 Web Deployment Tools 擴充套件 ( 透過 Web Platform Installer 2.0 )](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/658ee72883c35cf99a1f-image.png "安裝 Web Deployment Tools 擴充套件 ( 透過 Web Platform Installer 2.0 )")

![安裝 Web Deployment Tools 擴充套件 ( 透過 Web Platform Installer 2.0 )](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d4de2a0319631515fb19-image.png "安裝 Web Deployment Tools 擴充套件 ( 透過 Web Platform Installer 2.0 )")

預設 msdeploy.exe 所在路徑為：C:\\Program Files\\IIS\\Microsoft Web Deploy\\msdeploy.exe

**啟動 Web Deployment Tool 的遠端代理程式服務 ( 為了執行站台同步功能 )**

![啟動 Web Deployment Tool 的遠端代理程式服務 ( 為了執行站台同步功能 )](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a55ad4275a82314cfad2-image.png "啟動 Web Deployment Tool 的遠端代理程式服務 ( 為了執行站台同步功能 )")

備註: 若要定時同步站台，記得將該服務**啟動類型**調整為「自動」。

測試 Web Deployment Tool 遠端代理程式服務是否正常啟用，可直接連到以下網址測試即可

```
http://localhost/MSDEPLOYAGENTSERVICE/
```

服務尚未啟用會回傳 HTTP Error 503. The service is unavailable. 的錯誤畫面 (如下圖)

![http://localhost/MSDEPLOYAGENTSERVICE/](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ac147b1c6db3ee33959b-image.png "http://localhost/MSDEPLOYAGENTSERVICE/")

如果服務已啟用則會回應 HTTP 500. 但畫面會是一片空白 (如下圖)

![http://localhost/MSDEPLOYAGENTSERVICE/](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6697b13ccb2bb4cac284-image.png "http://localhost/MSDEPLOYAGENTSERVICE/")

如果你用 [Fiddler](http://www.fiddler2.com/) 查看 HTTP Response Header 的話，會看到如下的內容，其中就有幾行是 MSDeploy 開頭的 Header，這就代表你的服務已經安裝起來了：

```
HTTP/1.1 500 InternalServerErrorTransfer-Encoding: chunkedServer: Microsoft-HTTPAPI/2.0MSDeploy.Response: v1MSDeploy.ExceptionTimeStamp: 5245631824043805581MSDeploy.Exception: H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/Sv.....Date: Mon, 23 Nov 2009 13:42:41 GMT0
```

由於 Web Deployment Tool 的 **遠端代理程式服務** 預設是透過 IIS 提供服務遠端叫用，而預設路徑就是 /MSDEPLOYAGENTSERVICE/，如需修改請參考 [Installing the Web Deployment Tool](https://learn.microsoft.com/en-us/iis/install/installing-publishing-technologies/installing-and-configuring-web-deploy) 的說明。

**自動同步兩台 IIS 7 的站台內容**

透過 Web Deployment Tool 同步多台主機的網站有 4 種方式:

1.  Push ( 將本機的站台同步至遠端主機站台；將本機網站的檔案與設定**推**到遠端主機更新 )
2.  Pull ( 將遠端的站台同步至本機站台；將遠端網站的檔案與設定從遠端**拉**回來更新 )
3.  Independent Sync ( 遙控遠端的電腦執行站台同步至另一台遠端電腦 )
4.  Manual Local Sync ( 先將本機站台備份，然後手動將備份檔移至另一台主機，在執行還原程序 )

**我的測試環境**

-   來源端電腦：192.168.2.63
-   目的端電腦：192.168.2.64

**步驟一：檢視站台相依性**

1\. 執行以下指令查詢站台的相依性，你必須確保遠端的站台也有跟本機站台一樣的相依設定才能執行同步

```
msdeploy -verb:getDependencies -source:apphostconfig="Default Web Site"
```

其中 Default Web Site 為站台的名稱，如下圖示的回應結果中，其中有個相依設定就是 DefaultAppPool 這個應用程式集區是在使用中的，這也代表需同步過去的目的主機的 IIS 上也必須要有同名的應用程式集區才行，如果有其他相依的設定，也必須一起設定好才行。

![msdeploy -verb:getDependencies -source:apphostconfig="Default Web Site"](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d0c7a73a5c4baef45e6c-image.png "msdeploy -verb:getDependencies -source:apphostconfig=\"Default Web Site\"")

**步驟二：設定目的端電腦**

依據步驟一查出的設定，將目的端電腦先設定完成。

**步驟三：同步你的站台至目的端電腦**

1\. 先備份你的 IIS 設定

```
%windir%\system32\inetsrv\appcmd add backup "PreMsDeployBackup"
```

2\. 安裝遠端代理程式服務 ( 預設透過 Web PI 2.0 會自動安裝 )

3\. 啟動遠端代理程式服務 ( 如果你打算用 Push 模式做站台同步，你必須在目的端電腦啟動該服務 )

4\. 測試同步命令是否能正常執行

Push 同步模式：在「來源端」執行以下指令 ( 備註: 以下指令為一行，輸入時請不要斷行 )

```
msdeploy -verb:sync -source:apphostconfig="Default Web Site"     -dest:apphostconfig="Default Web Site",computername=192.168.2.64 –whatif
```

如果成功執行，畫面會顯示變更的摘要資訊（但並沒有真正執行同步動作，因為 -whatif 參數）

![如果成功執行，畫面會顯示變更的摘要資訊（但並沒有真正執行同步動作，因為 -whatif 參數）](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b7a857aeb6044377edcd-image.png "如果成功執行，畫面會顯示變更的摘要資訊（但並沒有真正執行同步動作，因為 -whatif 參數）")

Pull 同步模式：在「目的端」執行以下指令 ( 備註: 以下指令為一行，輸入時請不要斷行 )

```
msdeploy -verb:sync -source:apphostconfig="Default Web Site",computername=192.168.2.63   -dest:apphostconfig="Default Web Site" -whatif
```

5\. 如果上一步驟都測試無誤，即可重新執行一次指令，只要將 -whatif 參數拿掉即可。

如果因為防火牆問題無法執行遠端連線同步，也可用 Manual Local Sync 方式先將站台匯出：

```
msdeploy -verb:sync  -source:apphostconfig="Default Web Site" -dest:archivedir=c:\site1archive
```

然後將 **c:\\site1archive** 整個目錄複製到目的端

然後一樣先驗證同步作業是否會成功 ( 備註: 以下指令為一行，輸入時請不要斷行 )

```
msdeploy -verb:sync -source:archivedir=c:\site1archive     -dest:apphostconfig="Default Web Site" -whatif
```

若沒問題，則移除 -whatif 參數執行同步作業

```
msdeploy -verb:sync -source:archivedir=c:\site1archive -dest:apphostconfig="Default Web Site"
```

**相關連結**

-   [Web Deployment Tool](http://www.iis.net/expand/WebDeploymentTool) ( 包含一個 4 分半的介紹影片 )
-   [Synchronize IIS 7.0](https://learn.microsoft.com/en-us/iis/publish/using-web-deploy/synchronize-iis)
-   [Viewing Dependencies](http://technet.microsoft.com/en-us/library/dd569091\(WS.10\).aspx)
