Spring Boot部署Elastic Beanstalk根路径接口失效及健康检查异常问题
问题解答
1. 为什么Elastic Beanstalk控制台无法修改健康检查路径?
Elastic Beanstalk的配置优先级遵循 .ebextensions 配置文件 > 控制台手动配置的规则,如果你之前的部署包中包含了定义健康检查路径的 .ebextensions 配置,每次配置变更或重新部署后,控制台手动修改的内容都会被覆盖回配置文件中的设定。
另外如果你使用的是Amazon Linux 2 版本的Docker平台,负载均衡健康检查路径需要同时在「负载均衡」配置栏和「应用程序」配置栏的健康检查部分同步修改,仅修改其中一处会被系统自动回滚到默认值/。
2. 为什么根路径/接口本地运行正常,部署到Elastic Beanstalk后失效?
原因主要出在端口映射和反向代理规则上:
- 从你提供的Nginx日志可以看到,Elastic Beanstalk默认的反向代理规则会把请求转发到上游的8080端口,但你的Spring Boot应用实际运行在5000端口,Dockerfile仅声明暴露5000端口并未修改EB的默认转发规则,导致部分请求转发失败。
- 你其他接口可正常访问,大概率是请求匹配到了Nginx的其他路径转发规则,只有根路径
/的请求走了默认的8080转发规则,无法命中你的应用接口。 - 另外如果你的Spring Boot配置了
server.servlet.context-path全局路径前缀,或者Spring Security拦截了根路径请求,也会出现本地正常部署后404的问题。
解决办法
- 首先通过
.ebextensions配置文件固定健康检查配置和端口映射,避免控制台修改被回退,在项目根目录新建.ebextensions/alb.config文件,写入以下内容:
option_settings: # 指定负载均衡健康检查路径 aws:elbv2:targetgroup: HealthCheckPath: /actuator/health HealthCheckIntervalSeconds: 30 # 指定容器端口为应用实际运行的5000 aws:autoscaling:launchconfiguration: ContainerPort: 5000
- 如果你不想修改配置文件,也可以直接把Spring Boot应用的运行端口改为8080,和EB默认的转发端口对齐,同时检查是否有全局路径前缀配置,确保
/actuator/health路径可以直接访问。 - 如果需要保留根路径接口,检查对应Controller的注解配置,确保没有父级
@RequestMapping路径覆盖,也没有拦截器拦截根路径请求。
内容的提问来源于stack exchange,提问作者mcool
相关产品推荐
相关产品推荐

