今後、数回にわけてRabbitMQの基本、インストール、設定、使い方などをブログに書いていく。
今回は、インストール~設定までして、最終的にRabbitMQを使える状態にする。その過程でハマりにハマったので手順として残しておく。
RabbitMQ とは
いきなり「RabbitMQをCentOSにインストールした」と書き出したが、そもそもRabbitMQがなんなのか、どんなときに使われるのか説明する。
RabbitMQはAMQPを使用したメッセージ指向ミドルウェア。処理の命令をいったんキューイングして、逐一実行するためのメッセージングシステムのひとつ。
呼び出し側(Producer)がRabbitMQにメッセージを登録しておく。そして、呼び出される側(Consumer)がそのメッセージを受け取り実行する。このようにメッセージングシステムを間に挟むことで、呼び出し側と呼び出される側を完全に分離することができる。
呼び出し側はメッセージを登録しておくだけなのでレスポンスを待つ必要がなく、また呼び出される側もメッセージをひとつひとつ受け取り実行することで負荷分散ができる。またアプリケーションが万が一落ちたとしてもメッセージは残っているので、再起動後に実行できるなど障害にも強くなる。
※Producer/Consumerと書いたが、一般的にはPublisher/Subscriberという
AMQP とは
RabbitMQについて知るには、まずはAMQPについて知る必要がある。
AMQPはAdvanced Message Queuing Protocolの略で、HTTPやFTPなどと同じアプリケーション層のプロトコルであり、メッセージ指向、キューイング、ルーティング、セキュリティなどが定義されている。
AMQPをつかったメッセージングシステムは数多くあり、BrokerモデルとBrokerlessモデルの2つの種類に分けられる。RabbitMQはメッセージをためておくBrokerがあるBroker
モデルだが、中にはP2Pのように直接メッセージをやりとりBrokerlessモデルもある。
RabbitMQをインストールする
今回インストールするものは以下のとおり。
- RabbitMQ: v3.3.5
- Erlang: v5.10.4
Erlangをインストールする
RabbitMQはErlangで実装されているので、まずは動作環境を準備するためにErlangをインストールする。公式のインストールガイドでは、以下の3つの方法が紹介されている。- Erlang Solutions
- 最新版のパッケージをインストールできる
- Zero-Dependencyパッケージ
- RabbitMQを動かすために必要なコンポーネントだけをまとめたもの
- 依存関係で躓いたときはこれをインストールするといいらしい
- EPEL
- 最新じゃないかもしれないけど公式パッケージ
Erlangについてまったく知らないし、インストールガイドを読んでも結局どれでインストールすれば良いのかわからなかったので、見覚えのある「EPEL」をつかうことにした。
# epelのリポジトリが登録されていない場合
$ rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
# epelのアップデート
$ yum -y --enablerepo=epel update epel-release
# epel リポジトリからErlangをインストール
$ yum -y install erlang --enablerepo=epel
# バージョンの確認
$ erl +V
Erlang (ASYNC_THREADS,HIPE) (BEAM) emulator version 5.10.4
EPLEのhowtouseに書かれている通りに実行すると「The requested URL returned error: 404 Not Found」というエラーがでた。これはrpmのパスが間違っているためで、「epel-release-7-9.noarch.rpm」に変更したら解決できた。
RabbitMQ Serverをインストールする
本体となるRabbitMQ Serverをインストールする。EPELはアップデート済みなのでそのままインストールできる。# epalリポジトリからRabbitMQ Serverをインストール
$ yum -y install rabbitmq-server --enablerepo=epel
# バージョン確認
$ rabbitmq-server
RabbitMQ 3.3.5. Copyright (C) 2007-2014 GoPivotal, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/rabbit@mq.log
###### ## /var/log/rabbitmq/rabbit@mq-sasl.log
##########
Starting broker... completed with 0 plugins.
^C
Session terminated, killing shell... ...killed.
これでひとまずRabbitMQのインストールが終わった。
RabbitMQをGUIで管理できるプラグインを追加する
RabbitMQには、プラグインを追加(有効)することで機能を拡張することができる。ということで、GUI管理ツールのプラグインを追加する。
rabbitmq_managementを追加する
GUI管理ツールをつかうためには、rabbitmq_managementを追加するだけでよい。# プラグイン一覧の確認
$ rabbitmq-plugins list
[e] amqp_client 3.3.5
[ ] cowboy 0.5.0-rmq3.3.5-git4b93c2d
[ ] eldap 3.3.5-gite309de4
[e] mochiweb 2.7.0-rmq3.3.5-git680dba8
[ ] rabbitmq_amqp1_0 3.3.5
[ ] rabbitmq_auth_backend_ldap 3.3.5
[ ] rabbitmq_auth_mechanism_ssl 3.3.5
[ ] rabbitmq_consistent_hash_exchange 3.3.5
[ ] rabbitmq_federation 3.3.5
[ ] rabbitmq_federation_management 3.3.5
[ ] rabbitmq_management 3.3.5
[e] rabbitmq_management_agent 3.3.5
[ ] rabbitmq_management_visualiser 3.3.5
[ ] rabbitmq_mqtt 3.3.5
[ ] rabbitmq_shovel 3.3.5
[ ] rabbitmq_shovel_management 3.3.5
[ ] rabbitmq_stomp 3.3.5
[ ] rabbitmq_test 3.3.5
[ ] rabbitmq_tracing 3.3.5
[e] rabbitmq_web_dispatch 3.3.5
[ ] rabbitmq_web_stomp 3.3.5
[ ] rabbitmq_web_stomp_examples 3.3.5
[ ] sockjs 0.3.4-rmq3.3.5-git3132eb9
[e] webmachine 1.10.3-rmq3.3.5-gite9359c7
# プラグインを有効にする
$ rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
# 有効になったことを確認
$ rabbitmq-plugings list | grep management
rabbitmq-plugins list | grep rabbitmq_management
[E] rabbitmq_management 3.3.5
[e] rabbitmq_management_agent 3.3.5
[ ] rabbitmq_management_visualiser 3.3.5
# サービスの再起動
$ service rabbitmq-server restart
これでhttp://localhost:15672で管理画面にアクセスすることができるようになった。
リモートからアクセスできるようにする
さきほどhttp://localhost:15672で管理画面にアクセスできると書いたが、実はデフォルトのままではリモートからアクセスすることができない。そこで/etc/rabbitmq/rabbitmq.configを修正するのがだ、私の環境ではどうやってもうまく行かなかったので、SSHポートフォワーディングをする
# ssh -L {任意のポート番号}:hostname:15672 username@hostname
$ ssh -L 25672:123.123.123.123:15672 user@123.123.123.123
これでhttp://localhost:25672にアクセスすると、ログイン画面が表示されるので、「guest/guest」でログインする。
※guestユーザはセキュリティ上好ましくないのでユーザの追加について後述する
この管理画面を使えば、メッセージのたまり具合や、ユーザの作成などができる。
リモートからアクセスできるようにする(未解決)
本来の設定の仕方について書いていく。私のやり方が間違っていたらご指摘お願いします。/etc/rabbitmq/rabbitmq.congifのloopback_usersの部分を修正する。
%%
%% Security / AAA
%% ==============
%%
%% The default "guest" user is only permitted to access the server
%% via a loopback interface (e.g. localhost).
%% {loopback_users, [<<"guest">>]},
%%
%% Uncomment the following line if you want to allow access to the
%% guest user from anywhere on the network.
%% {loopback_users, []}, // ←ここのコメントを解除する
編集が終わったらRabbitMQを再起動して完了(のはず)
$ service rabbitmq-server restart
しかし私の環境だと、RabbitMQを起動しようとしたときに以下のようなエラーがでる。
$ service rabbitmq-server start
Redirecting to /bin/systemctl start rabbitmq-server.service
Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
$ systemctl status rabbitmq-server.service
* rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Sat 2017-02-11 18:33:08 JST; 30s ago
Process: 24786 ExecStop=/usr/lib/rabbitmq/bin/rabbitmqctl stop (code=exited, status=2)
Process: 24720 ExecStart=/usr/lib/rabbitmq/bin/rabbitmq-server (code=exited, status=1/FAILURE) Main PID: 24720 (code=exited, status=1/FAILURE)
Feb 11 18:33:08 mq rabbitmqctl[24786]: no other nodes on mq
Feb 11 18:33:08 mq rabbitmqctl[24786]: * suggestion: start the node
Feb 11 18:33:08 mq rabbitmqctl[24786]: current node details:
Feb 11 18:33:08 mq rabbitmqctl[24786]: - node name: rabbitmqctl24786@mq
Feb 11 18:33:08 mq rabbitmqctl[24786]: - home dir: /var/lib/rabbitmq
Feb 11 18:33:08 mq rabbitmqctl[24786]: - cookie hash: ZyZhqaLEx4IkYYT54TxWLA==
Feb 11 18:33:08 mq systemd[1]: rabbitmq-server.service: control process exited, code=exi...us=2
Feb 11 18:33:08 mq systemd[1]: Failed to start RabbitMQ broker.
Feb 11 18:33:08 mq systemd[1]: Unit rabbitmq-server.service entered failed state.
Feb 11 18:33:08 mq systemd[1]: rabbitmq-server.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
# SELinuxが無効になっているか確認
$ getenforce
Disabled
ためしに/etc/rabbitmq/rabbitmq.configのバックアップをとり、必要な設定だけを以下のように書き加えたら、RabbitMQを起動することはできた。しかし、リモートからのアクセスはできなかった。
[{rabbit, [{loopback_users, []}]}].
番外編: さくらのクラウドでRabbitMQをインストールする
前述までの処理をひと通りやってハマりにハマったあとに、さくらのクラウドにRabbitMQのスタートアップスクリプトがあることに気づいた。これを使えば煩わしい手順を踏まずにたった数分でRabbitMQをインストールして、GUI管理画面を見ることができた…。
管理者ユーザを作成し、guestユーザを削除する
セキュリティ上、guestユーザは好ましくない。というかguestユーザはlocalhostでしかログインできない。ということで、別途管理用のユーザをつくる。
管理ツールを使えばGUIで作成することも可能だが、今回はコマンドで実行する。(コマンドをつかう理由は特にない)
# ユーザの作成
# rabbitmqctl add_user {ユーザ名} {パスワード}
$ rabbitmqctl add_user admin ********
# タグの追加
# rabbitmqctl set_user_tags {ユーザ名} {ロール}
$ rabbitmqctl set_user_tags admin administrator
# 権限の設定
# rabbitmqctl set_permissions {ユーザ名} {設定変更} {書き込み} {読み込み}
$ rabbitmqctl set_permissions admin '.*' '.*' '.*'
# guestユーザの削除
$ rabbitmqctl delete_user guest
これで管理ツールには「admin/password」でログインできるようになる。
次回以降に、Node.jsでRabbitMQのキューを操作する方法をまとめていく。
参考サイト
- RabbitMQ - Downloading and Installing RabbitMQ
- kakakikikekeのブログ: CentOSにRabbitMQをインストール
- RabbitMQのインストールと管理画面の有効化(MacOSX/Linux/Windows) - Qiita
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