You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置,导致协议版本不匹配的错误。

修复方案

  1. 确认连接URL格式:通过heroku config:get REDIS_CONNECTION命令检查,确保Heroku提供的Redis连接字符串是rediss://开头(带SSL的协议)。
  2. 简化客户端配置:删除手动设置的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 });
};
  1. 本地环境兼容:如果本地使用的是非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);
};
  1. 版本验证:执行npm list redis确认redis模块确实是4.6.7版本,避免依赖不一致问题。

内容的提问来源于stack exchange,提问作者Ping Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:07:06