具有nginx和.NET核心服务的服务结构

具有nginx和.NET核心服务的服务结构,nginx,asp.net-core,azure-service-fabric,Nginx,Asp.net Core,Azure Service Fabric,我正在设置一个Service Fabric应用程序,其中包含: 作为前端的Nginx实例(单个实例,端口80) 一些使用Asp.net核心编写的应用程序(1个网站,一些API服务)(多实例,动态端口) 用于地址解析的网关服务(单实例,端口8081) 对于nginx,我使用的解决方案如下所示。 网关和运行.NET核心应用程序的一般示例已被采用 .NET核心团队建议自己在真正的web服务器后面托管应用程序,比如nginx。 因此,我希望使用nginx实例作为入口点来部署我的Service Fab

我正在设置一个Service Fabric应用程序,其中包含:

  • 作为前端的Nginx实例(单个实例,端口80)
  • 一些使用Asp.net核心编写的应用程序(1个网站,一些API服务)(多实例,动态端口)
  • 用于地址解析的网关服务(单实例,端口8081)
对于nginx,我使用的解决方案如下所示。
网关和运行.NET核心应用程序的一般示例已被采用

.NET核心团队建议自己在真正的web服务器后面托管应用程序,比如nginx。 因此,我希望使用nginx实例作为入口点来部署我的Service Fabric应用程序,它重定向到网关服务,网关服务将为复制的无状态服务执行服务解析

我的问题是,我需要在nginx.conf中使用哪个地址来指向网关地址。在本地尝试时,我可以使用本地地址127.0.0.1,它可以按预期工作,但是如果在真正的集群上,我的Nginx和网关实例部署到不同的机器上,会发生什么情况

这是我的应用程序清单:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="SFApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="NginxPoC_InstanceCount" DefaultValue="1" />
    <Parameter Name="Gateway_InstanceCount" DefaultValue="1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="NginxPoCPkg" ServiceManifestVersion="1.0.0" />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="Admin" EntryPointType="All" />
    </Policies>
  </ServiceManifestImport>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Gateway" ServiceManifestVersion="1.0.0" />
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="NginxPoC">
      <StatelessService ServiceTypeName="NginxPoCType" InstanceCount="[NginxPoC_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
    <Service Name="Gateway">
      <StatelessService ServiceTypeName="GatewayType" InstanceCount="[Gateway_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
    <Users>
      <User Name="Admin">
        <MemberOf>
          <SystemGroup Name="Administrators" />
        </MemberOf>
      </User>
    </Users>
  </Principals>
</ApplicationManifest>
更新2016-10-09


根据讨论中的要求,我创建了一个测试项目。欢迎对该项目的每一项贡献。

如果您将nginx和网关服务部署到所有节点(InstanceCount=-1),您应该很好。如果某个节点上的网关服务关闭,您当然无法将请求从nginx转发到另一个节点上的网关服务。为此,您需要nginx服务来查找网关服务


您可以使用REST调用获取网关的服务端点地址:

我已经尝试过了,将InstanceCount设置为-1,并在nginx config中使用127.0.0.1作为重定向地址(指定服务的端口),假设服务在每个节点上都可用。不幸的是,它不起作用。你看过这个博客吗,描述了软件包的用法:是的,我正在使用这个软件包。我发现了问题:在启动.net核心应用程序时,我只配置了端点url。一旦我添加了本地地址(和端口),一切都正常了。答案是正确的。很好-很高兴知道:-)您愿意在GitHub或其他地方共享该项目,作为其他人可以查看的示例吗?我已使用GitHub上的测试解决方案链接更新了该问题。创建问题,但是,如果您正在创建一个用于服务解决方案的网关,为什么还要使用nginx呢?因为nginx也只是一个代理?我也有过同样的经历,但我选择不让nginx出现在前台,所以我很好奇.NET核心团队建议让IIS或nginx出现在Kestrel面前。此外,我还将获得gzip、http2等好处。如果这些建议来自公共链接,请告诉我们。这是有道理的,也许从这些建议中还有其他值得一读的东西。引用:Kestrel设计为在代理(例如IIS或Nginx)后面运行,不应直接面向Internet部署。这里有一些提示:我编写了一个代理网关来避免使用nginx,但基于此,我将正确地使用nginx。但是使用nginx,我不明白为什么您也需要网关项目。你能不能告诉nginx转发服务?
server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass   http://127.0.0.1:8081;
        }
}