当前位置: 首页 > 面试题库 >

通过ssl从celery到redis连接后无响应

吴镜
2023-03-14
问题内容

我正在遵循本教程,并将Celery-background相关代码调整为我的项目。

就我而言,我在Docker环境中运行,并且有一个受保护的站点(即https:// localhost)。这需要
安全的SSL 通信

我调整了代码以确保安全连接。
我最初遇到连接问题,这产生了日志错误消息,但是我能够解决-

现在日志文件已经足够了,但是我认为我仍然有连接问题。结果,在运行时,触发任务时什么也没有发生。

在有担保的情况下没有联系的原因可能是什么?
如果按键不正确,是否应该收到消息?有没有办法从命令行测试从celery / web容器到redis容器的连接?


问题答案:

我能够通过更改容器的配置来解决此问题。
具体来说,我进行了以下更改:

在redis容器中:

  • 按照本教程添加通道,并为redis容器创建证书
  • 使用此 git代码在Docker容器中配置stunnel

在Celery容器中:
-提高了日志级别以进行 调试

我首先测试了可以通过ssl从本地主机连接到redisdocker容器。
然后,我测试可以通过ssl从celery容器连接到redis容器。docker-compose文件为:

version: '3'

services:
  web:
    restart: always
    build:
      context: ./web
      dockerfile: Dockerfile
    expose:
      - "8000"
    volumes:
      - /home/webServer/web:/home/flask/app/web
      - /home/webServer/redis/ssl:/etc/certs
      - data2:/home/flask/app/web/project/img
    command: /usr/local/bin/gunicorn -w 2 -t 3600 -b :8000 project:app
    depends_on:
      - postgres
    stdin_open: true
    tty: true

  nginx:
    restart: always
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /home/webServer/web:/home/flask/app/web
      - data2:/home/flask/app/web/project/img
    depends_on:
      - web

  postgres:
    restart: always
    build:
      context: ./postgresql
      dockerfile: Dockerfile
    volumes:
      - data1:/var/lib/postgresql/data
    expose:
      - "5432"

  redis:
    build:
      context: ./redis
      dockerfile: Dockerfile
    restart: always

    command: sh -c "stunnel /stunnel-redis-server.conf && /usr/local/bin/redis-server /etc/redis/redis.conf"
    expose:
      - '6380'
    ports:
     - "6380:6380"
    volumes:
      - /home/webServer/redis/ssl:/etc/certs
      - /home/webServer/redis/conf:/etc/redis

  celery:
    build:
      context: ./web
    command: watchmedo auto-restart --directory=./ --pattern=*.py --recursive -- celery worker -A project.celery  --loglevel=debug
    volumes:
      - /home/webServer/web:/home/flask/app/web
      - /home/webServer/redis/ssl:/etc/certs
      - data2:/home/flask/app/web/project/img
    depends_on:
      - redis

volumes:
  data1:
  data2:

其他相关文件是:

**redis docker容器上的文件:

  • Redis容器Dockerfile
  • redis / conf / redis.conf
  • redis / stunnel-redis-server.conf

celery docker容器上的设置:

cat web/project/flask_celery.py
...

key_file = '/etc/certs/localhost.key'
cert_file = '/etc/certs/private.pem'
ca_file = '/etc/certs/myCA.pem'
...

celery = Celery(app.import_name,
                backend=app.config['CELERY_RESULT_BACKEND'],
                broker=app.config['CELERY_BROKER_URL'],
                broker_use_ssl = {
                    'ssl_keyfile': key_file,
                    'ssl_certfile': cert_file,
                    'ssl_ca_certs': ca_file,
                    'ssl_cert_reqs': ssl.CERT_REQUIRED
                },
                redis_backend_use_ssl = {
                    'ssl_keyfile': key_file,
                    'ssl_certfile': cert_file,
                    'ssl_ca_certs': ca_file,
                    'ssl_cert_reqs': ssl.CERT_REQUIRED
                })

------------------

cat project/__init__.py
...
app.config['CELERY_BROKER_URL'] = 'rediss://webserver_redis_1:6380/0'
app.config['CELERY_RESULT_BACKEND'] = 'rediss://webserver_redis_1:6380/0'


 类似资料:
  • 我有两台机器:machine foo()运行redis服务器,而machine bar()运行通过Jedis连接到foo的java应用程序。当给jedis提供地址时,一切都很好。 但是我不信任foo和bar之间的路由器,redis也不支持SSL。因此,我设置了一个从bar到foo:的ssh隧道 现在,从bar中,我可以直接在或通过隧道在成功地telnet到foo上的redis。对于jedis,如果

  • 我在一个网站上工作,这是用来重置LDAP用户的密码。我无法通过SSL与服务器建立连接。我尝试了各种代码和身份验证类型。 这是服务器上用于与网站所在的LDAP连接的内容。我还用两个ssl端口测试了它。636和3269。 我在网站上使用以下代码 获取异常“LDAP服务器不可用”。我尝试了389端口和没有ssl的代码,它工作得很好。 请让我知道哪里出了问题。

  • 我目前在Airflow 1.10上使用芹菜执行器。我的经纪人是AWS Elasticache Redis(v.5.0.6)。如何在传输中启用加密? 根据Airflow源代码,需要、和。 https://github.com/apache/airflow/blob/1.10.10/airflow/config_templates/default_celery.py#L68-L72级 但是Elasti

  • 问题内容: 警告 :好的,这很奇怪,我不确定SO是否合适。 我有一个Azure网站连接到Azure Redis缓存实例。(使用StackExchange.Redis) 一切都很好,然后有一天-该网站无法连接到Redis。 错误: 无法连接到Redis服务器。要创建断开的多路复用器,请禁用AbortOnConnectFail。PING上的SocketFailure 这是我的连接字符串: mycach

  • 问题内容: 我目前将我的Redis缓存服务器托管在Azure上,并使用以下命令让SignalR将其作为骨干网… GlobalHost.DependencyResolver.UseRedis(“ Server”,port,“ password”,“ eventKey”); 可以在端口6379(非SSL)上找到此功能,但是当我尝试连接到Azure Redis服务器的SSL端口(6380)时,聊天应用程