Installer et configurer RabbitMQ pour Magento 2
Objectif
Installer et configurer RabbitMQ pour Magento 2.4.6-p1. Ce dernier nécessite la version 3.9 ou 3.11 de RabbitMQ. Pour ma part, j'ai installé la version 3.9.13.
À 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'une machone virtuelle sous Ubuntu 22.04 LTS. RabbitMQ peut s'installer de plusieurs méthodes, lien vers la documentation officielle. La documentation de l'éditeur est bien rédigée. En bas de l'article, vous retrouverez le playbook Ansible que j'ai développé et utilisé pour l'installation de RabbitMQ.
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 : sudo rabbitmqctl
. Cette dernière va nous permettre de gérer les nœuds, le cluster, la réplication, les utilisateurs, les permissions, le monitoring, les virtual hosts
, la configuration...
Activation du plugin de gestion
Si vous souhaitez activer l'interface de gestion de RabbitMQ, il faut lancer la commande suivante : sudo rabbitmq-plugins enable rabbitmq_management
. Vous pouvez accéder à l'interface de gestion depuis l'URL suivante : http://<ip-de-votre-serveur>:15672/
. Les identifiants par défaut sont : guest
et guest
. Ces derniers sont utilisables uniquement lors d'une connexion depuis localhost
. Nous allons donc créer un nouvel utilisateur dans la suite de cet article.
Gestion des utilisateurs
Comme indiqué précédemment, RabbitMQ propose de base 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 : sudo rabbitmqctl list_users
, vous aurez le résultat suivant :
Listing users ...
user tags
guest [administrator]
Vous pouvez également afficher les permissions de l'utilisateur guest
, en exécutant : sudo 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. 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 sudo rabbitmqctl
, plus d'informations.
Pour créer notre utilisateur, nous allons lancer la commande sudo rabbitmqctl add_user
qui prend en paramètre l'utilisateur et son mot de passe :
sudo 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 sudo rabbitmqctl set_permissions -p / adminUser ".*" ".*" ".*"
. Désormais, adminUser
possède les mêmes droits que guest
.
Pour terminer la création du nouvel adminsitrateur, il faut ajouter le tag administrator
:
sudo rabbitmqctl set_user_tags adminUser administrator
Par mesure de sécurité, nous allons supprimer l'utilisateur guest
en lançant cette commande : sudo rabbitmqctl delete_user guest
. Vous pouvez vérifier en lançant la commande : sudo 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 : sudo rabbitmqctl list_vhosts
.
Pour nos besoins, nous allons en créer un nommé magento
: sudo 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éé :
sudo rabbitmqctl add_user magentoUser magentoPassword
sudo rabbitmqctl set_permissions -p magento magentoUser ".*" ".*" ".*"
Vérifier le résultat en lançant la commande : sudo 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. Sinon, 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 : sudo 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
.
Playbook Ansible
Pour automatiser l'installation de RabbitMQ, je vous propose un playbook Ansible très simple permettant d'installer la version 3.9.13 de RabbitMQ pour Ubuntu 22.04 LTS. Ce playbook est disponible sur le dépôt GitLab de Froggit, lien vers le dépôt Froggit du playbook.
Le playbook est composé d'un seul fichier nommé 00_base.yaml
où vous pourrez modifier la machine cible.
- name: "Install Rabbit MQ"
hosts:
- rabbitmq-39-1
tasks:
- name: Install components and prerequisites
apt:
name:
- curl
- gnupg
- apt-transport-https
state: present
- name: Add repository
apt_repository:
repo: "ppa:rabbitmq/rabbitmq-erlang-25"
state: present
- name: Update APT
apt:
update_cache: yes
- name: Install RabbitMQ
apt:
name:
- erlang-base
- erlang-asn1
- erlang-crypto
- erlang-eldap
- erlang-ftp
- erlang-inets
- erlang-mnesia
- erlang-os-mon
- erlang-parsetools
- erlang-public-key
- erlang-runtime-tools
- erlang-snmp
- erlang-ssl
- erlang-syntax-tools
- erlang-tftp
- erlang-tools
- erlang-xmerl
- rabbitmq-server
state: present
- name: Enable RabbitMQ service
systemd:
name: rabbitmq-server
enabled: yes
- name: Start RabbitMQ service
systemd:
name: rabbitmq-server
state: restarted