如何利用 IIS7 的 ARR 模組實做 Reverse Proxy 機制

  分享到噗浪!

IIS7 的 ARR ( Application Request Routing ) 模組是個「非常強悍」的網站工具,今天抽空研究了一下,並成功設定 Reverse Proxy 機制,由於初學者要上手 ARR 真的有點困難,即便是對 Regular Expression 有經驗的 IT 人要成功設定都可能會遇到許多障礙,如果沒使用過 URL Rewrite 或不瞭解 Reverse Proxy 的人要上手那可是難上加難,所以今天我就分享一篇完整的安裝、設定過程。

安裝 Application Request Routing 1.0 模組

1. 使用 Microsoft Web Platform Installer 安裝 Application Request Routing 1.0 模組

使用 Microsoft Web Platform Installer 安裝 Application Request Routing 1.0 模組

2. 預設會連帶 URL Rewrite 一併安裝,以及其他必要的相關元件也會自動安裝

預設會連帶 URL Rewrite 一併安裝,以及其他必要的相關元件也會自動安裝

    接著按下 I Accept 就會進行自動安裝了。

image

3. 若順利安裝,會得到以下畫面

若順利安裝,會得到此畫面

開啟 IIS 管理員進行設定

1. 先檢視模組是否安裝正確,你先點選「伺服器節點」,再看看 IIS 區段中有沒有 Application Request Routing 與 URL Rewrite 模組。

先檢視模組是否安裝正確,你先點選「伺服器節點」,再看看 IIS 區段中有沒有 Application Request Routing 與 URL Rewrite 模組

2. 先對 Application Request Routing 進行設定,啟用 Proxy 功能,以及取消勾選 "Reverse rewrite host in response headers" 選項,然後再點選右邊的「套用」按鈕,其他預設值都可以不用修改。此步驟修正完成後必須重新啟動 IIS 才會生效。

啟用 Proxy 功能,以及取消勾選 "Reverse rewrite host in response headers" 選項,然後再點選右邊的「套用」按鈕,其他預設值都可以不用修改

3. 接著設定 URL Rewrite 模組,也是進入門檻最高的地方。首先我們先新增一組規則 ( Add Rules )

設定 URL Rewrite 模組,也是進入門檻最高的地方。首先我們先新增一組規則 ( Add Rules )

4. 在 Add rule with rewrite map 視窗設定一組 rewrite map 的名稱,你可以自己手動輸入,但名稱請不要使用空白或特殊符號!在這裡我們手動設定名稱為 ReverseProxyMap

在 Add rule with rewrite map 視窗設定一組 rewrite map 的名稱,你可以自己手動輸入,但名稱請不要使用空白或特殊符號!在這裡我們手動設定名稱為 ReverseProxyMap

5. 我們先新增幾筆我們要設定的 Reverse Proxy 對應表,這裡的 Rewrite Map 是一組很簡單的 Key/Value 值而已,我的目的是要用來對應 HTTP Request 的 HTTP_HOST 標頭值,並轉譯成另一個網址,以達到 Reverse Proxy 的目的。

我們先新增幾筆我們要設定的 Reverse Proxy 對應表,這裡的 Rewrite Map 是一組很簡單的 Key/Value 值而已,我的目的是要用來對應 HTTP Request 的 HTTP_HOST 標頭值,並轉譯成另一個網址,以達到 Reverse Proxy 的目的。

6. 然後我們點選 Back To Rules 準備進行修改 URL Rewrite 的主要設定。

然後我們點選 Back To Rules 準備進行修改 URL Rewrite 的主要設定。

7. 接著在預設幫你建立的 Rewrite rule1 for ReverseProxyMap 這個 Rule 上按滑鼠右鍵進行編輯(Edit)

接著在預設幫你建立的 Rewrite rule1 for ReverseProxyMap 這個 Rule 上按滑鼠右鍵進行編輯(Edit)

8. 這裡的預設設定大多不是我們要的,為了達到 Reverse Proxy 的功能,我們必須修改 Conditions 與 Action 的參數。

