[Windows Azure] 在單一 Web Role 中部署多個 Web 應用程式

前面我們已經介紹了 Windows Azure v1.3 更新中的新功能之一:Full IIS,它可以允許開發人員在同一個 Web Role 中建置多個不同的網站應用程式,但目前 Windows Azure Tools for VS 2010 的專案模式,並不能在專案中直接設定在單一 Web Role 中部署多重網站或虛擬目錄,因此我們要用手動的方式來做一些改變。

前面我們已經介紹了 Windows Azure v1.3 更新中的新功能之一:Full IIS,它可以允許開發人員在同一個 Web Role 中建置多個不同的網站應用程式,但目前 Windows Azure Tools for VS 2010 的專案模式,並不能在專案中直接設定在單一 Web Role 中部署多重網站或虛擬目錄,因此我們要用手動的方式來做一些改變。

1. 首先,我們可以先用 Visual Studio 建立一個 Windows Azure 專案,而且加入多個 Web Role。

image

 

2. 建置完成後,修改一下各 Web 應用程式的 Master Page,以識別不同的 Web 應用程式,然後將其中兩個 Web Role 由雲端專案中移除 (筆者所用的是 RootApp, VirtualDirApp1, VirtualDirApp2 三個專案,在這個步驟筆者將 VirtualDirApp1 和 VirtualDirApp2 移除),並且在留下來的專案中,建立兩個目錄 (筆者建立了 VirtualDirApp1 和 VirtualDirApp2 兩個目錄)。

image

 

3. 將另兩個 Web 應用程式發行到 Web Role 的專案,事先建立的資料夾中 (筆者是將 VirtualDirApp1 發行到 VirtualDirApp1 資料夾,另一個則是發布到 VirtualDirApp2),然後在  Web Role 專案中,將這些發行好的檔案加到專案中。

image

image

 

4. 接著就是這篇文章最重要的步驟,請打開雲端專案的 ServiceDefinition.csdef 檔案,並且加入虛擬目錄的設定:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="FullIISDeploy" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="RootApp">
    <Sites>
      <Site name="Web">
        <VirtualApplication name="VirtualDirApp1" physicalDirectory="../VirtualDirApp1" />
        <VirtualApplication name="VirtualDirApp2" physicalDirectory="../VirtualDirApp2" />
        <Bindings>
          <Binding name="HttpIn" endpointName="HttpIn" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
  </WebRole>
</ServiceDefinition>

 

5. 按 F5 啟動 Visual Studio Debugger,並開啟 IIS Manager,你可以看到在 IIS Manager 中會自動增加了由 Development Fabric 掛上的 Web Role 網站,以及配合執行的應用程式集區,當然,你也可以直接在 IIS 上瀏覽這些 Web 應用程式。

image

 

6. 將除錯器停止,然後我們再試著修改 ServiceDefinition.csdef,把原本在虛擬目錄中的 Web 應用程式設定改成網站,此時除了網站本身以外,還要再加上聆聽的終端點 (一個網站只能聆聽一個 port,除非有設定主機標頭 header)。

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="FullIISDeploy" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="RootApp">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="HttpIn1" endpointName="HttpIn1" />
        </Bindings>
      </Site>
      <Site name="VirtualDirApp1" physicalDirectory="../VirtualDirApp1">
        <Bindings>
          <Binding name="HttpIn2" endpointName="HttpIn2" />
        </Bindings>
      </Site>
      <Site name="VirtualDirApp2" physicalDirectory="../VirtualDirApp2">
        <Bindings>
          <Binding name="HttpIn3" endpointName="HttpIn3" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpIn1" protocol="http" port="80" />
      <InputEndpoint name="HttpIn2" protocol="http" port="81" />
      <InputEndpoint name="HttpIn3" protocol="http" port="82" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
  </WebRole>
</ServiceDefinition>

現在再次啟動除錯器,你可以發現現在 IIS 中多了三個 Web 網站:

image

 

當本機測試完成後,就可以部署到雲端上,筆者建議作業系統選用 Windows Azure Guest OS 2.0,搭載的是 Windows Server 2008 R2 以及 IIS 7.5,運行起來會更穩定。

 

Reference:

Windows Azure SDK v1.3 – How to configure a Web Role for Multiple Web Sites
Windows Azure SDK v1.3 – How to configure the Virtual Directory Location
Windows Azure SDK v1.3 – How to configure the Site Entry in the Service Definition File