具有nginx和.NET核心服务的服务结构
我正在设置一个Service Fabric应用程序,其中包含:具有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
- 作为前端的Nginx实例(单个实例,端口80)
- 一些使用Asp.net核心编写的应用程序(1个网站,一些API服务)(多实例,动态端口)
- 用于地址解析的网关服务(单实例,端口8081)
网关和运行.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;
}
}