這裡的預設設定大多不是我們要的,為了達到 Reverse Proxy 的功能,我們必須修改 Conditions 與 Action 的參數。

9. 修改 Conditions 參數,將預設的參數改掉,你只要將 Condition input 修改成 {ReverseProxyMap:{HTTP_HOST}} 即可。

 修改 Conditions 參數,將預設的參數改掉,你只要將 Condition input 修改成 {ReverseProxyMap:{HTTP_HOST}} 即可

10. 最後我們將 Action 區段的 Rewrite URL 修改成 http://{C:0}/{R:0},將 Append query string 勾選,以及將 Stop processing of subsequent rules 勾選,在點選「套用」就大功告成了!

 最後我們將 Action 區段的 Rewrite URL 修改成 http://{C:0}/{R:0},將 Append query string 勾選,以及將 Stop processing of subsequent rules 勾選,在點選「套用」就大功告成了!

---

最後,進行測試 http://192.168.2.253/ 所得到的網頁就是 http://www.miniasp.com/ 的網頁內容,也明確的符合 Reverse Proxy 的需求。

接著我自己新增一筆 Rewrite Map Entry,在 Original Value 的地方我設定成 testarr ( 這是一個不存在的網域,所以我有在我本機的 hosts 檔案設定這筆紀錄 ),在 New Value 的地方設定成另一個網站網址。

接著我自己新增一筆 Rewrite Map Entry,在 Original Value 的地方我設定成 testarr ( 這是一個不存在的網域,所以我有在我本機的 hosts 檔案設定這筆紀錄 ),在 New Value 的地方設定成另一個網站網址。

測試成功!以上圖為例,我連結到 http://testarr/ 所得到的網頁就是 http://www.yam.com/ 網頁的內容!

---

Reverse Proxy 只是 ARR ( Application Request Routing ) 模組的一個應用而已,實際上 ARR 能做的事情可多著呢,例如說組織 Server Farms、實做 HTTP Load Balance ( Layer 7 )、實做 External Cache,甚至於搭配 NLB 還可提供 High Availability (高可用性) 與 Scalability (高延展性) 的網站環境。

在以往要實做這些機制都要花許多錢購買硬體或高價產品,免費的產品也很多,不過就是要與非常極度複雜的設定檔對抗!現在我們有 ARR 這套免費的佛心級模組,再也不怕大流量的網站需求了。

有了 ARR 雖然一開始也沒有很好設定,但是當瞭解 ARR 的架構、觀念、設定之後,你將會發現擁有 GUI 是多麼美好的事情。

相關連結

此文章由 will 發表於 2009/4/13 下午 10:51:00

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

分類: IIS | 系統管理

標籤: , , , ,

評論

四月 13. 2009 23:02

TigerLin

Will 大水啦~~一定要推一下~~
這篇太實用了 ^^b, 讓我這個 URL Rewrite 白癡又學到了一課 Tong

TigerLin Taiwan

九月 23. 2009 19:16

dan0605

今天在Tech-days2009聽了一堂課,也談到ARR,我想這個真是佛心來著的模組呀!不過也來的真晚.

dan0605

十一月 25. 2010 14:13

James

請問在IIS層上實現Url Rewrite,那麼在個人的開發環境(Visual Studio)裡要如何正確執行尚未被重寫的URL?

例如:
1/2/a,重寫為a.apsx?aa=1&bb=2
但重寫的動作在是IIS執行,在VS環境應該不會被重寫
那麼在VS上如何讓1/2/a這樣的URL可以正常運作?

James Taiwan

十一月 25. 2010 15:56

Will 保哥

James: 你開發時可以不用考慮 URL Rewrite 的情境,而是等到上線時再來規劃與定義 URL Rewrite 規則,在 URL Rewrite 裡同時可以設定 Inbound rules 與 Outbound rules。

如果你真要模擬出 URL Rewrite 的情境,那麼建議你直接用 IIS 當作開發伺服器而非使用 ASP.NET 開發伺服器

Will 保哥 Taiwan

十一月 25. 2010 16:16

James


