我可以在本地运行redis,一切正常。
然而,当我部署到heroku时,我收到此错误:
Error 111 connecting to localhost:6379. Connection refused.
我已经设置了一个带有...
的Procfileweb: 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中甚至没有定义时尝试连接到本地主机?
答案 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",
},
}
答案 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_URL
或REDISTOGO_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时发生此错误,请尝试执行以下操作,这可能会有所帮助:
尝试再次运行容器
答案 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"
}
}