You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTTPoison请求Elasticsearch遇:econnrefused错误,curl却正常如何解决?

问题分析与解决办法

这情况我之前帮朋友排查过,结合你提到Elasticsearch是Docker部署的细节,主要有两种常见原因,对应不同的解决思路:

核心原因拆解

1. IEx运行环境和curl不在同一个网络空间

你用curl能通,说明宿主机的端口映射是正常的,但如果你的IEx是在另一个Docker容器里启动的,那容器内的localhost/127.0.0.1指向的是容器自己,不是宿主机——这就导致HTTPoison连的是容器内部的9200端口,自然会被拒绝。

2. Erlang/OTP的网络解析优先级问题

Erlang的底层网络模块inet默认可能优先用IPv6地址(比如::1),但你的ES容器可能只绑定了IPv4的宿主机端口。就算你手动写127.0.0.1,有些HTTPoison依赖的客户端(比如hackney)可能还是会走默认的解析逻辑,导致连接失败。

对应解决方法

针对容器内IEx的情况

  • 用宿主机局域网IP访问:找你宿主机的内网IP(比如192.168.1.100),替换掉localhost,比如:
    HTTPoison.get "http://192.168.1.100:9200"
    
  • 加入同一Docker网络:把你的Elixir容器和ES容器加到同一个自定义网络里,然后直接用ES容器的名称访问(比如你的ES叫es01):
    HTTPoison.get "http://es01:9200"
    
    这种方式不需要端口映射,容器间直接通信更稳定。

针对宿主机IEx的情况

  • 强制HTTPoison使用IPv4:调用时指定hackney的inet选项,强制走IPv4:
    HTTPoison.get("http://localhost:9200", [], hackney: [inet: :inet])
    
  • 全局配置默认用IPv4:在你的Elixir应用的config.exs里加一行配置,让hackney默认使用IPv4:
    config :hackney,
      inet: :inet
    
    这样后续所有HTTPoison请求都会默认走IPv4,不用每次加选项。

快速验证方法

先搞清楚IEx在哪跑:在IEx里执行:inet.getif(),看看输出的IP地址和你宿主机的IP是否一致——如果不一样,说明是容器环境的问题;如果一致,就用上面的IPv4强制方法试试。

内容的提问来源于stack exchange,提问作者Paul Rousseau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:34:26