【问题标题】:Error 111 connecting to localhost:6379. Connection refused. Django Heroku连接到 localhost:6379 时出现错误 111。拒绝连接。 Django Heroku
【发布时间】:2024-01-12 18:37:01
【问题描述】:

我能够在本地运行 redis 并且一切正常。

但是,当我部署到 heroku 时,我收到此错误:

Error 111 connecting to localhost:6379. Connection refused. 

我已经用...设置了一个 Procfile

web: gunicorn odb.wsgi --log-file -
worker: python worker.py

我有一个 worker.py 文件...

import os
import urlparse
from redis import Redis
from rq import Worker, Queue, Connection

listen = ['high', 'default', 'low']

redis_url = os.getenv('REDISTOGO_URL')
if not redis_url:
    raise RuntimeError('Set up Redis To Go first.')

urlparse.uses_netloc.append('redis')
url = urlparse.urlparse(redis_url)
conn = Redis(host=url.hostname, port=url.port, db=0, password=url.password)

if __name__ == '__main__':
with Connection(conn):
    worker = Worker(map(Queue, listen))
    worker.work()

一个 REDISTOGO_URL 变量出现在 heroku 配置中。

Redis to go 是我的应用程序的已安装插件。

REDISTOGO_URL 是否必须在 settings.py 中定义?为什么在worker.py中甚至没有定义heroku时却试图连接到本地主机?

【问题讨论】:

  • 能不直接把redis_url传给Redis,不解析吗?很确定这行得通。
  • 我会再试一次。第一次好像没用。

标签: python django heroku


【解决方案1】:

可能与您的问题没有直接关系,但我遇到了同样的错误,结果发现我的系统上没有安装 redis-server 包。

问题已解决,

Ubuntu: sudo apt-get install redis-server

Cent 操作系统: sudo yum install redis

【讨论】:

  • 你是最棒的
【解决方案2】:

解决方案是sudo apt-get install redis-server。 不要忘记通过sudo service redis-server start 启动您的服务 并且可以使用命令sudo service redis-server {start|stop|restart|force-reload|status}作为参考

