【问题标题】:Can't connect to redis using django-redis无法使用 django-redis 连接到 redis
【发布时间】:2015-02-06 11:19:28
【问题描述】:

我有一个 django 项目,使用 django-redis 3.8.0 连接到 redis 的 aws 实例。但是,我在尝试连接时收到ConnectionError: Error 111 connecting to None:6379. Connection refused.。如果我 ssh 进入我的 ec2 并从 shell 使用 redis-py,我就可以从缓存中读取和写入,所以我不认为这是一个安全策略问题。

【问题讨论】:

  • 你能发布你的 django 设置文件(你设置了REDIS_HOST)吗?
  • 我唯一的redis特定设置是:CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "myawsredislocation:6379", 'KEY_PREFIX': 'projectname', "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }
  • 您是在您的 ec2 实例上运行 redis,还是使用他们的(AWS 的)弹性缓存 redis?
  • 你说如果你 ssh 进入你的 ec2 实例(我假设这也是运行 redis 的实例)你可以连接到 redis ......这意味着一个本地主机连接而不是甚至触及任何 AWS 防火墙安全组。 django 是从哪里跑的?
  • Redis 正在使用 AWS 的弹性缓存运行。

标签: python django amazon-web-services redis django-redis


【解决方案1】:

如果您正在运行弹性缓存 redis,则无法从 AWS 外部访问它 - 这就是您收到错误的原因。

来自 AWS 常见问题:

请注意,目前不支持基于 IP 范围的访问控制 为缓存集群启用。 缓存集群的所有客户端都必须是 在 EC2 网络中,并通过安全组授权为 如上所述。

http://aws.amazon.com/elasticache/faqs/

【讨论】:

  • 我不是从 AWS 外部访问它,而是从一个 ec2 实例访问它。而且我可以使用 redis-py 库从所述实例访问缓存,因此我可以验证安全组是否已正确设置。
【解决方案2】:

好的,想通了。我需要做的是在我的位置前加上redis://。这特定于 django-redis 库以及它如何解析位置 url。这就解释了为什么当我使用 python redis 库手动设置 StrictRedis 连接时,我能够连接。

【讨论】:

  • 对于其他有此问题且拥有非 AWS Redis 服务器的用户,我发现在 LOCATION 键中添加“redis://”前缀是不够的。我还必须将服务器的 IP 地址添加到 /etc/redis/redis.conf 中的“绑定”指令中。该文件说 Redis 默认侦听所有端口,但我没有发现这种情况。事实上,我可以删除“redis”协议前缀,只要我将 redis 绑定到服务器的 IP,它仍然可以工作。
猜你喜欢
  • 2019-01-08
  • 2021-02-15
  • 2016-10-18
  • 1970-01-01
  • 2018-07-12
  • 2022-01-26
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多