如何从同一服务器托管 Web 应用程序和 API,同时将它们分开?

Posted

技术标签:

【中文标题】如何从同一服务器托管 Web 应用程序和 API,同时将它们分开?【英文标题】:How do I host a web application and an API from the same server while keeping them in separate? 【发布时间】:2014-08-03 01:27:11 【问题描述】:

假设我们有 2 个独立的应用程序,一个 Web Api 应用程序和一个 MVC 应用程序,它们都是用 .NET 4.5 编写的。如果要在 IIS 中的主机标头“https://www.mymvcapp.com/”下托管 MVC 应用程序,是否可以在 IIS 中的主机标头“https://www.mymvcapp.com/api/”下单独托管 Web Api 应用程序?

在 IIS 中运行 2 个应用程序的进程需要分开。我知道托管、自托管和使用 IIS 托管的不同方法。如果可能的话,我想使用 IIS。

另外,如果两个应用程序(一个 API 和一个 Web 应用程序)位于单独的服务器上,我将如何托管两个应用程序,以便我可以从 http://www.mymvcapp.com/api 提供 API?

【问题讨论】:

【参考方案1】:

至少有 4 种方法可以做你想做的事。前两种方法适用于如果您有 1 个 Web 服务器,并且这两个应用程序都由运行 IIS 的那个 Web 服务器提供服务。如果您在负载均衡器后面运行多个 Web 服务器,只要 API 和网站在同一台服务器上运行,此方法也适用。

后两种方法使用所谓的“反向代理”,本质上是一种根据您接收的流量类型将流量从一个服务器(代理服务器)路由到多个内部服务器的方法。这适用于您在一组服务器上运行 Web 服务器并在另一组服务器上运行 API。你可以使用任何你想要的反向代理软件,我提到了 nginx 和 HAProxy,因为我过去都使用过。

运行 IIS 的单个 Web 服务器

在 IIS 中有两种方法:

如果你的物理文件夹结构如下:

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

您可以执行以下操作:

创建子应用程序

创建一个子应用程序将允许您从www.mymvcapp.com/api 访问您的“API”站点,而无需进行任何路由更改。

这样做:

打开 IIS 管理器 点击左侧“站点”文件夹树中的相应站点 右击API文件夹 点击“转换为应用程序”

缺点是所有子应用程序都继承其父应用程序的网络配置,如果您在其中有冲突的设置,您会看到一些运行时怪异(如果它完全有效的话)。

创建目录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 命令;几个月前我这样做了,但不是最近,所以如果命令有问题,请告诉我

注意:配置文件并不是完整的配置文件——只是为了显示反向代理所需的设置。根据您的环境,您可能需要设置其他设置。

【讨论】:

是否可以使用您提到的任何方法将应用程序托管在不同的服务器上? @bosts 是的。在这种情况下,您需要提供要代理的服务器的 IP/主机名。例如,proxy_pass http://anotherlocalserver.com:81proxy_pass http://172.168.0.2:81,这将是该单独服务器的 IP 地址。

以上是关于如何从同一服务器托管 Web 应用程序和 API,同时将它们分开?的主要内容,如果未能解决你的问题,请参考以下文章

在同一个 Web 应用程序中托管 WCF 服务和 Web API

如何在 firebase 托管中托管单页 webapp 的静态文件,并将 web API 部署在不同的服务器中

支持 https 的 Owin 自托管控制台应用程序(无 Web api,无 SignalR)

如何从同一 Azure AD 中的另一个 Web 应用程序访问 Web api?

如何在自托管 Web API 应用程序中配置 OData 端点

Exchange Web 服务托管 API:如何通过 FindItem 方法执行重复扩展?