如何从同一服务器托管 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:81
或 proxy_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?