AWS EC2中Docker部署Spring Boot+React应用时实例冻结问题
排查步骤与解决方案
1. 优先排查资源耗尽问题
- 查看EC2实例实时资源状态:通过AWS CloudWatch监控CPU、内存、磁盘IO、网络带宽的使用率,重点关注触发请求时是否出现资源突增(比如内存占满、CPU拉满);也可在实例上执行
top或htop命令,实时观察进程资源占用情况。 - 检查Spring Boot应用日志:获取后端容器日志(
docker logs <backend-container-id>),查看请求处理阶段是否存在死锁、无限循环、内存溢出(OOM)或阻塞类报错;若日志量过大,建议将容器日志目录挂载到宿主机,方便事后分析。
2. 验证SSL配置正确性
- 测试SSL连接有效性:在EC2实例上执行
openssl s_client -connect <你的EC2公网IP>:<SSL端口>,检查是否能正常完成握手,是否出现证书链不完整、密钥不匹配等错误。 - 核对Spring Boot SSL参数:确认
application.properties或application.yml中的配置项准确无误:
若通过挂载方式引入证书,需确保挂载路径正确,且证书文件权限设置为容器用户可读(比如server.ssl.key-store=classpath:keystore.p12 server.ssl.key-store-password=你的证书密码 server.ssl.key-alias=证书别名 server.ssl.key-store-type=PKCS12chmod 644 /path/to/your/cert)。 - 若使用Nginx反向代理:执行
nginx -t验证配置语法是否正确,同时确认Nginx是否能正常转发请求到后端容器,无连接阻塞情况。
3. 确认Docker构建与运行合理性
mvn clean package生成jar的方式是正确的,但需确认生成的是可执行fat jar:可在EC2本地直接运行java -jar <你的jar文件>,测试是否能正常启动并处理请求,以此排除Docker环境本身的问题。- 优化后端Dockerfile:
- 确保使用兼容Java 17的基础镜像(比如
openjdk:17-jdk-slim); - 添加JVM内存参数限制,避免过度占用实例资源,例如在启动命令中加入
-Xmx512m -Xms256m(参数值可根据EC2实例内存大小调整)。
- 确保使用兼容Java 17的基础镜像(比如
- 配置docker-compose资源上限:在
docker-compose.yml中给容器设置合理的资源限制,示例:services: backend: deploy: resources: limits: memory: 768M cpus: '0.5'
4. 排查网络与请求阻塞问题
- 检查EC2安全组配置:确认已开放SSL端口(通常为443)以及容器间通信所需端口,无防火墙拦截请求。
- 测试容器间通信:在前端容器内执行
curl <backend-service-name>:<backend-port>,确认前端能正常访问后端服务,排除DNS解析或网络转发故障。 - 核对线程池与数据库连接池配置:检查
application.yml中Tomcat线程池(server.tomcat.max-threads)和数据库连接池的参数是否合理,避免请求堆积导致线程耗尽,最终引发应用无响应。
内容的提问来源于stack exchange,提问作者Nithin_Kamineni
相关产品推荐
相关产品推荐

