こんにちは!インフラの現場を支えるエンジニアの皆さん、日々の運用お疲れ様です。
監視システムの王様「Zabbix」。ホスト数が数百台から数千台、そして数万台へとスケールしていくにつれて、こんな恐怖の瞬間に出会ったことはありませんか?
- 「朝に出社してダッシュボードを開いたら、クルクルとローディングアイコンが回り続けて一向に表示されない……」
- 「障害アラートが鳴り響いているのに、Zabbixの画面が重すぎて原因のホストにたどり着けない……!」
これを放置すると、いざという時の初動が遅れ、システムの信頼性が大きく揺らぎます。「ZabbixのUIが重いのは、機能が多いから仕方ない」なんて諦めていませんか? それ、大きな誤解です。
実は、Zabbixフロントエンドの背後にある Nginx と PHP-FPM、そして データベース(DB)連携 のツボを正しく押さえてチューニングするだけで、WebUIは見違えるほど軽快になります。今回は、大規模環境でもサクサク動くZabbixフロントエンドを作り上げるための「極限のチューニング手法」を、優しく丁寧に紐解いていきます。
これをマスターすれば、毎日の作業が劇的に楽になりますよ!一緒にその核心に迫っていきましょう。
—
なぜ大規模環境でZabbixのWebUIは重くなるのか?
まず、敵を知ることから始めましょう。Zabbixのアーキテクチャを思い出してください。
[ ブラウザ ]
↓ (HTTP/HTTPS)
[ Nginx ]
↓ (FastCGI)
[ PHP-FPM (フロントエンドのPHPコードを実行) ]
↓ (SQLクエリ)
[ データベース (MySQL / PostgreSQL) ]
監視対象(ホスト)が増えると何が起きるか?
1. DB内のデータ量が爆発的に増える(ヒストリ、トレンド、イベントなど)。
2. WebUIでダッシュボードやホスト一覧を開いた際、PHPが膨大で複雑なSQLクエリをDBに発行する。
3. その結果、PHPの処理に時間がかかり、メモリを大量消費する。
4. 同時アクセスが多いとPHP-FPMのプロセスが枯渇し、Nginxとの間でリクエストが渋滞を起こす。
つまり、WebUIの遅延の本質は「PHPとWebサーバの交通渋滞」なのです。ここを最適化していきます。
—
チューニングの3大ステップ
今回の最適化は以下の3ステップで進めます。
1. Nginxの最適化:入り口の門番を効率化し、同時接続をさばく
2. PHP-FPMの最適化:PHPの処理能力を限界まで引き出し、メモリ枯渇を防ぐ
3. Zabbixフロントエンド・セッションの最適化:無駄なDBアクセスを減らす
—
ステップ1:Nginxの最適化(入り口の交通整理)
Nginxは非常に軽量で高速なWebサーバですが、デフォルト設定のままでは大規模環境のトラフィックやKeep-Aliveの負荷に対応しきれません。`/etc/nginx/nginx.conf` を次のようにチューニングします。
user nginx;
サーバのCPUコア数に合わせてワーカープロセス数を自動決定(例: 4コアならautoで4つ)
worker_processes auto;
1つのワーカーがオープンできるファイル数の上限(OSのlimitsも合わせて変更すること)
worker_rlimit_nofile 65535;
events {
# 1つのワーカーが同時に処理できる接続数
worker_connections 10240;
# Linuxの場合はepollを使用し、効率的にイベントを処理
use epoll;
# 複数のワーカーで新しい接続を順番に受け付ける
accept_mutex on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# アクセスログの最適化(I/O負荷を下げるため、バッファリングを有効にするか、不要ならオフに)
access_log /var/log/nginx/access.log combined buffer=32k flush=5s;
error_log /var/log/nginx/error.log warn;
# パフォーマンス向上のための基本設定
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Keep-Aliveのタイムアウトを適切に設定し、コネクションの使い回しを促進
keepalive_timeout 65;
keepalive_requests 100;
# クライアントからのリクエストボディの最大サイズ(大規模テンプレートのインポート等で必要)
client_max_body_size 64M;
# Gzip圧縮の有効化(Zabbixの重いHTMLやJS/CSSを圧縮して転送量を削減)
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/.conf;
}
ここがポイント:
`worker_processes auto` と `worker_connections 10240` により、数千人規模のユーザーが同時にアクセスしても、Nginxがボトルネックになることはなくなります。
—
ステップ2:PHP-FPMの最適化(エンジンルームの馬力アップ)
ZabbixのWebUI(PHP製)を支える心臓部が PHP-FPM です。ここがデフォルトの「オンデマンド(ondemand)」や「シンクロナス」な設定のままだと、リクエストが来た瞬間にプロセスが足りずにフリーズします。
`/etc/php-fpm.d/www.conf`(環境によってパスが異なります)を開き、プロセス管理方式を `dynamic` または `static` に変更し、メモリ制限を見直します。
[www]
user = apache
group = apache
; 【重要】大規模環境では static(常に一定数を保持)または dynamic を推奨
pm = dynamic
; 同時に起動できる最大の子プロセス数
pm.max_children = 120
; サーバ起動時に常に立ち上げておく子プロセスの数
pm.start_servers = 30
; アイドル状態の最小子プロセス数
pm.min_spare_servers = 20
; アイドル状態の最大子プロセス数
pm.max_spare_servers = 40
; 1つのプロセスが処理できる最大リクエスト数(メモリリーク対策として非常に重要!)
pm.max_requests = 500
; PHPスクリプトの実行制限時間(大きなレポート出力などでタイムアウトしないよう長めに)
request_terminate_timeout = 300
さらに、PHP自体のメモリ制限 (`php.ini`) も必ず引き上げましょう。Zabbixのフロントエンドは、大量のホスト情報をメモリ上で展開するため、デフォルトの128MBではすぐに `Allowed memory size exhausted` エラーで沈没します。
`/etc/php.ini` の設定:
; メモリ制限を最低でも 512M(できれば 1G)に設定
memory_limit = 512M
; タイムアウトやポストサイズの拡張
max_execution_time = 300
max_input_time = 300
post_max_size = 64M
upload_max_filesize = 64M
; タイムゾーンの明示(Zabbixの必須要件)
date.timezone = Asia/Tokyo
ここがポイント:
`pm.max_requests = 500` は隠れた名設定です。PHPの古いバージョンのわずかなメモリリークも、定期的にプロセスを再起動させることで蓄積を防ぎ、長期安定稼働を実現します。
—
ステップ3:Zabbixフロントエンド・セッションの最適化
意外と見落としがちなのが、Zabbixが使用する「セッション情報」の保存先です。デフォルトではファイルのセッション(`/var/lib/php/session` など)が使われますが、アクセス数が増えるとディスクI/Oがボトルネックになり、画面遷移のたびにモタつきます。
これを Redis や Memcached などのインメモリキャッシュ、あるいは データベースの専用テーブル に逃がすことで、セッション処理のオーバーヘッドを劇的に削減できます。
ここでは、最も手軽で効果が高い PHPのセッションハンドラを Memcached / Redis に変更するアプローチ、あるいは Zabbix の設定ファイル(`zabbix.conf.php`)での調整を見てみましょう。
Zabbixの設定ファイル `/etc/zabbix/web/zabbix.conf.php` には、データベース接続だけでなく、パフォーマンスに関わる重要なパラメータを追加できます。
チューニング後の動作確認と効果測定
設定を変更したら、必ずサービスを再起動して反映させます。
設定の構文チェックと再起動
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl restart php-fpm
精度高い「HelloWorld」的チェック
正しくチューニングが効いているか、以下の手順で確認しましょう。
1. WebUIのログイン速度測定:ブラウザの開発者ツール(F12)を開き、「ネットワーク」タブを見ながらZabbixにログインします。トップページのHTMLドキュメント(`index.php`)の読み込み時間が 200ms以下 になっていれば合格点です。
2. PHP-FPMプロセスの状態確認:
以下のコマンドで、PHP-FPMがきちんとリクエストをさばいているか確認します。
ps aux | grep php-fpm
プロセスが枯渇してゾンビ化していないか、メモリを食いつぶしていないかを監視しましょう。
—
現場のプロからのアドバイス
今回紹介したNginxとPHP-FPMのチューニングは、いわば「フロントエンドの詰まり」を取るための特効薬です。
しかし、もしこれを行ってもまだ重い場合は、データベース自体のインデックス不足や、ヒストリデータの溜まりすぎ(ハウスキーパーの追いつき不足)が疑われます。その時は、DBサーバ側の `innodb_buffer_pool_size` の見直しや、不要なヒストリの保存期間の短縮を検討してください。
オブザーバビリティの基本は「監視システム自身が健全であること」です。重い監視画面にイライラする日々とは今日でお別れし、いつでもスケーラブルで快適なZabbix環境を手に入れてくださいね。
あなたの運用ライフが、より軽快でストレスフリーなものになりますように!