Asp.net

如何從同一伺服器託管 Web 應用程序和 API,同時將它們分開?

  • June 12, 2014

假設我們有 2 個獨立的應用程序,一個 Web Api 應用程序和一個 MVC 應用程序,它們都是用 .NET 4.5 編寫的。如果您要在 IIS 中的主機頭“ <https://www.mymvcapp.com/> ”下託管 MVC 應用程序,是否可以在 IIS 中的主機頭“ https://www. mymvcapp.com/api/ ”?

在 IIS 中執行 2 個應用程序的程序需要分開。我知道託管、自託管和使用 IIS 託管的不同方法。如果可能的話,我想使用 IIS。

另外,如果兩個應用程序(一個 API 和一個 Web 應用程序)都位於單獨的伺服器上,我將如何託管兩個應用程序,以便我可以從中提供 api http://www.mymvcapp.com/api

至少有 4 種方法可以做你想做的事。前兩種方法適用於如果您有 1 個 Web 伺服器,並且這兩個應用程序都由執行 IIS 的那個 Web 伺服器提供服務。如果您在負載均衡器後面執行多個 Web 伺服器,只要 API 和網站在同一台伺服器上執行,此方法也適用。

後兩種方法使用所謂的“反向代理”,本質上是一種根據您接收的流量類型將流量從一個伺服器(代理伺服器)路由到多個內部伺服器的方法。這適用於當您在一組伺服器上執行 Web 伺服器並在另一組伺服器上執行 API。你可以使用任何你想要的反向代理軟體,我提到了 nginx 和 HAProxy,因為我過去都使用過。

執行 IIS 的單個 Web 伺服器

在 IIS 中有兩種方法可以做到這一點:

如果你的物理文件夾結構如下:

c:\sites\mymvcapp
c:\sites\mymvcapp\api

您可以執行以下操作:

創建子應用程序

創建子應用程序將允許從 訪問您的“API”站點www.mymvcapp.com/api,而無需進行任何路由更改。

要做到這一點:

  • 打開 IIS 管理器
  • 點擊左側“站點”文件夾樹中的相應站點
  • 右鍵點擊API文件夾
  • 點擊“轉換為應用程序”

缺點是所有子應用程序都繼承其父應用程序的 Web 配置,如果您在那裡有衝突的設置,您會看到一些執行時怪異(如果它完全有效)。

創建目錄Junction

第二種方法是一種使應用程序保持獨立性的方法;再一次,你不必做任何路由。

假設有兩個文件夾結構:

c:\sites\api
c:\sites\mvcapp

您可以在 Windows 中設置交匯點。從命令行*:

cd c:\sites
mklink /D /J mymvcapp c:\sites\mvcapp
cd mymvcapp
mklink /D /J api c:\sites\api

然後進入 IIS 管理器,並將兩者都轉換為應用程序。這樣,API將在 中可用\api\,但實際上不會與父級共享其 web.config 設置。

多台伺服器

如果您使用 nginx 或 haproxy 作為反向代理,您可以將其設置為將呼叫路由到每個應用程序,具體取決於。

nginx反向代理設置

在您的 nginx.conf 中(最佳實踐是創建一個sites-enabled符號連結到的 conf sites-available,並且您可以在部署時銷毀該符號連結)執行以下操作:

location / {
   proxy_pass http://mymvcapp.com:80
}
location /api {
   proxy_pass http://mymvcapp.com:81
}

然後設置正確的 IIS 設置,讓每個站點監聽埠 80 (mymvcapp) 和埠 81 (api)。

HAProxy

acl acl_WEB hdr_beg(host) -i mymvcapp.com
acl acl_API path_beg -i /api

use_backend API if acl_API
use_backend WEB if acl_WEB

backend API
server web mymvcapp.com:81

backend WEB
server web mymvcapp.com:80

*我正在從記憶體中發出 Junction 命令;幾個月前我這樣做了,但不是最近,所以如果命令有問題,請告訴我

注意:配置文件並不是完整的配置文件——只是為了顯示反向代理所需的設置。根據您的環境,您可能需要設置其他設置。

引用自:https://stackoverflow.com/questions/24189181