Node.js升级至v18.7.0后Memcached连接异常,请求排查与解决
Node.js v18.7.0 下 Memcached 连接 ECONNREFUSED ::1:11211 的问题分析与解决
问题成因
- Node.js v17及以上版本调整了DNS解析优先级,默认将
localhost解析为IPv6地址::1,而旧版本默认优先返回IPv4地址。 - 本地Memcached服务默认仅监听IPv4的
127.0.0.1地址,未开启IPv6监听,导致尝试连接::1:11211时被拒绝。 - 即使初始连接使用
127.0.0.1,memcached包的内部逻辑可能在后续操作中重新解析主机名或沿用默认DNS规则,再次触发IPv6连接尝试。
解决方法
方法1:修改Memcached配置,开启IPv6监听
调整Memcached启动参数,使其同时监听IPv4和IPv6地址:
- Linux/macOS:修改Memcached配置文件(如
/etc/memcached.conf),将-l 127.0.0.1改为-l 127.0.0.1,::1,或直接设置-l 0.0.0.0(监听所有网络地址),随后重启Memcached服务。 - Windows:在Memcached启动命令中添加
-l 127.0.0.1,::1,示例:memcached.exe -l 127.0.0.1,::1。
方法2:强制Node.js使用IPv4优先解析
启动Node.js应用时添加--dns-result-order=ipv4first参数,强制DNS解析优先返回IPv4地址:
node --dns-result-order=ipv4first your-app.js
若使用PM2等进程管理工具,需在启动配置中加入该参数,示例PM2的ecosystem.config.js:
module.exports = { apps: [{ name: 'your-app', script: 'your-app.js', args: '--dns-result-order=ipv4first' }] };
方法3:配置memcached包强制使用IPv4
创建Memcached实例时,通过family选项指定使用IPv4协议:
const Memcached = require('memcached'); const memcached = new Memcached('127.0.0.1:11211', { family: 4 // 强制使用IPv4 });
该配置会让包始终以IPv4地址建立连接,避免触发IPv6解析逻辑。
内容的提问来源于stack exchange,提问作者Alexander Fedorov
相关产品推荐
相关产品推荐

