通过 ssl 从 celery 连接到 redis 后没有响应
No response after connecting from celery to redis via ssl
我正在学习 this 教程,并将与 Celery 背景相关的代码调整到我的项目中。
就我而言,我在 Docker 环境中操作,并且我有一个安全站点(即 https://localhost)。
这需要 安全 ssl 通信。
我调整了安全连接的代码。
我遇到了初始连接问题,这会产生日志错误消息,但我能够解决 - 请参阅 .
现在日志文件已经很多了,但我认为我仍然有连接问题。结果,在运行时,当触发任务时,没有任何反应。
安全案例中没有连接的原因可能是什么?
如果密钥不正确,我应该收到一条消息吗?
有没有办法从命令行测试从 celery/web 容器到 redis 容器的连接?
我能够通过更改容器的配置来解决问题。
具体来说,我做了以下修改:
在redis容器中:
在芹菜容器中:
- 将日志级别提升到 debug
我首先测试了我可以通过 ssl 从本地主机连接到 redis docker 容器。这是描述
然后,我测试了我可以通过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:
其他相关文件是:
redisdocker容器上的文件:(这些文件中的设置说明)
- redis 容器Docker文件
- redis/conf/redis.conf
- redis/stunnel-redis-server.conf
芹菜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'
我正在学习 this 教程,并将与 Celery 背景相关的代码调整到我的项目中。
就我而言,我在 Docker 环境中操作,并且我有一个安全站点(即 https://localhost)。 这需要 安全 ssl 通信。
我调整了安全连接的代码。
我遇到了初始连接问题,这会产生日志错误消息,但我能够解决 - 请参阅
现在日志文件已经很多了,但我认为我仍然有连接问题。结果,在运行时,当触发任务时,没有任何反应。
安全案例中没有连接的原因可能是什么?
如果密钥不正确,我应该收到一条消息吗?
有没有办法从命令行测试从 celery/web 容器到 redis 容器的连接?
我能够通过更改容器的配置来解决问题。
具体来说,我做了以下修改:
在redis容器中:
在芹菜容器中:
- 将日志级别提升到 debug
我首先测试了我可以通过 ssl 从本地主机连接到 redis docker 容器。这是描述
然后,我测试了我可以通过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:
其他相关文件是:
redisdocker容器上的文件:(这些文件中的设置说明
- redis 容器Docker文件
- redis/conf/redis.conf
- redis/stunnel-redis-server.conf
芹菜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'