2017/02/14

CentOS7.3にRabbitMQをインストールしてGUIで管理できるようにする

仕事でRabbitMQを使う機会があった。私自身はフロントエンド畑の人なので、メッセージングシステムの意味はわかるけど使ったことがなかったので、実験用サーバ(CentOS7.3)を用意して勉強してみようと思う。

今後、数回にわけて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のキューを操作する方法をまとめていく。



参考サイト





以上

written by @bc_rikko

0 件のコメント :

コメントを投稿