AWS Elastic Beanstalk负载均衡模式下Django健康检查失败
检查负载均衡目标组的健康检查配置
默认情况下,Elastic Beanstalk负载均衡的健康检查会指向实例HTTP 80端口的根路径(/)。如果你的Django根路径存在重定向、登录拦截等情况,会导致健康检查返回非200状态码,触发失败标记。
解决办法:在Django中添加专门的健康检查端点,比如:# views.py from django.http import HttpResponse def health_check(request): return HttpResponse("OK", status=200)在
urls.py中配置路由:path('health/', health_check),然后在EC2控制台的目标组设置里,将健康检查路径改为/health,协议保持HTTP(实例内部通常以HTTP提供服务,负载均衡负责转HTTPS)。核对安全组的健康检查流量规则
再次确认:负载均衡的安全组需允许出站访问实例的80端口;实例的安全组需允许来自负载均衡安全组的80端口入站请求。即使之前配置过,也可能存在规则优先级或组关联错误。排查实例日志中的健康检查请求状态
进入Elastic Beanstalk环境的日志页面,查看Web服务器日志或请求日志,定位健康检查请求的返回码。如果返回301/302重定向(比如Django开启了SECURE_SSL_REDIRECT强制HTTPS),负载均衡默认不会跟随重定向,会判定检查失败。
解决办法:修改重定向逻辑,让健康检查端点跳过HTTPS强制跳转,比如在中间件中判断路径:# 自定义中间件 class SkipHealthCheckRedirect: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): if request.path.startswith('/health'): response = self.get_response(request) return response # 其他请求正常执行HTTPS重定向 response = self.get_response(request) return response然后将该中间件添加到
settings.py的MIDDLEWARE列表中。调整目标组健康检查阈值
如果实例偶尔出现响应延迟,默认的健康检查间隔(10秒)或超时时间(5秒)可能过短。进入目标组设置,适当延长超时时间(比如改为10秒),调整健康/不健康阈值,避免单次延迟触发异常标记。验证实例内部服务状态
登录到EC2实例,执行curl localhost:80/health命令,确认本地请求是否返回200状态码。如果本地请求失败,说明实例内部服务(如Gunicorn、uWSGI)未正常启动,或端口配置错误,需排查服务启动日志。
内容的提问来源于stack exchange,提问作者Habib