你開發時可以不用考慮 URL Rewrite 的情境,而是等到上線時再來規劃與定義 URL Rewrite 規則,在 URL Rewrite 裡同時可以設定 Inbound rules 與 Outbound rules。


但若只有上線時才改寫程式為URL Rewrite的模式,那就代表每次從開發者電腦要入庫到正式環境的程式,都要檢查及改寫一次URL,不就增加了維護的成本及出錯的機會。

如果你真要模擬出 URL Rewrite 的情境,那麼建議你直接用 IIS 當作開發伺服器而非使用 ASP.NET 開發伺服器。
如果用IIS當作開發伺服器,您是指在每位開發者的電腦上安裝IIS,或是在一台伺服器上建立測試用的IIS呢?

兩者我覺得都可能影響到開發者原來測試程式的流暢度,例如用IIS時能在VS設置中斷點調試程式嗎?

我想知道有什麼方式可以將URL Rewrite應用在多人Team的開發場合,程式能夠流暢的在開發環境及正式環境中切換,而又不會導致開發者額外的麻煩。

James Taiwan

十一月 25. 2010 16:22

Will 保哥

James: 如果考量到開發的流暢性,我個人不建議使用 URL Rewrite 機制。

像我們使用 URL Rewrite 的情境是在於 Mapping 改版前與改版後的網址對應,另一個使用情境是將一些難以記憶的網址透過 URL Rewrite 重寫網址,讓網址更符合 SEO 的要求。像這些需求基本上都是不用考量到開發時的狀況,所以我們並沒有遇到你說的問題。

另外來說,我們公司採用 ASP.NET MVC 開發框架,骨子裡就內建類似 URL Rewrite 機制的 URL Routing,所以開發上也沒有這些問題。

Will 保哥 Taiwan

一月 24. 2011 14:40

chainchung

"Reverse rewrite host in response headers" <--- 請問這個選項的用途是?

chainchung Taiwan

一月 24. 2011 17:39

Will 保哥

chainchung: 這個 "Reverse rewrite host in response headers" 選項如果被勾選,會導致所有在 HTTP Response Header 中所有出現的 domain name 都會被改寫(rewrite)成原本定義的外部 domain name,例如在 HTTP 301 的 Location Header 或是 Set-Cookie Header 上面的 Domain 屬性。

假設我們的內部網站網址是: http://internal.example.com/test.aspx
假設我們的外部網站網址是: http://external.example.com/test.aspx

若是啟用了 "Reverse rewrite host in response headers" 選項,當 http://internal.example.com/test.aspx 這一頁回傳了 HTTP 301 並指定 Location 為 http://www.miniasp.com/ 的話,透過 Reverse Proxy 改寫過回傳到 Client 端的 Location Header 會變成: http://external.example.com/

Will 保哥 Taiwan

一月 24. 2011 18:11

chainchung

保哥: 感謝回應,
請問這種設定機制在實務上的應用情境是?

chainchung Taiwan

一月 24. 2011 18:37

Will 保哥

chainchung: 可以強迫網站不管怎樣轉向(Redirection)都限制轉向到原網站,這樣可以避免被釣魚攻擊。例如 Open redirect vulnerability ( http://www.owasp.org/index.php/Open_redirect )

Will 保哥 Taiwan

一月 25. 2011 10:32

chainchung

保哥: 感謝解惑
再請教一個問題, 文中提到的例子 reverse proxy 再利用 urlrewrite 設定 rewrite map 來處理 ( 將 192.168.2.253 rewrite www.miniasp.com ), 如果 reverse proxy 之後有 2 台以上的機器, 請問題否要加上 server farm 的設定? 這部分要如何進行, 再次感謝.

chainchung Taiwan

一月 25. 2011 11:39

Will 保哥

chainchung: 嗯,沒錯。但這就是另一篇文章要談的事了。 Smile

Will 保哥 Taiwan

一月 25. 2011 13:51

chainchung

保哥: 收到, 期待您的分享, 感謝.

chainchung Taiwan

新增評論


( 您輸入的Email不會顯示於網站上 )

  Country flag

biuquote
  • 評論
  • 線上預覽
Loading