AWS-ALB 的 Nginx 容器健康检查

AWS-ALB 的 Nginx 容器健康检查

我需要为 ALB 设置一个健康检查路径,该路径指向具有 Docker 容器 Nginx 的服务器。我无法访问 EC2 服务器内部以在其中添加文件。我只能在 Docker-Container 中添加一些内容

我尝试了以下解决方案,但是它对我来说不起作用,因为我猜我的配置文件中有另一个阻止它的块。

用于 AWS Amazon ELB 健康检查的 Nginx 解决方案 - 返回 200 而不带 IF

我的配置文件如下所示:

server 
{    
   listen      443 ssl http2;
   server_name     server-test.com;
   access_log  /var/log/nginx/nginx.access.log;
   error_log   /var/log/nginx/nginx.error.log;
   ssl    on;
   ssl_certificate    /etc/nginx/ssl/cert.pem;
   ssl_certificate_key    /etc/nginx/ssl/server.key;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;
   ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
   ssl_session_timeout 1d;
   ssl_session_cache builtin:1000 shared:SSL:10m;
   ssl_session_tickets off;

   location /
   {
      proxy_pass         http://server-test.io:5015/;
      proxy_redirect     off;

      ##proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;

      proxy_buffer_size          4k;
      proxy_buffers              4 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;
   }
 }
...
...
...

# Health check url
server {
  location /elb-status {
    access_log off;
    return 200 'A-OK!';
    add_header Content-Type text/plain;
  }
}
# Redirect non-existing domains to 404
server {
  server_name _;
  listen 80 default_server;
  return 404;
}
server {
  server_name _;
  listen 443 ssl;
  ssl_certificate    /etc/nginx/ssl/cert.pem;
  ssl_certificate_key    /etc/nginx/ssl/server.key;
  return 404;
}

当我打开路径为 /elb-status 的服务器时,它显示 404 Not Found。而且 LoadBalancer 下的服务器状态也不正常。我认为这是因为阻止:“重定向不存在的域”,但我也需要该阻止。

任何帮助,将不胜感激。

根据 Andy 的回复进行编辑:

ALB 健康检查

ALB 靶机

Docker 容器中的 Nginx 配置文件

Nginx 容器使用端口 80 和 443,我已经基于这些端口为包含 Nginx docker 容器的服务器设置了目标组,但服务器健康检查仍然不健康。

这里我遗漏了什么吗?

答案1

在另一个端口上运行server包含的块怎么样?location /elb-status

创建 ALB 时,有一个Advanced health check settings下拉菜单。在这些设置中,您可以覆盖健康检查端口。您可以将端口设置为类似以下值8080,然后您的端口server将变为:

server {
  listen 8080;
  location /elb-status {
    access_log off;
    return 200 'A-OK!';
    add_header Content-Type text/plain;
  }
}

在此设置中,健康检查无需基于虚拟主机的路由。端口8080将专用于健康检查。

如果您选择采用这条路线,请不要忘记在 ALB 和 EC2 实例之间的安全组中打开适当的端口。

答案2

我遇到了同样的问题。最简单、最干净的解决方案(IMHO)是添加一个默认服务器块来处理健康检查和未知域:

server {
  listen 80 default_server;

  # Catch all requests with an invalid HOST header
  location / {
    return 444;
  }

  # Health check endpoint
  location /ping { # or whatever endpoint you are using
    access_log off;
    return 200 "pong!";
  }
}

相关内容