假设我们有两个独立的应用程序,一个Web Api应用程序和一个用.NET 4.5编写的MVC应用程序。如果您要在主机标题“https://www.mymvcapp.com/”下的IIS中托管MVC应用程序,是否可以在主机标题“https://www.mymvcapp.com/api/”下的IIS中单独托管Web Api应用程序?
在IIS中运行2个应用程序的进程需要分开。我知道使用IIS托管,自托管和托管的单独方法。我想尽可能使用IIS。
另外,如果每个应用程序位于一个单独的服务器上,我将如何托管两个应用程序(API和Web应用程序),以便我可以从http://www.mymvcapp.com/api
提供api?
答案 0 :(得分:29)
至少有4种方法可以做你想做的事。前两种方法适用于如果您有1个Web服务器,并且这两个应用程序都是从运行IIS的那个Web服务器提供的。如果您在负载均衡器后面运行多个Web服务器,只要API和Web站点在同一服务器上运行,此方法也可以工作。
后两种方法使用所谓的“反向代理”,实质上是一种将流量从一个服务器(代理服务器)路由到多个内部服务器的方法,具体取决于您接收的流量类型。这适用于在一组服务器上运行Web服务器并在另一组服务器上运行API 时。你可以使用你想要的任何反向代理软件,我提到nginx和HAProxy,因为我过去都使用过这两种软件。
在IIS中有两种方法:
如果您的物理文件夹结构如下:
c:\sites\mymvcapp
c:\sites\mymvcapp\api
您可以执行以下操作:
创建子应用程序将允许您从www.mymvcapp.com/api
访问“API”网站,而无需进行任何路由更改。
要做到这一点:
API
文件夹缺点是所有子应用程序都继承了其父级的Web配置,如果你有相互矛盾的设置,你会看到一些运行时奇怪(如果它可以工作)。
第二种方法是这样做,以便应用程序保持其独立性;再一次,你不需要做任何路由。
假设有两个文件夹结构:
c:\sites\api
c:\sites\mvcapp
您可以在Windows中设置Junctions。从命令行*:
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.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)上侦听。
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命令;几个月前我这样做了,但最近没有,所以如果命令存在问题,请告诉我
NB :配置文件不是完整的配置文件 - 仅显示反向代理所需的设置。根据您的环境,您可能需要设置其他设置。