Sellerie ist ein Framework für die Verarbeitung von Python-Aufgaben in einer Warteschlange. Ich kann Redis als Broker von Sellerie verwenden, aber als ich den "Azure Redis Cache" von Azure verwendete, war ich süchtig nach dem Teil, der SSL verwendet, daher werde ich die Verwendung hier belassen.
Unter der Annahme, dass es in Flask, einer Webanwendung, verwendet wird, denke ich, dass es in anderen Umgebungen dasselbe ist.
Laut Was ist neu in Celery 4.0 (latenter Aufruf) kann Celery ab Version 4.0 eine SSL-Verbindung mit Redis verwenden. Das ist.
Es wird gesagt, dass es durch Setzen von broker_use_ssl verwendet werden kann, aber im Fall von Redis diese Informationen Es funktioniert nicht, auch wenn ich es durch Schlucken eingestellt habe.
Error while reading from socket: (104, 'Connection reset by peer')
Sie werden von dem Fehler geplagt. Dieser Fehler ist darauf zurückzuführen, dass Redis 'redis.connection.Connection' anstelle von 'redis.connection.SSLConnection' verwendet wird, um eine Verbindung zu Redis in Celery herzustellen.
Redis SSL-Unterstützung korrigieren Wenn Sie diese Pull-Anforderung nicht als Referenz festlegen, können Sie SSL nicht verwenden.
from celery import Celery
from redis.connection import SSLConnection
from .config import broker_use_ssl
def make_celery(app):
celery = Celery(app.import_name, backend=app.config['CELERY_BACKEND'],
broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
celery.conf.update(broker_use_ssl=broker_use_ssl)
# URL: https://github.com/celery/kombu/pull/634
if celery.conf.broker_use_ssl:
celery.backend.connparams.update(celery.conf.broker_use_ssl) # <-Hier
celery.backend.connparams['connection_class'] = SSLConnection # <-Hier
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
Die vom Argument "make_celery" übergebene "App" ist der Flask-Anwendungskontext. Nach dem Setzen von "Broker_use_ssl" müssen Sie "celery.backend.connparams ['connection_class'] = SSLConnection" setzen.
Außerdem heißt es in der Dokumentation, dass "Broker_use_ssl" auf "True" oder ein Wörterbuch gesetzt werden kann, aber die Einstellung "True" funktioniert nicht. ** Sie müssen das Wörterbuch einstellen. Im Gegensatz zu Ruby wird das Wörterbuch als "Falsch" beurteilt, wenn es leer ist
broker_use_ssl = {'ssl_cert_reqs': ssl.CERT_NONE}
Ich denke, es ist eine gute Idee, es zu behalten.
Legen Sie in Sellerie ein Passwort fest
CELERY_BROKER_URL = "redis://:password@hostname:port/db_number"
Muss im Format eingestellt sein. Ich habe mein Wissen über HTTP verschwendet, damit? Kann ich das Passwort in die URI aufnehmen? Ich dachte, aber als ich mir die interne Implementierung ansah, wurde die URI intern ordnungsgemäß analysiert.
Die interne Implementierung von Sellerie war unerwartet kompliziert und schwer zu lesen. Die Azure-Dokumentation enthält außerdem Verwenden des Azure Redis-Cache mit Python.
Standardmäßig sind Nicht-SSL-Ports für neue Azure Redis Cache-Instanzen deaktiviert, da einige Redis-Clients SSL nicht unterstützen. Zum Zeitpunkt dieses Schreibens unterstützt der Redispy-Client SSL nicht.
In Bezug auf das Festschreibungsprotokoll unterstützt redis-py
jedoch SSL ab 2014. Ich möchte, dass Sie die alte Beschreibung aktualisieren. Es ist ziemlich verwirrend.
Recommended Posts