我在学习瑞 2025-05-26 16:26 采纳率: 0%
浏览 42

celery如何连接带有用户名的redis?

请问celery如何连接带有用户名的redis?我使用以下进行连接时出错,实在无法找到原因,下面的redis可直接测试

from celery.schedules import crontab

REDIS_HOST = '47.116.67.21'
REDIS_PORT = '6379'
REDIS_USER = 'test'
REDIS_PASSWORD = 'test1234'  
  
BROKER_URL = f'redis://{REDIS_USER}:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0'
CELERY_RESULT_BACKEND = f'redis://{REDIS_USER}:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0'

CELERY_TIMEZONE = 'Asia/Shanghai'
print('BROKER_URL', BROKER_URL ,'\nCELERY_RESULT_BACKEND', 'CELERY_RESULT_BACKEND')
CELERYBEAT_SCHEDULE = {
'test_timed_task':{
'task': 'CeleryTest.task_test.tasks.timed_task_test',  
'schedule': crontab(minute='*/1') 
}
}

按照如上方式,使用celery -A CeleryTest.main beat --loglevel=debug 出现

LocalTime -> 2025-05-26 16:09:46

Configuration ->

. broker -> redis://test:**@47.116.67.21:6379/0

. loader -> celery.loaders.app.AppLoader

. scheduler -> celery.beat.PersistentScheduler

. db -> celerybeat-schedule

. logfile -> [stderr]@%DEBUG

. maxinterval -> 5.00 minutes (300s)

[2025-05-26 16:09:46,578: DEBUG/MainProcess] Setting default socket timeout to 30

[2025-05-26 16:09:46,580: INFO/MainProcess] beat: Starting...

[2025-05-26 16:09:46,714: DEBUG/MainProcess] Current schedule:

<ScheduleEntry: test_timed_task CeleryTest.task_test.tasks.timed_task_test() <crontab: */1 * * * * (m/h/d/dM/MY)>

[2025-05-26 16:09:46,714: DEBUG/MainProcess] beat: Ticking with max interval->5.00 minutes

[2025-05-26 16:09:46,808: ERROR/MainProcess] beat: Connection error: WRONGPASS invalid username-password pair or user is disabled.. Trying again in 2.0 seconds...

[2025-05-26 16:09:48,914: ERROR/MainProcess] beat: Connection error: WRONGPASS invalid username-password pair or user is disabled.. Trying again in 4.0 seconds...

pip 相关依赖如下

celery 5.1.2

Django 1.11.6

django-redis 4.11.0

redis 4.3.6
  • 写回答

4条回答 默认 最新

  • 一杯年华@编程空间 2025-05-26 17:09
    关注

    一杯年华@编程空间帮您解答,本答案结合 ChatGPT4.0和DeepSeek整理

    我曾经遇到过类似的问题,当时也是在使用 Celery 连接带用户名的 Redis 时碰到了认证失败的情况。从你提供的代码和报错信息来看,错误提示是“WRONGPASS invalid username - password pair or user is disabled”,这说明连接时的用户名或密码可能存在问题。下面我来分析一下可能的原因并给出解决方案。

    问题分析

    Redis 的连接认证方式可能因版本或配置不同而有所差异。在 Redis 6 及以上版本中,引入了用户系统,需要明确指定用户名;而早期版本可能不支持用户名,或者默认使用“default”用户。你使用的 Redis 客户端版本是 4.3.6,理论上是支持用户名的,但可能在连接 URL 的格式上存在问题。

    解决方案

    方案一:明确指定 Redis 用户名(适用于 Redis 6+)

    Redis 6 及以上版本支持多用户功能,连接 URL 中需要包含用户名。正确的 URL 格式应为:redis://<用户名>:<密码>@<主机>:<端口>/<数据库>。你已经在 URL 中包含了用户名和密码,但可能需要确认 Redis 服务端是否启用了用户认证,以及该用户是否存在且权限正确。

    代码修改如下:

    BROKER_URL = f'redis://{REDIS_USER}:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0'
    CELERY_RESULT_BACKEND = f'redis://{REDIS_USER}:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0'
    

    这里需要注意,如果 Redis 服务端没有创建“test”用户,或者该用户被禁用,仍然会认证失败。你可以通过 Redis 客户端连接到 Redis 服务端,使用AUTH <密码>命令尝试认证,或者使用USER LIST命令查看用户列表,确保用户存在且状态正常。

    方案二:使用默认用户(适用于 Redis 6 之前的版本或默认用户场景)

    如果你的 Redis 版本低于 6,或者没有创建新用户,默认使用“default”用户。此时,连接 URL 中可以不指定用户名,或者明确指定用户名为“default”。

    代码修改如下:

    # 方式一:不指定用户名(适用于默认用户)
    BROKER_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0'
    CELERY_RESULT_BACKEND = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0'
    
    # 方式二:明确指定默认用户
    BROKER_URL = f'redis://default:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0'
    CELERY_RESULT_BACKEND = f'redis://default:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0'
    

    如果 Redis 没有设置密码,连接 URL 可以简化为redis://<主机>:<端口>/<数据库>;如果设置了密码但未启用用户系统,只需在 URL 中包含密码即可,无需用户名。

    最优方案讲解

    最优方案是方案一,因为它更符合 Redis 6+ 的规范,能够充分利用 Redis 的用户权限系统,提高安全性。具体操作步骤如下:

    1. 确认 Redis 版本:通过 Redis 客户端连接到 Redis 服务端,执行INFO server命令,查看“redis_version”字段,确认版本是否在 6 及以上。
    2. 创建用户并授权(如果尚未创建):使用 Redis 客户端执行以下命令创建用户并设置密码:
      # 创建用户 test 并设置密码 test1234
      USER CREATE test test1234
      # 为用户授予访问数据库 0 的权限(根据实际情况调整)
      USER GRANT test ON *:0 read write
      
    3. 验证连接:使用修改后的代码启动 Celery,观察是否还会出现认证错误。如果仍有问题,可以进一步检查 Redis 日志,查看具体的认证失败原因。

    希望以上方案能够帮助你解决问题。如果还有其他疑问,请继续留言。请楼主采纳。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月26日