Heroku Redis插件升级后出现SSL版本号错误的连接问题求助
Heroku上Express.js应用Redis升级后SSL连接错误解决
我在Heroku托管的Express.js应用中,将Redis插件从5.X升级到7.0,同时把代码里的Redis模块升级到4.6.7版本。部署后出现以下错误:
Error accepting a client connection: error:1408F10B:SSL routines:ssl3_get_record:wrong version number
本地环境能正常运行,但未出现Redis连接错误日志。我已按照Heroku的连接指南配置Redis,代码如下:
import * as Redis from 'redis' import { REDIS_CONNECTION } from './../../constants'; const url = REDIS_CONNECTION; export const createRedisClient = () => { return Redis.createClient({ url, socket: { tls: true, rejectUnauthorized: false, }, }) };
问题原因
这个SSL版本错误源于Redis 7.0插件在Heroku上的连接逻辑变化,再加上redis@4.x的配置特性冲突:当你传入的REDIS_CONNECTION是rediss://开头的SSL协议URL时,手动设置socket.tls: true会触发双重SSL配置,导致协议版本不匹配的错误。
修复方案
- 确认连接URL格式:通过
heroku config:get REDIS_CONNECTION命令检查,确保Heroku提供的Redis连接字符串是rediss://开头(带SSL的协议)。 - 简化客户端配置:删除手动设置的
socket相关配置,因为rediss://协议会自动启用SSL,redis@4.x会自动处理Heroku Redis的证书验证,无需关闭rejectUnauthorized。
修改后的代码:
import * as Redis from 'redis' import { REDIS_CONNECTION } from './../../constants'; const url = REDIS_CONNECTION; export const createRedisClient = () => { return Redis.createClient({ url }); };
- 本地环境兼容:如果本地使用的是非SSL的Redis(默认
redis://开头),可以通过环境变量区分配置:
import * as Redis from 'redis' import { REDIS_CONNECTION } from './../../constants'; const url = REDIS_CONNECTION; export const createRedisClient = () => { const config = { url }; // 本地无SSL Redis时关闭tls if (url.startsWith('redis://')) { config.socket = { tls: false }; } return Redis.createClient(config); };
- 版本验证:执行
npm list redis确认redis模块确实是4.6.7版本,避免依赖不一致问题。
内容的提问来源于stack exchange,提问作者Ping Zhao
相关产品推荐
相关产品推荐