【讨论】:

    【解决方案3】:

    原来我需要设置这样的东西才能让它在 Heroku 上工作。

    redis_url = os.getenv('REDISTOGO_URL')
    
    urlparse.uses_netloc.append('redis')
    url = urlparse.urlparse(redis_url)
    conn = Redis(host=url.hostname, port=url.port, db=0, password=url.password)
    

    【讨论】:

      【解决方案4】:

      我也遇到了同样的错误

      • 可能您的环境中没有安装 radis 服务器

        sudo apt-get install redis-server

      • 我需要在 settings.py 中设置这样的东西

        redis_host = os.environ.get('REDIS_HOST', 'localhost')    
        # Channel layer definitions
        # http://channels.readthedocs.org/en/latest/deploying.html#setting-up-a-channel-backend
        CHANNEL_LAYERS = {
            "default": {
                # This example app uses the Redis channel layer implementation asgi_redis
                "BACKEND": "asgi_redis.RedisChannelLayer",
                "CONFIG": {
                    "hosts": [(redis_host, 6379)],
                },
                "ROUTING": "multichat.routing.channel_routing",
            },
        }
        
      • 之前

      • 之后

      【讨论】:

        【解决方案5】:

        如果有人在遇到 99 或 111 错误后尝试让 django_rq 工作,请尝试以下操作:

        RQ_QUEUES = {
        "default": {
            "HOST": "redis",
            "PORT": "6379",
            "URL": os.getenv("REDISTOGO_URL", "redis://redis:6379"),  # If you're
            "DB": 0,
            "DEFAULT_TIMEOUT": 480,
          }
        }
        

        这需要您在 docker-compose.yml 中像这样命名 redis 容器

        services:
          app:
            build:
              context: .
            ports:
              - "8000:8000"
            volumes:
              - ./app:/app
            command: >
              sh -c   "python manage.py makemigrations && 
                      python manage.py migrate && 
                      python manage.py runserver 0.0.0.0:8000"
            depends_on:
              - redis
          redis:
            image: redis:6-alpine
            ports:
              - "6379:6379"
        

        【讨论】:

          【解决方案6】:

          如果您使用的是 django_rq,这样的配置将适合您:

          RQ_QUEUES = {
              'default': {
                   'HOST': 'localhost',
                   'PORT': '6379',
                   'URL': os.getenv('REDISTOGO_URL', 'redis://localhost:6379'),  # If you're
                   'DB': 0,
                   'DEFAULT_TIMEOUT': 480,
               }
          }
          

          它将在您的本地环境和 Heroku 上运行!

          【讨论】:

            【解决方案7】:

            我也遇到了以下问题。

            Trying again in 2.00 seconds...
            
            [2019-06-10 07:25:48,432: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 111 connecting to localhost:6379. Connection refused..
            Trying again in 4.00 seconds...
            
            [2019-06-10 07:25:52,439: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 111 connecting to localhost:6379. Connection refused..
            Trying again in 6.00 seconds...
            
            [2019-06-10 07:25:58,447: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 111 connecting to localhost:6379. Connection refused..
            Trying again in 8.00 seconds...
            

            我意识到问题在于拒绝连接的 ufw。 因此,我允许使用以下命令在此端口进行连接。

            sudo ufw alloww 6379

            【讨论】:

              【解决方案8】:

              当调用/连接到 redis 的任何应用程序,它为指定连接而使用的环境变量未正确设置时,可能会发生这种情况 - REDISCLOUD_URLREDISTOGO_URL 等。这很容易是redis 在应用程序或 redis 重新启动并循环其连接 IP 和/或访问后启动。因此,在部署时,确保 redis 在下游应用程序之前启动

              确保 redis 已启动并运行,并且简单地重新启动应用程序可以解决问题,或者正如其他答案所表明的那样,以适当的方式刷新应用程序以重新刷新和重新使用环境变量。

              【讨论】:

                【解决方案9】:

                现在 Heroku 自动将环境变量 REDIS_URL 设置为 URL + 端口。

                在heroku 上使用redis 的一种便捷方式是使用连接池:

                settings.py

                import redis
                REDIS_DEFAULT_CONNECTION_POOL = redis.ConnectionPool.from_url(os.getenv('REDIS_URL', 'redis://localhost:6379/'))
                

                whererver.py

                from redis import Redis
                from myProject.settings import REDIS_DEFAULT_CONNECTION_POOL
                
                redis = Redis(connection_pool=REDIS_DEFAULT_CONNECTION_POOL)
                print(redis.keys())  # works
                

                【讨论】:

                  【解决方案10】:

                  对于我来说,我注意到端口号错误,所以我简单地修复了它。

                      app = Celery("tasks", broker="redis://localhost:6379")
                  

                  【讨论】:

                    【解决方案11】:

                    在我的情况下,我修复了这个问题

                    sudo yum install redis
                    sudo service redis start
                    
                    

                    【讨论】:

                      【解决方案12】:

                      我尝试了以下 redis LOCATION URL 并且成功了

                      # caches
                      CACHES = {
                          "default": {
                              "BACKEND": "django_redis.cache.RedisCache",
                              "LOCATION": "redis://redis:6379",
                              "OPTIONS": {
                                  "CLIENT_CLASS": "django_redis.client.DefaultClient"
                              },
                              "KEY_PREFIX": "example"
                          }
                      }
                      

                      【讨论】:

                        【解决方案13】:

                        当应用程序无法联系 Redis 时抛出错误 111。在Heroku Django Channels 教程之后我遇到了同样的问题。 settings.py 文件应为:

                        CHANNEL_LAYERS = {
                            "default": {
                                "BACKEND": "asgi_redis.RedisChannelLayer",
                                "CONFIG": {
                                    "hosts": [os.environ.get('REDISCLOUD_URL', 'redis://localhost:6379')],
                                },
                                "ROUTING": "chat.routing.channel_routing",
                            },
                        }
                        

                        REDISCLOUD_URL 而不是REDIS_URL

                        确保在 Heroku 服务器上安装了 Redis。

                        【讨论】: