Error 111 connecting to localhost:6379. Connection refused. Django Heroku

Question:

I am able to run redis locally and everything works.

However when I deploy to heroku I get this error:

Error 111 connecting to localhost:6379. Connection refused. 

I have set up a Procfile with…

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

I have a worker.py file…

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()

A REDISTOGO_URL variable appears in the heroku config.

Redis to go is an installed add-on for my app.

Does REDISTOGO_URL have to be defined in settings.py? Why is heroku trying to connect to the local host when it is not even defined in worker.py?

Asked By: John Waller

||

Answers:

Turns out I needed to set up things like this for it to work on 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)
Answered By: John Waller

If you are using django_rq, a configuration like this will work for you:

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

It will make that work on your local environment and also on Heroku!

Answered By: ruhanbidart

May be not directly related to your question but I was facing same error and it turn out that on my system redis-server package was not installed.

Problem was resolved with,

Ubuntu: sudo apt-get install redis-server

Cent OS: sudo yum install redis

Answered By: shrishinde

Error 111 is thrown when the application is unable to contact Redis. I had the same problem following the Heroku Django Channels tutorial. The settings.py file should read:

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

REDISCLOUD_URL instead of REDIS_URL.

Ensure Redis is installed on the Heroku server.

Answered By: Josh Laird

The solution is sudo apt-get install redis-server.
Don’t forget to start your service by sudo service redis-server start
and you can use the command sudo service redis-server {start|stop|restart|force-reload|status} for reference

Answered By: Deft-pawN

I was facing same the error

  • Maybe radis server was not installed in your environment

    sudo apt-get install redis-server

  • I needed to set up things like this in 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",
        },
    }
    
  • Before
    enter image description here

  • After
    enter image description here

Answered By: Mr Singh

I also landed here with the following problem.

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...

I realized the problem was the ufw which was denying the connections.
Therefore, I allowed connections at this port using the following command.

sudo ufw alloww 6379

Answered By: cinch

This could happen when whatever application that is calling/connecting to redis, the environment variable it consumed in order to specify a connection hasn’t been properly set – REDISCLOUD_URL or REDISTOGO_URL etc. This could most easily be that redis was started after the app or redis restarted and cycled its connection IP and/or access. So, upon deploying, insure redis is started prior to the downstream app(s)

Insure redis is up and running and a simple reboot on the app could fix the issue OR, as other answers have indicated, refresh the app in the appropriate manner to re-fresh & re-consume the environment variable.

Answered By: WaveRider

Right now Heroku automatically sets the environment variable REDIS_URL to URL + port.

A convenient way to work with redis on heroku is to use a connection pool:

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
Answered By: David Schumann

if anyone comes here trying to get django_rq to work after encountering either 99 or 111 errors try the following:

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

this requires you to name the redis container like this in your docker-compose.yml

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"
Answered By: Maik Ro

for me, I noticed that the port number was wrong, so I simply fixed it.

    app = Celery("tasks", broker="redis://localhost:6379")
Answered By: Laith Barghothi

In my case I fixed this by

sudo yum install redis
sudo service redis start

Answered By: Nisha

I tried the following redis LOCATION URL and it worked

# caches
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://redis:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient"
        },
        "KEY_PREFIX": "example"
    }
}
Answered By: decoder
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.