Logo de Béjean Développement

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

Sources