You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用主机名可连接Redis,但使用URL连接失败

Redis URL连接报错"No route to host",主机名连接正常

我尝试将Celery连接到另一台机器上的Redis后端时,出现“No route to host”错误。排除Celery因素后,用Redis客户端通过主机名能正常连接,但用Redis URL连接时还是报同样的错误。

创建两个连接对象,表面上二者参数一致:

>>> import redis
>>>
>>> r = redis.Redis(host='server.domain.com',port=6379)
>>> r2 = redis.Redis.from_url('redis://server.domain.com:6379')
>>>
>>> r
Redis<ConnectionPool<Connection<host=server.domain.com,port=6379,db=0>>>
>>> r2
Redis<ConnectionPool<Connection<host=server.domain.com,port=6379,db=0>>>

用主机名创建的连接可以正常工作:

>>> r.get('test')
b'Test stuff'

但用URL创建的连接返回“No route to host”错误:

>>> r2.get('test')
Traceback (most recent call last):
  File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 264, in connect
    sock = self.retry.call_with_retry(
  File "/home/user/venv/lib/python3.10/site-packages/redis/retry.py", line 46, in call_with_retry
    return do()
  File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 265, in <lambda>
    lambda: self._connect(), lambda error: self.disconnect(error)
  File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 627, in _connect
    raise err
  File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 615, in _connect
    sock.connect(socket_address)
OSError: [Errno 113] No route to host

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/venv/lib/python3.10/site-packages/redis/commands/core.py", line 1829, in get
    return self.execute_command("GET", name)
  File "/home/user/venv/lib/python3.10/site-packages/redis/client.py", line 533, in execute_command
    conn = self.connection or pool.get_connection(command_name, **options)
  File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 1086, in get_connection
    connection.connect()
  File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 270, in connect
    raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 113 connecting to server.domain.com:6379. No route to host.

更新

深入排查Redis对象后发现,from_url方法创建connection_pool时缺少多个参数:

>>> r.connection_pool.__dict__
{'connection_class': <class 'redis.connection.Connection'>, 'connection_kwargs': {'db': 0, 'username': None, 'password': None, 'socket_timeout': None, 'encoding': 'utf-8', 'encoding_errors': 'strict', 'decode_responses': True, 'retry_on_error': [], 'retry': None, 'health_check_interval': 0, 'client_name': None, 'lib_name': 'redis-py', 'lib_version': '5.0.1', 'redis_connect_func': None, 'credential_provider': None, 'protocol': 2, 'host': 'server.domain.com', 'port': 6379, 'socket_connect_timeout': None, 'socket_keepalive': None, 'socket_keepalive_options': None}, 'max_connections': 2147483648, '_fork_lock': <unlocked _thread.lock object at 0x7fcfd576ebc0>, '_lock': <unlocked _thread.lock object at 0x7fcfd576d2c0>, '_created_connections': 1, '_available_connections': [Connection<host=server.domain.com,port=6379,db=0>], '_in_use_connections': set(), 'pid': 37317}
>>> r2.connection_pool.__dict__
{'connection_class': <class 'redis.connection.Connection'>, 'connection_kwargs': {'host': 'server.domain.com', 'port': 6379, 'db': 0}, 'max_connections': 2147483648, '_fork_lock': <unlocked _thread.lock object at 0x7fcfd5d6bb40>, '_lock': <unlocked _thread.lock object at 0x7fcfd5d6bbc0>, '_created_connections': 1, '_available_connections': [Connection<host=server.domain.com,port=6379,db=0>], '_in_use_connections': set(), 'pid': 37317}

调整URL后,独立Redis客户端可以正常连接,但Celery仍然报相同错误:

>>> r2 = redis.Redis.from_url('redis://:@server.domain.com:6379')
>>> r2.get('test')
b'Test stuff'

内容的提问来源于stack exchange,提问作者beef623

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:19:53