Heroku Redis 从 Hobby 升级到 Premium 0 后 Heroku 崩溃
Heroku crashes after Heroku Redis upgrade from Hobby to Premium 0
问题
当我从 Heroku Redis Hobby 计划升级到 Heroku Redis Premium 0 计划时,Heroku 不断崩溃并出现 H10 错误。
原因
Redis 6 需要 TLS 连接。但是,Heroku 管理从路由器级别到涉及自签名证书的应用程序级别的请求。事实证明,Heroku 在路由器级别终止 SSL,请求通过 HTTP 从那里转发到应用程序,而一切都在 Heroku 的防火墙和安全措施之后。
有助于查明原因的链接:
https://ogirginc.github.io/en/heroku-redis-ssl-error
解决方案
自定义传递到 Redis 的选项,以便 tls.rejectUnauthorized 设置为 false。
const Queue = require('bull');
const redisUrlParse = require('redis-url-parse');
const REDIS_URL = process.env.REDIS_URL || 'redis://127.0.0.1:6379';
const redisUrlParsed = redisUrlParse(REDIS_URL);
const { host, port, password } = redisUrlParsed;
const bullOptions = REDIS_URL.includes('rediss://')
? {
redis: {
port: Number(port),
host,
password,
tls: {
rejectUnauthorized: false,
},
},
}
: REDIS_URL;
const workQueue = new Queue('work', bullOptions);
问题
当我从 Heroku Redis Hobby 计划升级到 Heroku Redis Premium 0 计划时,Heroku 不断崩溃并出现 H10 错误。
原因
Redis 6 需要 TLS 连接。但是,Heroku 管理从路由器级别到涉及自签名证书的应用程序级别的请求。事实证明,Heroku 在路由器级别终止 SSL,请求通过 HTTP 从那里转发到应用程序,而一切都在 Heroku 的防火墙和安全措施之后。
有助于查明原因的链接:
https://ogirginc.github.io/en/heroku-redis-ssl-error
解决方案
自定义传递到 Redis 的选项,以便 tls.rejectUnauthorized 设置为 false。
const Queue = require('bull');
const redisUrlParse = require('redis-url-parse');
const REDIS_URL = process.env.REDIS_URL || 'redis://127.0.0.1:6379';
const redisUrlParsed = redisUrlParse(REDIS_URL);
const { host, port, password } = redisUrlParsed;
const bullOptions = REDIS_URL.includes('rediss://')
? {
redis: {
port: Number(port),
host,
password,
tls: {
rejectUnauthorized: false,
},
},
}
: REDIS_URL;
const workQueue = new Queue('work', bullOptions);