EC2 Docker部署服务报urllib3 NewConnectionError连接超时
问题描述
- 后端项目本地环境全功能测试通过,打包为Docker容器部署在已绑定弹性公网IP的EC2实例上后,仅URL请求拉取模块无法正常工作,其余功能运行正常
- 已配置实例防火墙、安全组入站规则,仅放通自身公网IP的外部访问权限,本地环境发起目标URL请求可正常返回,部署到云环境后请求超时
- Docker容器日志报错信息:
Max retries exceeded with url: /features/2040000/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fc33a10d160>: Failed to establish a new connection: [Errno 110] Connection timed out'))
- 相关请求代码片段:
def test(custnum: str, status: int): URL = url_test URL = URL + str(custnum) + "/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0", "Accept-Encoding": "*", "Connection": "keep-alive" } try : response = requests.get(URL, headers=headers) if response.status_code == 200: res = json.loads(response.content.decode('utf-8'))
排查与修复方案
你目前仅配置了入站访问规则,EC2实例主动发起对外URL请求属于出站流量,和入站规则没有关联,按以下优先级逐一排查即可:
- 检查安全组出站规则
安全组入站规则仅控制外部资源访问EC2实例的流量,实例主动请求外部服务走的是出站方向。AWS默认安全组会放通所有出站流量,如果你之前手动修改过出站规则,先临时配置出站规则允许所有协议、所有目标地址访问,测试请求是否恢复,恢复后再按最小权限原则收紧出站规则即可。 - 检查操作系统层防火墙出站限制
如果你在EC2操作系统内启用了firewalld、ufw、iptables防火墙且配置了出站拦截策略,需要对应放通到目标URL地址、对应服务端口(HTTP默认80、HTTPS默认443)的出站流量。排查时可以直接在EC2宿主机上执行curl 你要请求的完整URL测试,如果宿主机直接返回连接超时,即可排除Docker和代码层面的问题,聚焦宿主机网络层限制。 - 确认目标服务的访问限制
本地能正常请求不代表EC2环境能通:你本地办公网的公网IP在目标服务的访问白名单内,但EC2绑定的弹性公网IP没有加入白名单,目标服务直接丢弃EC2发起的连接请求时,同样会返回连接超时错误。可以在本地给请求工具挂上EC2弹性公网IP对应的代理测试访问目标URL,如果也超时,联系目标服务管理员将EC2弹性公网IP加入访问白名单即可。 - 排查Docker网络配置问题
如果宿主机执行curl可以正常拿到目标接口响应,只有Docker容器内请求超时,优先排查Docker网络规则:
如果你用的是默认bridge网络模式,手动配置的防火墙规则大概率拦截了Docker网桥的FORWARD转发流量,临时启动容器时加上--network host参数使用主机网络模式测试,如果host模式下请求正常,调整防火墙FORWARD链规则放通docker0网桥的转发流量即可。 - 代码配置校验
确认代码中url_test变量配置的是公网可路由的完整服务地址,不要误填为本地回环地址、仅本地内网可访问的专属地址,这类地址在云端环境无法正常路由,也会触发连接超时。
内容的提问来源于stack exchange,提问作者Tae In Kim
相关产品推荐
相关产品推荐

