Béjean Développement

Installer et configurer RabbitMQ pour Magento 2

Objectif

Installer et configurer RabbitMQ pour Magento 2.

À quoi sert RabbitMQ ?

RabbitMQ est un logiciel d'agent de messages. Il fournit un mécanisme de communication asynchrone entre un expéditeur et un destinataire.

Installation

Il est possible de créer une instance RabbitMQ sous Docker très facilement, lien vers la page Docker.

Pour cet article, nous allons installer RabbitMQ au sein d'un conteneur LXC sous Debian Buster. RabbitMQ peut s'installer de plusieurs méthodes, lien vers la documentation officielle. Je vous laisse choisir votre préférence.

Une fois installé, je vous invite à vérifier le statut du service en lançant la commande : systemctl status rabbitmq-server.service

Si le service n'est pas actif, il faut exécuter la commande systemctl start rabbitmq-server.service.

Configuration de RabbitMQ

Pour configurer RabbitMQ, nous allons utiliser la commande : /usr/sbin/rabbitmqctl. Cette dernière va nous permettre de gérer les noeuds, le cluster, la réplication, les utilisateurs, les permissions, le monitoring, les virtual hosts, la configuration...

Gestion des utilisateurs

De base, RabbitMQ propose un utilisateur nommé guest avec le mot de passe guest. Cet utilisateur peut se connecter à l'outil depuis localhost uniquement.

Vous pouvez lister les utilisateurs en lançant cette commande : /usr/sbin/rabbitmqctl list_users, vous aurez le résultat suivant :

Listing users ...
user    tags
guest   [administrator]

Vous pouvez également afficher les permissions de cet utilisateur, en exécutant : /usr/sbin/rabbitmqctl list_user_permissions guest :

Listing permissions for user "guest" ...
vhost   configure   write   read
/   .*  .*  .*

On remarque que l'utilisateur guest possède un accès complet au virtual host : \. Sous RabbitMQ, un hôte virtuel est similaire à ceux que l'on retrouve dans Apache ou Nginx. Cependant, les virtual host ne sont pas définis dans des fichiers de configuration mais ils sont créés et supprimés depuis la commande /usr/sbin/rabbitmqctl, plus d'informations.

Pour créer notre utilisateur, nous allons lancer la commande /usr/sbin/rabbitmqctl add_user qui prend en paramètre l'utilisateur et son mot de passe :

/usr/sbin/rabbitmqctl add_user adminUser adminPassword

Le résultat de cette commande nous indique que l'utilisateur ne possède aucun droit dans un des hôtes virtuels. Pour ce faire, lancer la commande /usr/sbin/rabbitmqctl set_permissions -p / adminUser ".*" ".*" ".*". Désormais, adminUser possède les mêmes droits que guest.

Nous allons donc supprimer l'utilisateur guest en lançant cette commande : /usr/sbin/rabbitmqctl delete_user guest. Vous pouvez vérifier en lançant la commande : /usr/sbin/rabbitmqctl list_user_permissions guest. Le résultat doit être :

Listing permissions for user "guest" ...
Error:
{:no_such_user, "guest"}

Gestion des virtual hosts

Pour le moment, RabbitMQ ne possède qu'un seul hôte virtuel. Vous pouvez lister les hôtes virtuels en lançant cette commande : /usr/sbin/rabbitmqctl list_vhosts.

Pour nos besoins, nous allons en créer un nommé magento : /usr/sbin/rabbitmqctl add_vhost magento et nous allons créer un utilisateur nommé magentoUser qui aura un accès global à l'hôte virtuel précédemment créé :

/usr/sbin/rabbitmqctl add_user magentoUser magentoPassword
/usr/sbin/rabbitmqctl set_permissions -p magento magentoUser ".*" ".*" ".*"

Vérifier le résultat en lançant la commande : /usr/sbin/rabbitmqctl list_user_permissions magentoUser :

Listing permissions for user "magentoUser" ...
vhost   configure   write   read
magento .*  .*  .*

Pour aller plus loin, je vous invite à découvrir la documentation officielle.

Configuration de Magento 2

Pour connecter votre boutique Magento 2 à RabbitMQ, il faut ajouter un bloc de configuration au sein du fichier app/etc/env.php. Avant de réaliser un copier-coller, vérifier si votre tableau de configuration possède déjà une entrée queue, si oui, remplacer cette entrée par le bloc ci-dessous. Si non, vous pouvez l'ajouter :

'queue' => [
    'consumers_wait_for_messages' => 1,
    'amqp' => [
        'host' => 'rabbitmq',
        'port' => '5672',
        'user' => 'magentoUser',
        'password' => 'magentoPassword',
        'virtualhost' => 'magento'
    ]
]

Modifier les paramètres host, user, password et virtualhost en reprenant les données que vous avez renseignées. Concernant la valeur du paramètre port, j'ai gardé la valeur par défaut de RabbitMQ.

Si vous souhaitez plus d'informations sur la valeur du paramètre consumers_wait_for_messages, je vous conseille de lire la documentation Magento DevDocs.

Lancer la commande : bin/magento setup:upgrade pour appliquer les changements.

Résultat

Pour contrôler que la liaison est opérationnelle, je vous invite à lancer la commande suivante dans votre conteneur RabbitMQ : /usr/sbin/rabbitmqctl list_bindings --vhost magento. Le résultat de cette commande doit être :

Listing bindings for vhost magento...
source_name source_kind destination_name    destination_kind    routing_key arguments
    exchange    async.operations.all    queue   async.operations.all    []
magento exchange    async.operations.all    queue   async.# []

Vous pouvez également contrôler vos logs, si vous avez le message suivant Consumer "async.operations.all" skipped as required connection "amqp" is not configured. Unknown connection name amqp [] après avoir lancé la commande bin/magento setup:upgrade. Il faut contrôler la configuration du fichier app/etc/env.php.

Sources