Faraday配置代理触发ConnectionFailed: end of file reached报错
问题根源
报错Faraday::ConnectionFailed: end of file reached是默认net_http适配器的HTTPS代理TLS配置逻辑缺陷导致:
你使用的VGS代理为HTTPS协议(监听8443端口),net_http适配器默认仅会将你配置的CA证书用于和目标业务站点的TLS连接校验,不会将该CA证书用于和代理服务本身的TLS握手校验。由于VGS沙箱环境代理使用自有CA签发的证书,和代理握手时证书校验不通过,连接被直接重置触发EOF错误。
而Curl::Easy底层依赖libcurl,会自动将配置的CA证书同时应用于代理连接和目标站点连接的TLS校验,因此相同参数下可以正常请求。
修复方法
二选一即可:
- 方法1:保留net_http适配器,补全代理TLS校验配置
修改Faraday初始化的ssl配置段,显式指定代理连接使用的CA证书路径:options = { headers: { 'Content-Type' => 'application/json' }, ssl: { ca_file: ssl_cert_path, # 新增以下配置,为代理连接指定CA证书 proxy_ca_file: ssl_cert_path, verify: true }, proxy: VGS.proxy_uri, } - 方法2:更换底层为libcurl的Faraday适配器,和Curl行为保持一致
先在Gemfile中添加对应适配器依赖:
安装依赖后将Faraday默认适配器替换为对应值即可,无需额外调整代理SSL配置:# 二选一即可 gem 'faraday-patron' # gem 'faraday-typhoeus'Faraday.default_adapter = :patron # 若使用typhoeus则配置为 :typhoeus
验证
修改完成后重新执行rake vgs:faraday任务,即可正常提交数据并拿到响应,不会再触发EOF报错。
内容的提问来源于stack exchange,提问作者Ziyan Junaideen
相关产品推荐
相关产品推荐

