我在Azure上有Service Fabric群集。我想使用此群集来托管多个基于ASP.NET Core的站点。所有站点都必须通过HTTPS(在端口443上)在Internet上访问。每个站点也在不同的域上运行,因此具有唯一的SSL证书。有些网站甚至拥有外卡证书。
我了解到使用WebListener是在Service Fabric上托管基于ASP.NET Core的站点的推荐方法。据我所知,WebListener应该支持通过使用请求HTTP标头来识别所请求的站点,将多个站点绑定到同一个端口。这很酷,但我没有找到有关如何将SSL证书绑定到站点(主机名)的信息。它甚至可能吗?
如果在使用WebListener时无法将证书绑定到特定站点,我不知道实现此目的的任何实际方法。
是否有人知道如何以最少的工作和费用(性能或基础架构成本)以新的网站添加新网站的方式解决此问题?
我想一种方法是为每个站点使用唯一端口,然后在Azure Load Balancer和/或Application Gateway上进行工作。这可能会使管理变得有点复杂,甚至成本也很高(公共IP和应用程序网关并不完全免费)。
答案 0 :(得分:1)
因此,刚刚开始使用新的ASP.Net Core WebSite,我可以看到program.cs文件包含.Net Core的特定ICommunicationListner实现。我将修改该侦听器上的以下方法,以允许您指定应用程序根目录,类似于默认的Owin通信侦听器对WebAPI所执行的操作。这将允许您将多个站点绑定到单个端口。
Task ICommunicationListener.OpenAsync(CancellationToken cancellationToken)
{
var endpoint = FabricRuntime.GetActivationContext().GetEndpoint(_endpointName);
string serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}";
_webHost = new WebHostBuilder().UseWebListener()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup()
.UseUrls(serverUrl)
.Build();
_webHost.Start();
return Task.FromResult(serverUrl);
}
此更改可能如下所示:
string serverUrl = $"{endpoint.Protocol}://+{endpoint.Port}/{this.appRoot}";
然后在服务清单文件中调整端点配置以在https和443上运行
<Endpoints>
<Endpoint Protocol="https" Name="ServiceEndpoint" Type="Input" Port="443" />
</Endpoints>
然后在Service Fabric应用程序清单中添加证书(应该已经部署到VMS),使用指纹识别要使用的证书,如此。
然后仍在应用程序清单中添加策略以将该证书绑定到服务的端点
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="Web1Pkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
<EndpointBindingPolicy EndpointRef="ServiceEndpoint" CertificateRef="Cert1" />
</Policies>
</ServiceManifestImport>
编辑: 修复了服务URL中的拼写错误(approot位于错误的位置)并用weblistener替换了默认的kestrel扩展名。
编辑2: 由于绑定如何与Web Listener一起使用,更新了服务URL以使用通配符
答案 1 :(得分:0)
正如您已经说过的,一种方法(我们使用3个域),就是拥有X个公共IP地址。其中每个都转发到一个内部端口(每个端口不同),该端口在该端口上有一个网站列表(或一个应用程序在多个端口上监听)。然后你可以为每个人分配SSL等。
PublicIP1:443 -> Port 447 -> Webapp listening on port 447
PublicIP2:443 -> Port 448 -> Webapp listening on port 448
PublicIP3:443 -> Port 449 -> Webapp listening on port 449
总而言之,使用ServiceFabric作为网站的托管解决方案可能不是我会做的事情。如果我必须托管多个(读取很多)网站,我会在Azure App Service上执行此操作。如果我需要按比例处理/持久化数据,我会考虑使用SF。但这并不意味着网站必须在SF上运行。