我正在遵循本教程,并将Celery-background相关代码调整为我的项目。
就我而言,我在Docker环境中运行,并且有一个受保护的站点(即https:// localhost)。这需要 安全的SSL 通信。
我调整了代码以确保安全连接。 我最初遇到连接问题,这产生了日志错误消息,但是我能够解决-
现在日志文件已经足够了,但是我认为我仍然有连接问题。结果,在运行时,触发任务时什么也没有发生。
在有担保的情况下没有联系的原因可能是什么? 如果按键不正确,是否应该收到消息?有没有办法从命令行测试从celery / web容器到redis容器的连接?
我能够通过更改容器的配置来解决此问题。 具体来说,我进行了以下更改:
在redis容器中:
在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容器上的文件:
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'