错误111连接到localhost:6379。拒绝连接。 Django Heroku

时间:2016-03-18 15:34:00

标签: python django heroku

我可以在本地运行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()

redokuOGO_URL变量出现在heroku配置中。

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

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

14 个答案:

答案 0 :(得分:45)

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

问题已解决,

Ubuntu: sudo apt-get install redis-server

Cent OS: sudo yum install redis

答案 1 :(得分:6)

解决方案是sudo apt-get install redis-server。 别忘了sudo service redis-server start忘记开始服务 您可以使用命令sudo service redis-server {start|stop|restart|force-reload|status}作为参考

答案 2 :(得分:2)

原来我需要设置这样的东西才能在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)

答案 3 :(得分:2)

我面临同样的错误

  • 您的环境中可能未安装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",
        },
    }
    
  • enter image description here

  • enter image description here

答案 4 :(得分:1)

如果您使用的是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上工作!

答案 5 :(得分:1)

如果有人遇到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 :(得分:0)

当应用程序无法联系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

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

答案 7 :(得分:0)

我也遇到以下问题。

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 :(得分:0)

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

确保Redis已启动并正在运行,并且在应用程序上进行简单的重新引导即可解决该问题,或者如其他答案所示,以适当的方式刷新应用程序以刷新并重新使用环境变量。

答案 9 :(得分:0)

现在,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 :(得分:0)

对我来说,我注意到端口号是错误的,因此我只是对其进行了修复。

 DATABASES = {
        'default': {
            'ENGINE': 'djongo',
            'NAME': 'your-db-name',
            'ENFORCE_SCHEMA': False,
            'CLIENT': {
                'host': 'host-name or ip address',
                'port': port_number,
                'username': 'db-username',
                'password': 'password',
                'authSource': 'db-name',
                'authMechanism': 'SCRAM-SHA-1'
            },

         .......
}

答案 11 :(得分:0)

不确定是否在所有情况下均有效。如果在docker中使用Redis时发生此错误,请尝试执行以下操作,这可能会有所帮助:

  • sudo apt-get升级
  • 然后重新启动Ubuntu。

尝试再次运行容器

答案 12 :(得分:0)

就我而言,我通过

解决了这个问题
sudo yum install redis
sudo service redis start

答案 13 :(得分:0)

我尝试了以下 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"
    }
}