Node.js服务无法连接Redis 求助排查故障原因
问题描述
服务器部署在客户现场,Node.js服务无法连接Redis,但Redis状态显示运行正常:
Active: active (running) since Wed 2023-02-15 14:16:34 EAT; 18h ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 3085148 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 19104) Memory: 8.2M CGroup: /system.slice/redis-server.service
可从某台服务器手动指定主机和端口连接Redis,但Node.js服务尝试连接时失败,错误信息如下:
[ioredis] Unhandled error event: Error: connect ETIMEDOUT 16|pdsl_pa | at Socket.<anonymous> (/var/www/stage_env/pdsl_parking_service/node_modules/ioredis/built/redis/index.js:318:37) 16|pdsl_pa | at Object.onceWrapper (node:events:645:28) 16|pdsl_pa | at Socket.emit (node:events:526:28) 16|pdsl_pa | at Socket.emit (node:domain:475:12) 16|pdsl_pa | at Socket._onTimeout (node:net:501:8) 16|pdsl_pa | at listOnTimeout (node:internal/timers:559:17) 16|pdsl_pa | at processTimers (node:internal/timers:502:7) 16|pdsl_pa | [ioredis] Unhandled error event: Error: connect EHOSTUNREACH 172.**.***.***:6379 16|pdsl_pa | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16) 16|pdsl_pa | [ioredis] Unhandled error event: Error: connect EHOSTUNREACH 172.**.***.***:6379 16|pdsl_pa | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16) 16|pdsl_pa | [ioredis] Unhandled error event: Error: connect EHOSTUNREACH 172.**.***.***:6379
可能的故障原因分析
- Redis绑定地址限制:检查Redis配置文件(通常为
redis.conf)中的bind参数,如果仅绑定127.0.0.1,则仅本地可访问。即使测试服务器能连接,也可能该服务器是Redis所在机器,或Redis仅允许该机器IP访问,而Node.js服务所在机器不在允许范围内。 - 网络路由/子网隔离:Node.js服务所在服务器与Redis服务器可能处于不同子网、VLAN,或路由表缺失指向Redis服务器的正确路径,导致出现
EHOSTUNREACH(主机不可达)错误。 - 防火墙规则差异:客户现场防火墙可能允许测试服务器访问Redis的6379端口,但拦截了Node.js服务所在服务器的请求。检查Redis服务器上的
iptables/ufw规则,以及两台服务器之间的中间防火墙,确认是否放行6379端口的TCP流量。 - Node.js配置错误:核对Node.js代码中的Redis连接参数——IP地址是否写错、端口是否匹配,是否遗漏Redis密码、SSL配置(若Redis开启了认证或SSL但Node.js未对应配置)。同时检查部署环境变量是否覆盖了正确的连接配置。
- Redis连接数耗尽:虽然Redis状态正常,但如果达到
maxclients参数设置的最大连接数,新连接会被拒绝。执行redis-cli info clients查看当前连接数与上限值,确认是否达到阈值。 - DNS解析异常:若Node.js服务通过域名连接Redis,可能存在DNS解析失败问题。尝试直接用IP地址连接测试,或在Node.js服务器上执行
ping/nslookup验证域名解析结果。 - 安全模块拦截:Node.js服务的运行用户可能被SELinux、AppArmor等安全模块限制网络访问。检查相关安全模块的日志,确认是否存在拦截行为。
内容的提问来源于stack exchange,提问作者Abhishek Matta
相关产品推荐
相关产品推荐

