CentOS Stream 9でのRabbitMQのインストールと最適化:ゼロから本番環境まで

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

課題:なぜシステムにRabbitMQが必要なのか?

1分間に約1,000件の注文が発生するECサイトを運営していると想像してみてください。確認メールの送信が終わるまでシステムが「注文完了」の通知を待機させるような設計だと、遅延(ラグ)により離脱率が急増してしまいます。これこそが、同期処理によるボトルネックが発生している状態です。

RabbitMQは、コーディネーター(調整役)としてこの問題を解決します。メール送信の完了を待つ代わりに、システムはリクエストをキュー(queue)に投入するだけで、すぐに顧客へレスポンスを返すことができます。CentOS Stream 9でのインストールはそれほど複雑ではありませんが、Erlangのバージョン選択を誤ると、依存関係のエラーに悩まされることになります。

クイックスタート:5分で完了するRabbitMQのインストール

急いでいる場合は、Cloudsmithのスクリプトを使用するのが一番です。これは、一行ずつ手動で設定することなく、公式リポジトリを取得する最も速い方法です。

# 1. システムのアップデート
sudo dnf update -y

# 2. リポジトリ設定スクリプトの追加 (ErlangとRabbitMQ)
curl -s https://setup.cloudsmith.io/rabbitmq/rabbitmq-erlang/script.rpm.sh | sudo bash
curl -s https://setup.cloudsmith.io/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash

# 3. RabbitMQ Serverのインストール
sudo dnf install rabbitmq-server -y

# 4. サービスの有効化
sudo systemctl enable --now rabbitmq-server

sudo rabbitmqctl statusを実行して確認してください。バージョンとノード名が表示されれば、正しく設定されています。

なぜErlangを個別にインストールする必要があるのか?

OS標準のdnf install rabbitmq-serverをそのまま使ってしまう人が多いですが、これは間違いです。古いバージョンや互換性のないErlangがインストールされるリスクがあるからです。RabbitMQはErlang/OTPプラットフォーム上で構築されており、安定性とパフォーマンスを確保するために、RabbitMQ의 各バージョンは非常に厳格なErlangのバージョン範囲を要求します。

ステップ1:管理画面(Management UI)の有効化

コマンド入力だけでは効率が悪いため、RabbitMQは直感的なWebダッシュボードを提供しています。ここでは、メッセージの送受信をリアルタイムのグラフで監視できます。

# 管理プラグインを有効化
sudo rabbitmq-plugins enable rabbitmq_management

# 変更を適用するために再起動
sudo systemctl restart rabbitmq-server

これで、ポート15672経由でアクセスできるようになります。注意:セキュリティ上の理由から、デフォルトのguestユーザーはlocalhostからのみログイン可能です。

ステップ2:管理者権限の設定

インストール後に私が必ず行うのは、デフォルトユーザーを削除し、強力なパスワードを持つ新しい管理者アカウントを作成することです。

# 新しい管理者ユーザーを作成
sudo rabbitmqctl add_user tech_admin StrongPassword123!

# 管理者タグを付与
sudo rabbitmqctl set_user_tags tech_admin administrator

# デフォルトのvhostに対する全権限を付与
sudo rabbitmqctl set_permissions -p / tech_admin ".*" ".*" ".*"

応用:SSL/TLSによる通信の暗号化

amqp://(プレーンテキスト)プロトコルでメッセージを送信するのは、誰でも読めるハガキを送るようなものです。本番環境では、機密データをSSL/TLS(ポート5671)経由で暗号化する必要があります。

/etc/rabbitmq/rabbitmq.confファイルを開き、以下の設定を追加します:

listeners.ssl.default = 5671

ssl_options.cacertfile = /etc/rabbitmq/certs/ca_cert.pem
ssl_options.certfile   = /etc/rabbitmq/certs/server_cert.pem
ssl_options.keyfile    = /etc/rabbitmq/certs/server_key.pem
ssl_options.verify     = verify_peer
ssl_options.fail_if_no_peer_cert = false

chown -R rabbitmq:rabbitmq /etc/rabbitmq/certs/コマンドを実行して、RabbitMQが証明書ディレクトリにアクセスできる権限を付与するのを忘れないでください。

CentOS Stream 9でのファイアウォール開放

CentOS 9はfirewalldによってポートを厳格に管理しています。ポートを開放しないと、アプリケーションから「Connection Refused(接続拒否)」エラーが発生します。

# AMQPと管理UI用のポートを開放
sudo firewall-cmd --permanent --add-port={5672,5671,15672}/tcp

# 変更を適用
sudo firewall-cmd --reload

実務における運用ノウハウ

メッセージブローカーのトラブルシューティングに長年携わってきた中で、特に注意すべき3つのポイントを挙げます:

  • RAM管理:RabbitMQはデフォルトで、消費RAMがサーバー全容量の40%を超えると接続をブロックします。サーバーの構成が特殊な場合は、vm_memory_high_watermarkの値を調整してください。
  • ディスク容量の閾値:空き容量が50MBを下回ると、RabbitMQは即座にメッセージの受信を停止します。突然のシステム停止を避けるため、私は通常この閾値を2GBに引き上げています。
  • 仮想ホスト(vhost)の分割:vhostは個別のデータベースのようなものと考えてください。開発環境と本番環境のデータを同じvhostに混在させてはいけません。

原因不明のエラーが発生した場合は、推測に頼らず/var/log/rabbitmq/にあるログをすぐに確認してください。CentOSでの起動失敗の多くは、SELinuxによるファイル読み取り制限か、.confファイルの記述ミスが原因です。導入の成功を祈っています!

Share: