我在我的一个业余项目中使用 Heroku Redis 一段时间了。我目前用它做三件事
最近,我的heroku 使用量上升了,我不得不将其更改为使用heroku redis 高级计划。从那时起,我就以某种方式得到了
error: SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate in certificate chain)
。一切都保持不变,但错误开始突然出现。
heroku-redis 高级计划与基本的 heroku-redis 计划有根本不同吗?
我正在 Rails 上使用 ruby,如果有帮助的话,可以使用 Heroku Redis 部署在 Heroku 上。
根据 Heroku 的 docs
你需要
创建一个名为 config/initializers/redis.rb 的初始化文件 包含:
$redis = Redis.new(url: ENV["REDIS_URL"], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })
此外,如果您在尝试使用 sidekiq 时遇到此问题:
创建一个名为 config/initializers/sidekiq.rb 的初始化程序文件,其中包含:
Sidekiq.configure_server do |config|
config.redis = { ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
end
Sidekiq.configure_client do |config|
config.redis = { ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
end
实际上,当您在heroku应用程序上安装Heroku Redis时,它会为您创建2个配置变量:REDIS_TLS_URL和REDIS_URL。
文档实际上不正确,您必须将 SSL 设置为 verify_none,因为 TLS 会自动发生。
来自 Heroku 支持:
“我们的数据基础设施使用自签名证书,因此证书 可以定期循环...需要设置verify_mode 配置变量为 OpenSSL::SSL::VERIFY_NONE"
@ricks 的回答让我完成了 90% 的任务,但对于像我这样在 Heroku 的 Redis 中使用 Rails.cache 的人来说,你不需要那个初始化程序,只需要在 production.rb 中配置这一行:
config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
对于其他一些提出这个问题的用户,可能也有我今天遇到的同样的问题。错误消息与 Heroku 中的错误消息相同,但与 Hotwire 和
config/cable.yml
文件有关。当您将以下内容添加到该文件时,错误就会消失。
production:
adapter: redis
url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
channel_prefix: name_production
ssl_params:
verify_mode: <%= OpenSSL::SSL::VERIFY_NONE %>
REDIS_TLS_URL 将于 2024 年 12 月 2 日起弃用。 我通过在设置文件中添加参数来修复此问题:
# Celery settings
BROKER_URL = f"{os.environ.get('REDIS_URL')}?ssl_cert_reqs=none"
CELERY_RESULT_BACKEND = f"{os.environ.get('REDIS_URL')}?ssl_cert_reqs=none"
CELERY_TASK_SERIALIZER = "json"
CELERY_BROKER_TRANSPORT_OPTIONS = {
"ssl_cert_reqs": "CERT_NONE",
}
# Redis settings
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": f"{os.environ.get('REDIS_URL')}?ssl_cert_reqs=none",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"ssl_cert_reqs": "CERT_NONE"},
},
}
}
不要在 Heroku 配置变量中添加参数,因为它们会循环。那么参数就会丢失。