前書き
[ NATS](http://nats.io/)は、オープンソースの高性能メッセージングシステムであり、「クラウドの中枢神経系」と呼ばれることもあります。毎秒数百万のメッセージをルーティングできるため、マイクロサービスと* Internet of Things ( IoT *)デバイスの接続に最適です。
NATSは* PubSubメッセージングシステムです。このようなシステムでは、1つ以上のパブリッシャーが特定のトピックを含むメッセージをメッセージブローカーに送信し、メッセージブローカーはこれらのメッセージを特定のトピックの任意のクライアントまたはサブスクライバー*に配信します。パブリッシャーはサブスクライバーを理解していないか、気にかけていません。その逆も同様です。このアーキテクチャでは、システムの他の部分に影響を与えることなくパブリッシャーとサブスクライバーを追加できるため、システムの拡張と新しい機能の追加が簡単になります。このタイプのシステムは、サーバーやデバイスの監視に非常に適しています。デバイスはメッセージを送信したり、これらのメッセージをサブスクライブしたり、電子メールやその他の手段で通知を送信したりできます。
このチュートリアルでは、公式の gnatsd
NATSサーバーをサービスとしてインストールし、安全な方法でアクセスします。また、サーバーの負荷が高すぎる場合に電子メールを送信し、メッセージエージェントとして gnatsd
を使用する、基本的なサーバー過負荷警告システムを作成します。
このチュートリアルを完了するには、次のものが必要です。
sudo
コマンドを使用できるroot以外のアカウントを持つUbuntu サーバーが必要で、ファイアウォールがオンになっています。サーバーを持っていない学生はここで購入できます(https://cloud.tencent.com/product/cvm?from=10680)が、個人的にはお勧めします無料のTencentCloud [Developer Lab](https://cloud.tencent.com/developer/labs?from=10680)を使用して実験し、インストールを学習した後、[Buy Server](https://cloud.tencent.com/product/cvm?from=10680)を使用します。)sudo
権限を持つ標準ユーザーアカウント。最初に gnatsd
サーバーをダウンロードして、問題なくシステム上で実行できることを確認しましょう。
このチュートリアルが書かれた時点での最新の安定した gnatsd
バージョンはバージョン0.9.4です。 [NATSダウンロードページ](http://nats.io/download)で上位バージョンを入手できます。新しいバージョンを使用する場合は、必要に応じて以下のコマンドを調整できます。
まず、root以外のアカウントを使用してサーバーにログインします。
ssh sammy@your_server_ip
次に、ユーザーのホームディレクトリにいることを確認します。
cd
次に、 wget
を使用して gnatsd
をサーバーにダウンロードします。
wget https://github.com/nats-io/gnatsd/releases/download/v0.9.4/gnatsd-v0.9.4-linux-amd64.zip
ダウンロードしたアーカイブは圧縮アーカイブであるため、ファイルを解凍するには unzip
をインストールする必要があります。 apt
でインストールできます:
sudo apt-get install -y unzip
次に、 unzip
を使用して gnatsd
を抽出します。
unzip -p gnatsd-v0.9.4-linux-amd64.zip gnatsd-v0.9.4-linux-amd64/gnatsd > gnatsd
次に、 gnatsd
実行可能ファイルを作成して実行します。
chmod +x gnatsd
テストしてみましょう。現在のディレクトリから実行することで gnatsd
を実行できます。次のコマンドで gnatsd
を起動します。
. /gnatsd --addr 127.0.0.1--port 4222
表示される出力は、次の例のようになります。
[1851]2016 /09/2305:20:02.247420[INF] Starting nats-server version 0.9.4[1851]2016/09/2305:20:02.248182[INF] Listening for client connections on 127.0.0.1:4222[1851]2016/09/2305:20:02.248626[INF] Server is ready
デフォルトでは、 gnatsd
はすべてのインターフェイスに対応する 4222
アドレスのポート 0.0.0.0
でリッスンします。 --port
パラメータを使用すると、ポートを変更でき、 --addr
を使用してリスニングアドレスを変更できます。 gnatsd
を --addr 127.0.0.1
で実行するため、サーバー上でのみアクセスでき、外部クライアントからはアクセスできません。このチュートリアルの後半で、 gnatsd
が世界に公開されていることを確認します。
CTRL + C
を押して gnatsd
を閉じます。
物事が機能することがわかったので、より正式な方法で設定しましょう。
Linuxでは、サードパーティのサービス関連ソフトウェアが / srv
ディレクトリに保存されることがよくあります。この規則に従い、NATS関連のファイルを / srv / nats
の下に保持します。 gnatsd
実行可能ファイルを / srv / nats / bin
に置きます。
まず、 / srv / nats / bin
フォルダーを作成します。
sudo mkdir -p /srv/nats/bin
次に、 gnatsd
を / srv / nats / bin
フォルダーに移動します。
sudo mv ~/gnatsd /srv/nats/bin
サーバーはファイルから構成をロードできます。これは、このチュートリアルの後半でサーバー設定を変更する必要がある場合に役立ちます。ファイル / srv / nats / gnatsd.config
を作成します。
sudo nano /srv/nats/gnatsd.config
そして、ファイルに以下を追加します。
port:4222
net:'127.0.0.1'
この構成ファイルは、以前と同様に、アドレス 127.0.0.1
のポート 4222
でリッスンするように gnatsd
サーバーに指示しますが、今回はコマンドラインでこれらのオプションを指定する必要はありません。
サーバーを再度実行して、サーバーが正しく構成されていることを確認しましょう。次のコマンドを実行して、新しい構成ファイルで gnatsd
を開始します。
/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config
出力は、前に見たものと似ています。
[1869]2016 /06/1805:30:55.988856[INF] Starting nats-server version 0.9.4[1869]2016/06/1805:30:55.989190[INF] Listening for client connections on 127.0.0.1:4222[1869]2016/06/1805:30:55.989562[INF] Server is ready
もう一度 CTRL + C
を押して gnatsd
を閉じ、プロンプトに戻ります。それでは、このサービスを実行するユーザーを作成しましょう。
独自のユーザーアカウントで各サービスを実行して、サービスが危険にさらされたときの被害を制限することは、優れたセキュリティ対策です。 NATSサービスとNATS関連ファイルを使用してユーザーとグループを作成しましょう。
まず、 nats
という名前のシステムユーザーとグループを作成しましょう。
sudo adduser --system --group --no-create-home --shell /bin/false nats
OutputAdding system user `nats' (UID 106) ...
Adding new group `nats' (GID 114)...
Adding newuser`nats' (UID 106) with group `nats' ...
Not creating home directory `/home/nats'.
/ bin / false
シェルを nats
システムユーザーに割り当てて、このユーザーのログインを無効にし、ホームディレクトリの作成を禁止します。また、 nats
グループを作成しました。
/ srv
ディレクトリの所有者を nats
ユーザーとグループに変更しましょう。
sudo chown -R nats:nats /srv
nats
ユーザーとグループを作成したので、引き続きNATSサービスを作成しましょう。
システムの起動時に gnatsd
を起動し、クラッシュした場合は再起動する必要があります。この問題に対処するために* systemd *を使用します。
[ systemd](https://www.freedesktop.org/wiki/Software/systemd/)は、Linuxシステムのサービスマネージャーです。起動時にサービスを開始し、必要に応じてサービスを再起動し、システムのシャットダウン時に制御された方法でサービスを停止する責任があります。
NATSサービスをいつどのように開始するかを定義するために、サービス構成を作成する必要があります。ユーザーが作成したサービスファイルは / etc / systemd / system
に存在するため、ファイル / etc / systemd / system / nats.service
を作成します。
sudo nano /etc/systemd/system/nats.service
ファイルに次のスクリプトを配置して、 gnatsd
の開始方法を定義します。
[ Unit]
Description=NATS messaging server
[ Service]
ExecStart=/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config
User=nats
Restart=on-failure
[ Install]
WantedBy=multi-user.target
[Unit]
セクションには、サービスに関する一般的な情報が含まれます。たとえば、 Description
は、サービスに関する情報を記述します。[Service]
セクションには、サービスに関連する構成が含まれています。 ExecStart
は、サーバーを実行するためのコマンドです。ここでは、 gnatsd
で実行可能ファイルの絶対パスを使用します。 Restart = on-failure
は、障害が原因でサービスがクラッシュまたは終了した場合、サービスを再起動する必要があることを意味します。 systemdによって停止された場合、再起動しません。[Install]
セクションには、サービスに関するインストール情報が含まれています。 WantedBy = multi-user.target
は、起動時にサービス multi-user.target
を開始するようにsystemdに指示します。これは、システムの起動時にサービスを開始するための一般的な方法です。サービスの説明を配置したら、次のコマンドでサービスを開始できます。
sudo systemctl start nats
PING
メッセージを送信して、 gnatsd
が実行されていることを確認しましょう。
printf "PING\r\n"| nc 127.0.0.14222
nc
を使用して gnatsd
と通信しました。 nc
は、TCPまたはUDPサーバーと通信するためのコマンドラインユーティリティです。使用したコマンドは、次のような出力を出力します。
INFO {"server_id":"Os7xI5uGlYFJfLlfo1vHox","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":false,"tls_required":false,"tls_verify":false,"max_payload":1048576}
PONG
PONG
への応答により、サーバーが期待どおりにリッスンして動作していることがわかります。 NATSサーバーを起動時に起動するには、最後のコマンドを実行する必要があります。
sudo systemctl enable nats
次の出力が表示され、サービスがインストールされていることが確認されます。
OutputCreated symlink from/etc/systemd/system/multi-user.target.wants/nats.service to /etc/systemd/system/nats.service.
gnatsd
をサービスとして実行するように正常に構成しました。それを保護し、外部クライアントがアクセスできるようにします。
使用するすべてのパブリッシャーとサブスクライバー gnatsd
が同じサーバー上で実行されている場合、それを完了と呼んで先に進むことができますが、これは今ではめったに起こりません。外部クライアント gnatsd
が安全な方法でメッセージに接続して公開できるようにする必要があります。
gnatsd
はTLS送信をサポートしているため、これを使用して gnatsd
NATSクライアント間の通信を保護します。
まず、証明書が必要です。商用証明書を購入するか、[Let's Encrypt](http://letsencrypt.org/)から商用証明書を取得するか、自己署名証明書を生成できます。証明書の取得はこの記事の範囲を超えているため、後者の方法を使用します。
証明書を一時的に保存するディレクトリを作成します。
mkdir ~/priv
次に、次のコマンドを使用して、自己署名証明書を作成します。
openssl req -x509 -nodes -days 3650-newkey rsa:2048 \
- keyout priv/gnatsd.key -out priv/gnatsd.crt \
- subj "/C=US/ST=Texas/L=Austin/O=AwesomeThings/CN=www.example.com"
このコマンドは、有効期間が10年の2048ビットRSA証明書を作成します。この記事では gnatsd
サーバーのTLS検証を有効にしないため、任意のドメイン名を使用したことに注意してください。
これで、これらのファイル gnatsd.key
と gnatsd.crt
が 〜/ priv
ディレクトリにあるはずです。これらのファイルを / srv / nats /
ディレクトリ構造に移動して、すべてが1か所にあるようにします。次のコマンドを実行します。
sudo mv ~/priv /srv/nats
これで、 nats
ユーザーとグループのみが / srv / nats / priv
にアクセスできます。
sudo chmod 440/srv/nats/priv/*
sudo chmod 550 /srv/nats/priv
sudo chown -R nats:nats /srv/nats/priv
ここで、 / srv / nats / gnatsd.config
を更新して、作成したばかりの証明書とキーを含めます。構成ファイルを再度開きます。
sudo nano /srv/nats/gnatsd.config
そして、次のセクションを追加して、 gnatsd
に証明書とキーを使用するように指示します。
...
tls {
cert_file:"/srv/nats/priv/gnatsd.crt"
key_file:"/srv/nats/priv/gnatsd.key"
timeout:1}
ファイルを保存して、エディターを終了します。次に、サービスを再起動して、変更を取得できるようにします。
sudo systemctl restart nats
証明書が有効かどうかをテストしてみましょう。次のコマンドを実行します。
printf "PING\r\n"| nc localhost 4222
今回、コマンドは次のメッセージを出力します。
INFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}-ERR 'Secure Connection - TLS Required'
サーバーはメッセージ -ERR'Secure Connection-TLS Required'
を返し、新しい構成を受信し、セキュア接続が必要であることを確認しますが、 nc
は操作方法を認識していません。
完全なNATSクライアントをインストールせずにNATSサービスと通信できるようにするために、* catnats *と呼ばれるツールを使用します。最初にダウンロードしましょう:
wget https://github.com/yuce/catnats/raw/0.1.2/catnats.py
そしてそれを実行可能にします:
chmod +x catnats.py
最後に、 catnats.py
を / srv / nats / bin
フォルダーに移動し、名前を catnats
に変更します。
sudo mv catnats.py /srv/nats/bin/catnats
catnats
は、 PING
の前に送信されたのと同じメッセージを送信して、NATSサービスを使用して通信できるかどうかを確認しましょう。
printf "PING\r\n"|/srv/nats/bin/catnats --addr 127.0.0.1:4222
接続が安全であることを示す次の出力が表示されます。
INFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
PONG
通信を保護したので、認証を有効にして、NATSに接続するためにユーザー名とパスワードが必要になるようにします。
NATSサービスは、デフォルトでは認証を必要としません。これは、サービスがプライベートネットワークでのみアクセスできる場合は問題ありませんが、NATSサービスにインターネットでアクセスできるようにする必要があるため、認証を有効にする必要があります。 gnatsd
はユーザー名とパスワードの認証をサポートしており、簡単に有効にできます。
/ srv / nats / gnatsd.config
ファイルを開きます。
sudo nano /srv/nats/gnatsd.config
資格情報を指定する新しい authorization
セクションを追加します。このチュートリアルでは、ユーザー名 user1
とパスワード pass1
を使用します。実稼働環境では、より長く、より複雑なパスワードを使用する必要があります。
...
authorization {
user: user1
password: pass1
}
ファイルを保存してから、 / srv / nats / gnatsd.config
の所有者を nats
に変更し、このユーザーが読み取れるようにして、システム上の他のユーザーのユーザー名とパスワードを保護します。
sudo chown nats /srv/nats/gnatsd.config
sudo chmod 400/srv/nats/gnatsd.config
次に、変更を有効にするためにサービスを再起動します。
sudo systemctl restart nats
PING
メッセージを gnatsd
に送信して、すべてが正常かどうかを確認しましょう。もう一度、 catnats
を使用してメッセージを送信します。
printf "PING\r\n"|/srv/nats/bin/catnats --addr 127.0.0.1:4222
次の出力が表示されます。
NFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}-ERR 'Authorization Violation'
これは、変更が正常に適用されたことを示しています。サービスに接続するには、正しいユーザー名とパスワードを送信する必要があります。今度はユーザー名 user1
とパスワード pass1
を指定して、もう一度試してみましょう。
printf "PING\r\n"|/srv/nats/bin/catnats --addr 127.0.0.1:4222--user user1 --pass pass1
以下の出力からわかるように、今回は機能しました。
INFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}+OK
PONG
このサービスをユーザー名とパスワードを知っているクライアントに制限したので、外部クライアントが接続できるようにサービスを再構成できます。
ローカルインターフェイスである 127.0.0.1
をリッスンするようにNATSサーバーを構成しました。 0.0.0.0
を聞かせれば、世界中で使えるようになります。 / srv / nats / gnatsd.config
の最後の更新:
sudo nano /srv/nats/gnatsd.config
次に、 net
設定に関連付けられているIPアドレスを変更します。
...
net:'0.0.0.0'...
ファイルを保存して、サービスを再起動します。
sudo systemctl restart nats
これで、NATSサービスは外部クライアント接続の準備ができました。使用方法を学ぶために、NATSサーバーをメッセージブローカーとして使用する簡単な監視サービスを作成しましょう。
このセクションでは、NATSサービスを使用して簡単な過負荷監視システムを作成します。システムはサーバーの平均負荷を受け取り、サーバーが過負荷になると管理者に電子メールを送信します。
サンプルプロジェクトには、次のコンポーネントが含まれます。
stats.loadaverage
のトピックになります。このコンポーネントは、負荷を監視する任意のサーバーで実行する必要があります。stats.loadaverage
のトピックをサブスクライブし、サーバーのホスト名、負荷平均、およびプロセッサー数を受け取ります。ホストの平均負荷が特定のしきい値よりも高い場合、通知プログラムはSMTPサーバーを介して事前定義されたアドレスに電子メールを送信します。簡単にするために、これらすべてのコンポーネントを同じサーバーで実行しますが、このチュートリアルを完了した後、各コンポーネントを異なるサーバーで実行してみることができます。
Linuxシステム / proc / loadavg
の平均負荷をそこから読み取ることができます。このプロジェクトでは、出力の最初のフィールドである直前の負荷平均のみに関心があります。次のコマンドを使用して値を取得します。
cat /proc/loadavg | cut -f1 -d" "
次の出力が表示されます。
0.11
/ proc / loadavg
を読み取って得られる平均負荷はプロセッサの数に依存するため、平均負荷をプロセッサの数で割って正規化する必要があります。次のコマンドを使用して、サーバー内のプロセッサーの数を取得できます。
getconf _NPROCESSORS_ONLN
ターミナルに結果が表示されます。
1
サーバーのデフォルトシェルは浮動小数点演算を処理できないため、メッセージのペイロードとして負荷平均、プロセッサ数、およびホスト名を送信し、後で通知プログラムで分割します。これは、ペイロードを作成するために使用するコマンドです。
echo $(hostname)`cat /proc/loadavg | cut -f1 -d" "``getconf _NPROCESSORS_ONLN`
このコマンドは、ホスト名、平均負荷、およびプロセッサ数をそれぞれ表示します。
your_hostname 0.281
ホスト名 stats.loadaverage
を使用して負荷平均とプロセッサ数をNATSサーバーに公開するシェルスクリプトを作成しましょう。このスクリプトを定期的に実行するようにシステムを構成します。 〜/ publish_load_average.sh
という名前の新しいファイルを作成します。
nano ~/publish_load_average.sh
ファイルに、次のスクリプトを追加します。
NATS_ADDR=127.0.0.1:4222
LOADAVG=$(cat /proc/loadavg | cut -f1 -d" ")
NPROC=$(getconf _NPROCESSORS_ONLN)
SUBJECT="stats.loadaverage"
PAYLOAD=$(echo $(hostname) $LOADAVG $NPROC)
MESSAGE="PUB $SUBJECT ${#PAYLOAD}\r\n${PAYLOAD}\r\n"
printf "$MESSAGE"|/srv/nats/bin/catnats -q --raw --addr $NATS_ADDR --user user1 --pass pass1
このスクリプトはメッセージを作成してから、そのメッセージを catnats
に配信し、 catnats
はメッセージをNATSサービスに公開します。 catnats
は -q
スイッチで実行され、出力を抑制します。 --raw
スイッチを使用するため、 catnats
は入力を解釈しようとしません。 $ NATS_ADDR
NATSサービスが別のサーバーにある場合は、変数の値を変更できます。
スクリプトをテストして、負荷平均をNATSに送信してみましょう。
次のコマンドは、5秒ごとに 〜/ publish_load_average.sh
を実行します。 &
行の終わりにある文字を使用して、バックグラウンドでコマンドを実行することに注意してください。
whiletrue;do sh ~/publish_load_average.sh; sleep 5; done &
コマンドがプロセスIDでバックグラウンドで実行されていることを示す出力が表示されます。
[1]14123
注:後でコマンドを停止するためにそのIDを使用する必要があるため、プロセスIDをどこかに書き留めます。
次に、NATSに接続し、トピック stats.loadaverage
をサブスクライブして、負荷平均を取得します。
printf "SUB stats.loadaverage 0\r\n"|/srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1
--no-exit
フラグを使用して自動終了を無効にし、 --pong
を使用してNATSとの接続をアクティブに保ちます。すべてが正しければ、次のような出力が得られ、5秒ごとに更新されます。
INFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}+OK
+ OK
MSG stats.loadaverage 027
your_hostname 0.081
CTRL + C
を押して catnats
を終了します。 publish_load_average.sh
を実行するためのより良い方法があるので、 publish_load_average.sh
ループの呼び出しを停止しましょう。
kill 14123
採用した方法はテストに非常に適していますが、永続的に使用したい方法ではありません。システムが毎分 publish_load_average.sh
を実行できるようにする必要があります。これを実現するために、* crontab *エントリを追加できます。 Linuxシステムは cron
を使用します。これは、指定したスケジュールに従ってコマンドまたは「ジョブ」を実行できるシステムです。 crontab
コマンドを使用すると、これらのジョブを管理できます。
新しいエントリを作成するには、次のコマンドを実行します。
crontab -e
上記のコマンドを実行したことがない場合は、エントリを管理するテキストエディタを選択するように求める次のプロンプトが表示される場合があります。
no crontab for demo - using an empty one
Select an editor. To change later, run 'select-editor'.1./bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4[2]:
使い慣れたエディタに対応する番号を入力し、「ENTER」を押してください。選択したエディターにファイルが表示されます。
開いたファイルの最後に次の行を追加しますが、次の行を使用した場合は、ユーザー名 sammy
を置き換えてください。
* /1**** bash /home/sammy/publish_load_average.sh
上記のエントリは、 cron
に publish_load_average.sh
スクリプトを毎分実行することを伝えています。ファイルを保存して、エディターを閉じます。
次に、負荷平均の定期的なリリースが効果的かどうかをテストしましょう。
printf "SUB stats.loadaverage 0\r\n"|/srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1
数分待つと、表示される出力は次のようになります。
INFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}+OK
+ OK
MSG stats.loadaverage 027
your_hostname 0.011
MSG stats.loadaverage 027
your_hostname 0.001
CTRL + C
を押して catnats
を終了します。
モニターのセットアップに成功し、NATSサーバーにメッセージを送信しています。次に、このデータを使用する通知プログラムを設定します。
NATSサービスに接続し、 stats.loadaverage
メッセージをリッスンする通知プログラムを作成しましょう。プログラムがメッセージを受信するたびに、各プロセッサの平均負荷が計算されます。プロセッサあたりのCPU使用率が0.6または60%を超える場合、メッセージを公開しているホストに警告フラグを設定し、事前定義されたアドレスに電子メールを送信します。各プロセッサの平均負荷が0.4未満の場合、ホストの警告フラグがクリアされます。受信トレイがいっぱいになるのを防ぐため、警告フラグが設定されたときにメールを送信します。
Node.jsには優れたNATSクライアントがあるため、Node.JSを使用して通知プログラムを作成します。したがって、最初にNode.jsをインストールします。
sudo apt-get install -y npm
次に、通知プログラム用のディレクトリを作成し、そのディレクトリに切り替えます。
mkdir ~/overload_notifier && cd ~/overload_notifier
Node.jsプロジェクトは、プロジェクトとその依存関係に関する情報を含む package.json
というファイルを使用します。次のコマンドを実行してファイルを作成します。
npm init -y
次に、Node.js用のNATSクライアントと、このプロジェクトで警告メールを送信するために使用する nodemailer
モジュールをインストールします。
npm install [email protected] [email protected]
これで、通知プログラムを作成できます。ファイル notifier.js
を作成します。
nano notifier.js
次に、次のコードをファイルに追加します。
var NATS_URL ='nats://127.0.0.1:4222';var NATS_USER ='user1';var NATS_PASS ='pass1';var EMAIL_TO ='[email protected]';
これらのオプションは、NATSサービスのユーザー名とパスワード、および電子メールアドレスと一致するように必ず変更してください。
次に、次のコードを追加してNode.js NATSクライアントをインポートし、 gnatsd
サービスに接続します。
var tlsOptions ={
rejectUnauthorized:false,};var nats =require('nats').connect({url: NATS_URL,
tls: tlsOptions,
user: NATS_USER,
pass: NATS_PASS});
次に、このコードを追加してメールプログラムを設定し、メールを送信するSMTPサーバーに接続します。このサーバーはまもなくセットアップされます。
var nodemailer =require('nodemailer');var transport = nodemailer.createTransport('smtp://localhost:2525');
次に、残りのコードを追加して負荷平均を計算し、通知メールを送信する必要があるかどうかを判断します。
// keep the state of warnings for each hostvar warnings ={};
functionsendEmail(subject, text){
transport.sendMail({
to: EMAIL_TO,
subject: subject,
text: text
});}
functionprocessMessage(message){// message fields: host load processor_countvar fields = message.split(" ");var host = fields[0];var loadAverage =parseFloat(fields[1])/parseInt(fields[2]);if(loadAverage >0.6){if(!warnings[host]){// send warning email if one wasn't already sentvar res =sendEmail('Warning! Server is Overloaded: '+ host,'Load average: '+ loadAverage);// set warning for the host
warnings[host]=true;}}elseif(loadAverage <0.4){if(warnings[host]){// clear the warning
warnings[host]=false;}}}
nats.subscribe('stats.loadaverage', processMessage);
メッセージをサブスクライブし、メッセージを受信するたびに、送信したペイロードを解析して平均負荷を決定する processMessage
関数を実行します。高すぎる場合は、メッセージを送信し、ホスト名に基づいてフラグを設定することにより、以前にメッセージを送信したことがあるかどうかを追跡します。このようにして、ホストごとに通知を追跡できます。負荷平均がしきい値を下回っている場合は、フラグをクリアします。
監視および通知プログラムを使用して、サンプルプロジェクトをテストできます。
試してみよう。人工的な負荷を生成し、負荷が高すぎる場合に通知者が警告メールを送信するかどうかを確認します。
ストレスツールをインストールして、サーバーにCPU負荷を生成しましょう。
sudo apt-get install -y stress
次に、通知プログラムからのメッセージを投稿するようにSMTPサーバーを設定する必要があります。このテストでは、完全なSMTPサーバーをインストールして構成するのはやり過ぎなので、実際に送信するのではなく、配信された電子メールのみを表示する単純なSMTPサーバーを使用します。 Pythonプログラミング言語には、ロードできる DebuggingServer
モジュールがあり、受信した電子メールは破棄されますが、動作することを確認できるように画面に表示されます。 PythonはすでにUbuntuサーバーにインストールされているため、これは完璧なソリューションです。
SMTPサーバーをバックグラウンドで起動してデバッグします。 notifier.js
コードで設定したSMTPアドレスと一致する localhost
ポート 2525
でリッスンします。次のコマンドを実行して、SMTPサーバーを起動します。
python -m smtpd -n -c DebuggingServer localhost:2525&
次に、次のコマンドを使用して、通知プログラムをバックグラウンドで開始します。
nodejs ~/overload_notifier/notifier.js &
最後に、サーバーのすべてのプロセッサに負荷をかけましょう。次のオプションを指定して stress
コマンドを実行します。
stress --cpu $(getconf _NPROCESSORS_ONLN)
数分後、SMTPサーバーが通知機能によって送信されたメッセージの表示を開始するため、次のような出力が表示されます。
- - - - - - - - - - MESSAGE FOLLOWS ----------
Content-Type: text/plain
To: [email protected]
Subject: Warning! Server is Overloaded: your_hostname
Message-Id:<1466354822129-04c5d944-0d19670b-780eee12@localhost>
X-Mailer:nodemailer(2.4.2;+http://nodemailer.com/;
SMTP/2.5.0[client:2.5.0])
Content-Transfer-Encoding: 7bit
Date: Sun,19 Jun 201616:47:02+0000
MIME-Version:1.0
X-Peer:127.0.0.1
Load average:0.88------------ END MESSAGE ------------
これにより、サーバーの負荷が高すぎる場合にメールが正常に送信されたことが通知されます。
CTRL + C
を押して、負荷の生成を停止します。サンプルプロジェクトが完了しました。これで、自分の環境で作業する方法を理解する必要があります。
この記事では、NATS PubSubメッセージングシステムについて学び、安全な方法でサービスとしてインストールし、サンプルプロジェクトでテストしました。サンプルプロジェクトはNode.JSクライアントを使用していますが、NATSにはより多くの言語とフレームワークを備えたクライアントがあり、[NATSダウンロードページ](http://nats.io/download)で見つけることができます。 NATSの詳細については、[公式ドキュメント](http://nats.io/documentation/)を参照してください。
その他のUbuntuチュートリアルについては、[Tencent Cloud + Community](https://cloud.tencent.com/developer?from=10680)にアクセスして詳細を確認してください。
参照:「Ubuntu16.04にNATSをインストールして構成する方法」
Recommended Posts