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

PythonDjangoHeroku

Python Problem Overview


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?

Python Solutions


Solution 1 - Python

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

Solution 2 - Python

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

Solution 3 - Python

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)

Solution 4 - Python

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

Solution 5 - Python

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"

Solution 6 - Python

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!

Solution 7 - Python

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

Solution 8 - Python

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.

Solution 9 - Python

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

Solution 10 - Python

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

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

Solution 11 - Python

In my case I fixed this by

sudo yum install redis
sudo service redis start

Solution 12 - Python

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"
    }
}

Solution 13 - Python

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohn WallerView Question on Stackoverflow
Solution 1 - PythonshrishindeView Answer on Stackoverflow
Solution 2 - PythonDeft-pawNView Answer on Stackoverflow
Solution 3 - PythonJohn WallerView Answer on Stackoverflow
Solution 4 - PythonMr SinghView Answer on Stackoverflow
Solution 5 - PythonMaik RoView Answer on Stackoverflow
Solution 6 - PythonruhanbidartView Answer on Stackoverflow
Solution 7 - PythoncinchView Answer on Stackoverflow
Solution 8 - PythonWaveRiderView Answer on Stackoverflow
Solution 9 - PythonDavid SchumannView Answer on Stackoverflow
Solution 10 - PythonLaith BarghothiView Answer on Stackoverflow
Solution 11 - PythonNishaView Answer on Stackoverflow
Solution 12 - PythondecoderView Answer on Stackoverflow
Solution 13 - PythonJosh LairdView Answer on Stackoverflow