【问题标题】:'Redis with SSL' broker is not supported in Flower broker tabFlower 代理选项卡不支持“带 SSL 的 Redis”代理
【发布时间】:2020-01-12 07:24:53
【问题描述】:

我们正在使用 Flower 来监控 Celery 任务,并在我们的项目中使用 Redis 作为代理。

当我们使用 SSL 配置 Redis 作为代理时,在代理选项卡中我们可以看到下一条消息:

不支持'redis'代理

我们尝试(并成功)通过下一个 URL 从 Celery 连接到 Redis:

rediss://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_NAME}?{SSL_OPTIONS}

如 Celery 文档中所示。

此外,我们尝试了 --broker--broker_api 参数,结果相同。

工作人员和任务工作正常(在工作人员内部,代理正常显示)但代理选项卡为空。

如果我们查看 Celery 代码,我们会发现 Celery 如何管理 url 解析以设置 Redis 作为代理的 ssl 选项和配置:

        if scheme == 'redis':
            # If connparams or query string contain ssl params, raise error
            if (any(key in connparams for key in ssl_param_keys) or
                    any(key in query for key in ssl_param_keys)):
                raise ValueError(E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCH)

        if scheme == 'rediss':
            connparams['connection_class'] = redis.SSLConnection
            # The following parameters, if present in the URL, are encoded. We
            # must add the decoded values to connparams.
            for ssl_setting in ssl_param_keys:
                ssl_val = query.pop(ssl_setting, None)
                if ssl_val:
                    connparams[ssl_setting] = unquote(ssl_val)

如果我们查看 Flower 代码,我们可以发现 Flower 如何管理 url 解析以设置代理:

        class Broker(object):
            def __new__(cls, broker_url, *args, **kwargs):
                 scheme = urlparse(broker_url).scheme
                 if scheme == 'amqp':
                     return RabbitMQ(broker_url, *args, **kwargs)
                 elif scheme == 'redis':
                     return Redis(broker_url, *args, **kwargs)
                 elif scheme == 'redis+socket':
                     return RedisSocket(broker_url, *args, **kwargs)
                 else:
                     raise NotImplementedError

如我们所见,Flower 似乎不支持带 SSL 的 Redis(仅支持 redis,不支持 redis)。

这是真的吗?有什么方法可以在 Celery 和 Flower 中使用 redis 连接 Redis 或使用 SSL 连接 Redis 而不使用 redis?

谢谢!

【问题讨论】:

    标签: redis django-celery flower


    【解决方案1】:

    它适用于以下 URL 选项。
    证书的百分比编码或普通路径都可以工作。
    redis 和 redis 方案都有效。
    使用芹菜==4.4.7,花==0.9.5

    export SSL_CACERT_PATH="%2Fvar%2Fssl%2Fmyca.pem"
    export SSL_CLIENT_CERT_PATH="%2Fvar%2Fssl%2Fclient-cert.pem"
    export SSL_CLIENT_KEY_PATH="%2Fvar%2Fssl%2Fprivate%2Fworker-key.pem"
    OR 
    export SSL_CACERT_PATH=/var/ssl/myca.pem
    export SSL_CLIENT_CERT_PATH=/var/ssl/client-cert.pem
    export SSL_CLIENT_KEY_PATH=/var/ssl/private/worker-key.pem
    
    #Ensure no whitespaces if breaking lines
    export REDISS_BROKER_URL="rediss://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}?\
    ssl_cert_reqs=required\
    &ssl_ca_certs=${SSL_CACERT_PATH}\
    &ssl_certfile=${SSL_CLIENT_CERT_PATH}\
    &ssl_keyfile=${SSL_CLIENT_KEY_PATH}"
    
    flower -b $REDISS_BROKER_URL
    
    #Ensure no whitespaces if breaking lines
    export REDIS_BROKER_URL="redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}?\
    ssl_cert_reqs=required\
    &ssl_ca_certs=${SSL_CACERT_PATH}\
    &ssl_certfile=${SSL_CLIENT_CERT_PATH}\
    &ssl_keyfile=${SSL_CLIENT_KEY_PATH}"
    
    flower -b $REDIS_BROKER_URL
    [I 201023 07:20:09 command:140] Visit me at http://localhost:5555
    [I 201023 07:20:09 command:145] Broker: redis://:**@xxxx:xxxx//
    [I 201023 07:20:09 command:148] Registered tasks:
        ['celery.accumulate',
         'celery.backend_cleanup',
         'celery.chain',
         'celery.chord',
         'celery.chord_unlock',
         'celery.chunks',
         'celery.group',
         'celery.map',
         'celery.starmap']
    [I 201023 07:20:10 mixins:229] Connected to redis://:**@xxxx:xxxx//
    ^C^C
    

    【讨论】:

      猜你喜欢
      • 2022-06-23
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      相关资源
      最近更新 更多