生のログを眺めるのはもうやめましょう:GoAccessでNginxとApacheの分析をリアルタイム化

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

なぜログの可視化が手動のgrepよりも優れているのか

システム管理者にとって、tail -fで生のログをスキャンし続けるのは骨の折れる作業です。流れていくIPアドレスを眺め、404エラーを見つけ、時には/wp-login.phpxmlrpc.phpを狙うボットの痕跡をキャッチすることもあるでしょう。しかし、生のテキストデータだけでは全体像を把握することは困難です。トラフィックが急増した際、それがDDoS攻撃なのか、検索エンジンのクローラーなのか、あるいは純粋なユーザーの増加なのかを即座に判断する必要があります。

GoAccessは、こうした場面で私が好んで使うソリューションです。これはオープンソースのリアルタイムログアナライザーで、ターミナルとブラウザの両方で完璧に動作します。C言語で書かれているため、非常に効率的です。ELKスタック(Elasticsearch、Logstash、Kibana)を安定して動かすには4GBから8GBのRAMが必要になることもありますが、GoAccessは多くの場合50MB未満で動作します。リソースを大量に消費することなく、深い洞察を提供してくれます。

私は過去数年間で10以上のLinux VPSインスタンスを管理してきましたが、そこから得た重要な教訓があります。それは、監視ツールは必ず最初にステージング環境でテストすべきだということです。可視性は重要ですが、監視ツール自体が監視対象のサーバーをダウンさせてしまっては本末転倒です。GoAccessはそのバランスが絶妙です。

LinuxへのGoAccessのインストール

ほとんどのディストリビューションのデフォルトリポジトリにはGoAccessが含まれていますが、それらのバージョンは古いことが多いです。1秒未満のWebSocket更新や最新機能を利用するには、開発者の公式リポジトリを使用することをお勧めします。

UbuntuおよびDebianの場合

標準リポジトリは更新が遅れがちです。公式のGoAccessリポジトリを使用して、ライブHTMLレポートに必要なすべての依存関係を含む最新のバイナリを入手しましょう。

wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt-get update
sudo apt-get install goaccess

RHEL、AlmaLinux、Fedoraの場合

RHELベースのシステムでは、EPELリポジトリが最適です。比較的新しいバージョンが提供されており、システムのパッケージマネージャーとうまく統合されています。

sudo dnf install epel-release
sudo dnf install goaccess

インストールの確認

バージョン番号を確認して、インストールが成功したことを確かめます。これにより、バイナリがPATHに含まれ、準備が整っていることが確認できます。

goaccess --version

NginxとApache向けのGoAccess設定

GoAccessがログファイルを理解するためのルールを設定する必要があります。ほとんどのNginxおよびApacheのインストールでは「Combined」ログフォーマットが使用されています。このフォーマットには、IP、日付、リクエストタイプ、ユーザーエージェントが含まれます。

設定は/etc/goaccess/goaccess.confで行います。お好みのエディタでこのファイルを開いてください:

sudo nano /etc/goaccess/goaccess.conf

Log Format Configurationセクションを探します。標準的なウェブサーバーのログをサポートするために、以下の行のコメントアウトを解除します:

time-format %H:%M:%S
date-format %d/%b/%Y
log-format COMBINED

カスタム設定を行っている場合は、もう少し作業が必要です。Nginxでキャッシュヒットやアップストリームのレスポンスタイムをログに記録するように変更している場合は、それに合わせてlog-format文字列を調整する必要があります。ほとんどのユーザーにとって、標準のCOMBINEDフォーマットはトラフィック分析ニーズの95%をカバーします。

ターミナルでGoAccessを実行する

発生している問題を素早く診断する最も速い方法は、SSHセッション内で直接GoAccessを起動することです。ログファイルのパスを指定するだけで実行できます。

sudo goaccess /var/log/nginx/access.log --log-format=COMBINED

Apacheユーザーの場合、ログは通常/var/log/apache2/access.logにあります。ダッシュボードが表示されたら、以下のキーを使って操作します:

  • F1 または h: ヘルプメニューを開く。
  • 0-9: 「ユニークビジター」や「静的ファイル」などの特定のモジュールに直接ジャンプする。
  • o または Enter: 現在のモジュールを展開して詳細表示にする。
  • j/k: カーソルを上下に移動する。
  • q: プログラムを終了する。

リアルタイム Web ダッシュボードのセットアップ

ターミナルUIは迅速なトリアージには最適ですが、長期的な監視にはブラウザベースのダッシュボードが適しています。GoAccessは、WebSocketを使用して自動的に更新される単一のHTMLファイルを生成できます。これにより、トラフィックの急増をリアルタイムで確認できます。

まず、統計データ用の専用ディレクトリを作成します:

sudo mkdir -p /var/www/html/stats

バックグラウンドプロセスを開始し、ダッシュボードをライブ状態に保つには、次のコマンドを実行します:

sudo goaccess /var/log/nginx/access.log -o /var/www/html/stats/index.html --log-format=COMBINED --real-time-html --daemonize

各フラグの意味は以下の通りです:

  • -o: HTMLレポートの保存先を定義します。
  • --real-time-html: ライブデータをプッシュするためのWebSocketサーバーを起動するようGoAccessに指示します。
  • --daemonize: SSHセッションを閉じた後もプロセスをバックグラウンドで実行し続けます。

ファイアウォールの設定

GoAccessはWebSocket接続にポート7890を使用します。このポートがブロックされていると、ダッシュボードは読み込まれますが、データは更新されません。この通信を明示的に許可する必要があります。

# UFWの場合 (Ubuntu/Debian)
sudo ufw allow 7890/tcp

# Firewalldの場合 (RHEL/AlmaLinux)
sudo firewall-cmd --permanent --add-port=7890/tcp
sudo firewall-cmd --reload

http://your-server-ip/stats/にアクセスしてデータを確認してください。もし赤い「WebSocket connection failed」という点が表示される場合は、GoAccessのプロセスが実行中であるか、およびポートが開いているかを確認してください。

セキュリティと最適化

ログを一般公開することは、重大なセキュリティリスクになります。ログには、攻撃者がインフラの構造を把握するために利用できる機密性の高いパスやIPアドレスが含まれていることがよくあります。必ず/statsディレクトリをパスワードで保護してください。

Nginxでは、数行の設定を追加するだけでディレクトリを保護できます:

location /stats {
    auth_basic "アクセス制限";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

アーカイブされたログの分析

サーバーはlogrotateを使用して、古いログを.gzファイルに圧縮します。過去数時間だけでなく、過去1週間のトラフィックを確認したい場合は、アーカイブされたファイルをGoAccessにパイプで渡します。

zcat -f /var/log/nginx/access.log* | goaccess -o /var/www/html/stats/index.html --log-format=COMBINED --real-time-html

ここでは-fフラグが便利です。これにより、zcatは圧縮された.gzファイルとプレーンテキストの現在のログを同時に処理するようになります。

最後に

GoAccessは、システム管理者にとって軽量かつ強力なツールです。大規模なデータスイートのような複雑さを伴わずに、ウェブトラフィックを即座に可視化できます。午前3時に502 Bad Gatewayエラーの原因を突き止める際も、クライアントに月次の成長トレンドを示す際も、データは常に読みやすく、準備が整っています。

まずはテストサーバーにインストールしてみてください。数千リクエスト/秒を最小限のCPU負荷で処理する様子を見れば、本番環境のツールキットに欠かせない存在になるはずです。

Share: