2022年6月18日土曜日

NGINXの負荷分散対象サーバに対してポートチェックするスクリプト

先日、NGINXを使って負荷分散装置(ロードバランサ)を構築する手順を記載した。

NGINXは非常に簡単に負荷分散装置として構築できる反面、BIG-IPなどの負荷分散装置にあるような、現在の負荷分散装置対象サーバの状態を確認するコマンドなどは用意されていない。

そこで今回、NGINXの負荷分散対象サーバに対してポート開放状態のチェックを行うスクリプトを作成してみた。

環境

環境としては以下の通りAlmaLinuxを利用した。NGINXは前述したURLの通り、負荷分散装置として構築済みである前提とする。

  • AlmaLinux 8.5
  • NGINX 1.14.1

スクリプト導入手順

1. 前提パッケージの導入

ポートチェックはncコマンドで行うため、以下の通りパッケージインストールを行う。

# dnf install nc -y

2. スクリプトを配置

スクリプトの内容は以下の通りとなる。スクリプトはGitHubに公開している。

作りとしては、NGINXの設定ファイルを読み込み、負荷分散対象サーバに対してポート開放チェックをする。設定ファイルの記載フォーマットが以前の記事の通りとなっていない場合うまく動作しない可能性があるため、その場合はスクリプトの修正が必要となるかもしれない。

#!/bin/bash
################
# Scripts name : check_nginx_stream.sh
# Usage        : ./check_nginx_stream.sh
# Description  : NGINX負荷分散対象ポートチェックスクリプト
# Create       : 2022/04/30 tech-mmmm (https://tech-mmmm.blogspot.com/)
# Modify       :
################

rc=0      # Return code
array=()  # サーバ&ポート一覧保存用配列
config_file="/etc/nginx/stream.conf.d/servers.stream.conf" # 設定ファイルパス

# Configからサーバ&ポート情報抽出
while read line || [ -n "${line}" ]; do
  # upstream行の設定から負荷分散対象グループ名を取得
  if [ $(echo ${line} | grep -c -E "^upstream.*{") -ne 0 ]; then
    pool=$(echo ${line} | cut -d" " -f2)
  fi
  # server行の設定から、負荷分散対象サーバの情報を取得
  if [ $(echo ${line} | grep -c -E "^server.*;") -ne 0 ]; then
    member=$(echo ${line} | cut -d" " -f2 | tr -d ";")
    array+=("${pool}:${member}")
  fi
done < "${config_file}"

# ポートスキャン
for i in ${array[@]} ; do
  # ポート番号取得
  server=$(echo $i | cut -d":" -f1)
  port=$(cat /etc/nginx/stream.conf.d/servers.stream.conf | grep -E -B1 "proxy_pass.*${server}" | grep listen | awk '{print $3}' | tr -d ";")
  if [ "${port}" == "" ]; then
    port="tcp"
  fi

  # ポートスキャン
  if [ "${port}" == "tcp" ]; then
    # TCPの場合
    nc -nvz $(echo $i | cut -d":" -f2) $(echo $i | cut -d":" -f3) > /dev/null 2>&1
    if [ $(echo $?) -eq 0 ]; then
      result="up"
    else
      result="down"
      rc=$((${rc} + 1))
    fi
  else
    # UDPの場合
    nc -unvz $(echo $i | cut -d":" -f2) $(echo $i | cut -d":" -f3) > /dev/null 2>&1
    if [ $(echo $?) -eq 0 ]; then
      result="up"
    else
      result="down"
      rc=$((${rc} + 1))
    fi
  fi

  echo "$i:$port -> ${result}"
done

exit ${rc}

上記スクリプトを任意の場所に配置し、実行権限をつければ動作する。今回はgitをインストールしていないため、wgetで取得した。

# wget https://raw.githubusercontent.com/tech-mmmm/check_nginx_stream/main/check_nginx_stream.sh
--2022-04-30 08:41:22--  https://raw.githubusercontent.com/tech-mmmm/check_nginx_stream/main/check_nginx_stream.sh
192.168.33.23:8080 に接続しています... 接続しました。
Proxy による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1853 (1.8K) [text/plain]
`check_nginx_stream.sh' に保存中

check_nginx_stream. 100%[===================>]   1.81K  --.-KB/s 時間 0s

2022-04-30 08:41:22 (62.6 MB/s) - `check_nginx_stream.sh' へ保存完了 [1853/1853]

# chmod +x check_nginx_stream.sh

3. 動作確認

実際に私の環境で実行した結果は以下の通り。

# ./check_nginx_stream.sh
proxy_server:192.168.33.27:8080:tcp -> up
proxy_server:192.168.33.28:8080:tcp -> up
dns_server:192.168.33.27:10053:udp -> up
dns_server:192.168.33.28:10053:udp -> up
mail_server:192.168.33.27:25:tcp -> up
mail_server:192.168.33.28:25:tcp -> up
ntp_server:192.168.33.27:123:udp -> up
ntp_server:192.168.33.28:123:udp -> up

以上 。

0 件のコメント:

コメントを投稿

人気の投稿