在 Service Fabric 上托管多个 public 站点
host multiple public sites on service fabric
我部署了一个 Service Fabric 集群,域为 foo.northcentralus.cloudapp.azure.com
它有一个单节点类型,带有一个 public IP 地址/负载平衡器。
假设我部署了以下两个应用程序:
- http://foo.northcentralus.cloudapp.azure.com:8101/wordcount/
- http://foo.northcentralus.cloudapp.azure.com:8102/visualobjects/
我该如何设置才能让多个域分别托管在端口 80 上? (假设我显然拥有这两个域)
我的集群中是否需要多个 public IP 地址来支持这一点?
我相信是的。单独的 public IP,然后可以将其设置为允许从这些 IP 路由到相同的后端池,但在不同的端口上。
你应该能够通过一些 http.sys 魔法用一个 public IP 地址来做到这一点。
假设您使用 Katana 作为您的网络主机(您引用的字数和视觉 object 示例使用 Katana),那么它应该 就像使用 URL:
中的域名启动服务器
WebApp.Start("http://visualobjects.com:80", appBuilder => this.startup.Invoke(appBuilder));
底层 Windows HTTP Server API 将向该 URL 注册该服务器,任何带有 Host: visualobjects.com
header 的 HTTP 请求将自动路由到该服务器.对具有自己主机名的任意数量的服务器重复上述操作。这是 http.sys 为 multi-website 托管在一台机器上所做的主机路由,与您在 IIS 中所做的一样。
您将 运行 遇到的问题是保留主机名,您必须在打开服务器之前在提升的用户帐户下执行此操作。 Service Fabric 在 ServiceManifest.xml:
中以终结点配置的形式对此提供有限支持
<!-- THIS WON'T WORK FOR REGISTERING HOSTNAMES -->
<Resources>
<Endpoints>
<Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="80" />
</Endpoints>
</Resources>
这里的限制是没有地方可以指定主机名,因此 Service Fabric 将始终注册“http://+:[port]”。不幸的是,如果你想在特定主机名上打开服务器,那是行不通的——你只需要注册你想使用的主机名。您必须使用 netsh 手动执行该部分( 并从 ServiceManifest.xml 中删除同一端口的任何端点,否则它将覆盖您的主机名注册)。
要使用 http.sys 手动注册主机名,您必须 运行 netsh 获取您的服务 运行 所使用的主机名、端口和用户帐户,默认情况下是网络服务:
netsh http add urlacl url=http://visualobjects.com:80/ user="NT AUTHORITY\NETWORK SERVICE"
但是您必须在服务将 运行 开启的每台机器上通过提升的帐户执行此操作。幸运的是,我们有 service setup entry points that can run under elevated account privileges.
编辑
为了使其工作,您需要做的一件事是在您正在侦听的同一端口上打开防火墙。您可以通过以下方式做到这一点:
<Resources>
<Endpoints>
<Endpoint Protocol="tcp" Name="ServiceEndpoint" Type="Input" Port="80" />
</Endpoints>
</Resources>
请注意,协议是 tcp 而不是 http。这将打开防火墙端口,但不会覆盖您使用 .bat 脚本设置的 http.sys 注册。
我部署了一个 Service Fabric 集群,域为 foo.northcentralus.cloudapp.azure.com
它有一个单节点类型,带有一个 public IP 地址/负载平衡器。
假设我部署了以下两个应用程序:
- http://foo.northcentralus.cloudapp.azure.com:8101/wordcount/
- http://foo.northcentralus.cloudapp.azure.com:8102/visualobjects/
我该如何设置才能让多个域分别托管在端口 80 上? (假设我显然拥有这两个域)
我的集群中是否需要多个 public IP 地址来支持这一点?
我相信是的。单独的 public IP,然后可以将其设置为允许从这些 IP 路由到相同的后端池,但在不同的端口上。
你应该能够通过一些 http.sys 魔法用一个 public IP 地址来做到这一点。
假设您使用 Katana 作为您的网络主机(您引用的字数和视觉 object 示例使用 Katana),那么它应该 就像使用 URL:
中的域名启动服务器WebApp.Start("http://visualobjects.com:80", appBuilder => this.startup.Invoke(appBuilder));
底层 Windows HTTP Server API 将向该 URL 注册该服务器,任何带有 Host: visualobjects.com
header 的 HTTP 请求将自动路由到该服务器.对具有自己主机名的任意数量的服务器重复上述操作。这是 http.sys 为 multi-website 托管在一台机器上所做的主机路由,与您在 IIS 中所做的一样。
您将 运行 遇到的问题是保留主机名,您必须在打开服务器之前在提升的用户帐户下执行此操作。 Service Fabric 在 ServiceManifest.xml:
中以终结点配置的形式对此提供有限支持<!-- THIS WON'T WORK FOR REGISTERING HOSTNAMES -->
<Resources>
<Endpoints>
<Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="80" />
</Endpoints>
</Resources>
这里的限制是没有地方可以指定主机名,因此 Service Fabric 将始终注册“http://+:[port]”。不幸的是,如果你想在特定主机名上打开服务器,那是行不通的——你只需要注册你想使用的主机名。您必须使用 netsh 手动执行该部分( 并从 ServiceManifest.xml 中删除同一端口的任何端点,否则它将覆盖您的主机名注册)。
要使用 http.sys 手动注册主机名,您必须 运行 netsh 获取您的服务 运行 所使用的主机名、端口和用户帐户,默认情况下是网络服务:
netsh http add urlacl url=http://visualobjects.com:80/ user="NT AUTHORITY\NETWORK SERVICE"
但是您必须在服务将 运行 开启的每台机器上通过提升的帐户执行此操作。幸运的是,我们有 service setup entry points that can run under elevated account privileges.
编辑
为了使其工作,您需要做的一件事是在您正在侦听的同一端口上打开防火墙。您可以通过以下方式做到这一点:
<Resources>
<Endpoints>
<Endpoint Protocol="tcp" Name="ServiceEndpoint" Type="Input" Port="80" />
</Endpoints>
</Resources>
请注意,协议是 tcp 而不是 http。这将打开防火墙端口,但不会覆盖您使用 .bat 脚本设置的 http.sys 注册。