2016-10-05 12 views
3

我在Azure上拥有Service Fabric群集。我想使用此群集来托管多个基于ASP.NET Core的站点。所有站点都必须通过HTTPS(端口443)在Internet上访问。另外每个站点都在不同的域上运行,因此具有唯一的SSL证书有些网站甚至有通配符证书。如何在单个服务结构群集上承载具有唯一SSL证书的多个支持HTTPS的站点

我知道使用WebListener是在Service Fabric上托管基于ASP.NET Core的站点的推荐方式。据我所知,WebListener应该支持通过使用请求HTTP头来识别请求的站点来将多个站点绑定到相同的端口。这很酷,但我还没有找到关于如何将SSL证书绑定到站点(主机名)的信息。它甚至有可能吗?

如果在使用WebListener时无法将证书绑定到特定的站点,我不知道实现此目的的任何实际方法。

是否有人知道如何解决这个问题,这种方式对于以最少的工作和费用(性能或基础结构成本)将新站点添加到集群是实用的?

我想一个办法是为每个站点使用唯一的端口,然后在Azure负载平衡器和/或应用程序网关上工作。这可能会让管理变得有点复杂,甚至代价昂贵(公共IP和应用程序网关并不完全免费)。

回答

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> 

然后在服务织物应用程序清单添加到证书中(应该已经部署到VMS),使用指纹识别使用哪个证书,如此。

然后仍然在应用程序清单中的策略添加到证书到端点绑定为您服务

<ServiceManifestImport> 
    <ServiceManifestRef ServiceManifestName="Web1Pkg" ServiceManifestVersion="1.0.0" /> 
    <ConfigOverrides /> 
    <Policies> 
     <EndpointBindingPolicy EndpointRef="ServiceEndpoint" CertificateRef="Cert1" /> 
    </Policies> 
    </ServiceManifestImport> 

编辑:在服务URL 固定错字(为approot是错误的位置)并用weblistener替换默认的红隼扩展。

编辑2: 更新服务URL中使用通配符由于Web侦听

+0

对不起,但这不符合我的要求。我想拥有多个网站,每个网站绑定到不同的域,而不是不同的路径。另外每个站点都需要单独的SSL证书。 Kestrel也不适合面向互联网的网站,所以我不能使用它。 –

+0

另外我不认为这实际上甚至可以工作,因为红隼不支持端口共享。一个人不应该能够将多个kestrel服务器绑定到单个端口。 –

+0

您的更新回答不应该削减它。见http://stackoverflow.com/questions/38700563/host-multiple-public-sites-on-service-fabric主要问题是同一端口上的多个SSL证书,我不认为它与服务有关布。 –

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应用服务上执行此操作。如果我然后需要处理/持续的数据规模,我会看看可能使用SF。但这并不意味着网站必须运行在SF上。

+0

我试图实现这个昨天,并且确实有效,如果没有真正的网站数量可能会好起来。但确实使用应用服务更容易,可能更适合这一点。这是不幸的,因为如果我能够高效并且容易地重新使用用于一般站点托管的服务结构基础设施,那将是非常好的。 –

+0

解决这个问题的另一种方法是将类似HAProxy的东西放在前面,以处理SSL终止和反向代理请求,以便在SF中运行正确的WebApp。 然后,您可能必须在启动WebApps时注册HAProxy,并在关闭时取消注册。 – anderso

相关问题