使用Hackney适配器为Tesla配置代理和禁用SSL报:nxdomain错误如何解决
问题原因
:nxdomain本质是DNS解析失败错误,该报错出现的核心原因是你的Tesla客户端配置未实际生效,客户端没有按预期走代理链路发起请求,而是直接在当前网络环境解析目标请求域名失败。具体配置错误点如下:
- Tesla v1.0及以上版本的适配器配置写法不支持你当前的写法,直接在模块内写
adapter Tesla.Adapter.Hackney, ...仅适配非常早期的Tesla版本,新版本要求适配器配置必须通过plug显式声明,或包裹在配置块内。 - Hackney适配器的入参格式错误:代理地址不需要携带
http://前缀,ssl配置要求传入列表而非元组,错误格式会导致配置解析失败,适配器自动回退到默认无代理配置发起请求。
解决方案
1. 调整模块配置写法
按Tesla和Hackney的规范修正代码:
defmodule MyModule do use Tesla # 显式声明Hackney适配器及合法参数 plug Tesla.Adapter.Hackney, proxy: {"proxy.example.com", 5555}, ssl: [verify: :verify_none] end
2. 验证依赖和代理可用性
- 确认
mix.exs中已经正确引入对应依赖:
defp deps do [ {:tesla, "~> 1.7"}, {:hackney, "~> 1.20"} ] end
- 本地执行以下curl命令验证代理本身可用:
curl -x http://proxy.example.com:5555 -k <你的目标请求地址>
如果curl也出现解析错误,说明代理本身不可用,需要先排查代理服务状态。
3. 可选:动态配置写法
如果需要避免硬编码配置,可采用运行时动态配置方案:
defmodule MyModule do use Tesla # 可按需添加其他中间件 plug Tesla.Middleware.Logger @adapter Application.compile_env(:my_app, __MODULE__, [])[:adapter] || Tesla.Adapter.Hackney @adapter_opts Application.compile_env(:my_app, __MODULE__, [])[:adapter_opts] || [] adapter @adapter, @adapter_opts end
后续在config.exs中维护对应配置即可。
内容的提问来源于stack exchange,提问作者Nightwolf
相关产品推荐
相关产品推荐

