我尝试使用以下设置(从上到下)在EC2实例上托管ASP.NET Core应用程序。根据以下设置,我在EC2实例以及目标组上都获得了健康状态。另外,如果我检查服务器上Kestrel服务的状态,则可以看到来自目标组的运行状况检查的传入请求,其中包含200个响应。
我遇到的问题是,如果我访问ELB的DNS端点,则会收到502(错误网关)响应。为什么是这样?尤其是因为我在Web服务器上看到对健康检查的请求,并收到200个响应。 但是,我没有看到针对ELB的DNS终结点明确提出的请求。就像对ELB的DNS终结点的请求实际上从未到达Web服务器一样。
另一件事是,我在一个公共子网中有一个跳转服务器,该子网与容纳EC2实例的私有子网在同一VPC内。我能够从跳转服务器向私有IP发出请求,并使用我的登录html返回200响应。 Web服务器上的所有内容似乎都是正确的。外面有什么问题。
53号公路
我正在为我的域使用Route 53托管区域。 HZ的A记录指向弹性负载均衡器。
弹性负载均衡器
来自域的流量(在端口HTTP和HTTPS上)被路由到 Application Load Balancer ,以侦听HTTP(80)和HTTPS(443)。 HTTPS通信具有由证书管理器分配的公共SSL证书。 HTTPS通信在此处终止,并作为HTTP传递到基础实例。
ELB目标组
我有一个指向指定实例的目标组。对于目标组,我以正在运行的应用程序的登录页面为目标,并期望得到200响应。
自动扩展组
我有一个指向ELB目标组的ASG。
Web服务器
对于Web服务器,我正在运行Amazon Linux 2 AMI实例,而Kestrel在Nginx反向代理后面运行。 Kestrel服务托管在端口5000(HTTP)上运行的ASP.NET MVC应用程序。
EC2实例位于专用子网中。在同一VPC和AZ中有一个公用子网,并附加了 Internet网关。
对于.NET Core应用程序的启动配置,我使用的是标准转发头。
在EC2实例上附加了一个安全组,该安全组允许来自ELB安全组的HTTP和HTTPS通信以及来自位于同一VPC的公共子网中的跳转框的SSH通信。
答案 0 :(得分:1)
我想知道是否是因为发送到NGINX的标头太大?您可以通过更改以下配置来增加NGINX中允许的大小。
nginx.conf
http{
...
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
large_client_header_buffers 4 16k;
...
}
default.conf
location /{
...
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
...
}
答案 1 :(得分:0)
最终我发现我的Nginx配置与ELB配置冲突。我最终将nginx.conf恢复到其初始状态,并在conf.d文件夹下提供了更清晰定义的自定义配置(我在这里为我的应用专门创建了一个.conf文件,以所需的方式路由流量)。>
我还做了以下工作来简化我对每个角色的意图:
由于SSL在ALB处终止,因此我修改了Kestrel,使其不再侦听443(HTTPS)流量。它仅侦听80(HTTP)流量。现在,这很好,因为没有VPC的其他成员会由于经过ELB的HTTP流量而构成安全威胁。在ELB上方,所有内容仍处于加密状态。
我添加了一个ELB侦听器,该侦听器同时侦听443和80流量,并将其转发到仅针对80的目标组(请记住,Kestrel现在仅查找80流量)。
我还需要将startup.cs
更改为不是 UseHttpRedirection
; SSL再次在ELB终止。
所有这些东西的组合解决了我的问题。