尝试访问ELB DNS

时间:2019-01-21 00:35:00

标签: amazon-web-services nginx amazon-ec2 .net-core kestrel-http-server

我尝试使用以下设置(从上到下)在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通信。

2 个答案:

答案 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文件,以所需的方式路由流量)。

我还做了以下工作来简化我对每个角色的意图:

  1. 由于SSL在ALB处终止,因此我修改了Kestrel,使其不再侦听443(HTTPS)流量。它仅侦听80(HTTP)流量。现在,这很好,因为没有VPC的其他成员会由于经过ELB的HTTP流量而构成安全威胁。在ELB上方,所有内容仍处于加密状态。

  2. 我添加了一个ELB侦听器,该侦听器同时侦听443和80流量,并将其转发到仅针对80的目标组(请记住,Kestrel现在仅查找80流量)。

  3. 我还需要将startup.cs更改为不是 UseHttpRedirection; SSL再次在ELB终止。

所有这些东西的组合解决了我的问题。