LNMP(Nginx+PHP‑FPM+MySQL/MariaDB)完全ガイド:構成・設定・パフォーマンス最適化と運用のポイント

LNMPとは — 概要と特徴

LNMPは、Webサーバー構成の一つで、Linux(L)、Nginx(N)、MySQL/MariaDB(M)、PHP(P)の頭文字を取った略称です。動的サイトやCMS(例:WordPress)を高効率に動かすために広く使われており、特にNginxの軽量で高同時接続に強い特性と、PHP-FPM(FastCGI Process Manager)を組み合わせることで、リクエスト処理のスケーラビリティとパフォーマンスを向上させます。

各コンポーネントの役割

  • Linux:OS。セキュリティ、ファイルシステム、プロセスマネジメント、パッケージ管理などの土台。
  • Nginx:静的ファイル配信、リバースプロキシ、ロードバランサ、TLS終端などを担うWebサーバ/プロキシ。
  • MySQL / MariaDB:リレーショナルデータベース。アプリケーションのデータ保存・クエリ処理を行う。MariaDBはMySQL互換のフォークで、多くのディストリで採用されている。
  • PHP(PHP-FPM):動的コンテンツを生成する言語処理系。PHP-FPMはFastCGIでPHPをプロセス化してNginxと連携するための仕組みで、プロセスマネジメントや設定の柔軟性を提供する。

LAMPとの比較

LAMP(Linux, Apache, MySQL, PHP)は歴史的に広く使われてきました。LNMPはNginxを採用する点が異なります。Nginxはイベント駆動型で低メモリかつ高い同時接続性を持つため、静的コンテンツ配信や大量接続時のレスポンス性能で有利です。一方、Apacheはモジュール豊富で.htaccessなどディレクトリ単位の設定が容易という利点があります。用途に応じて選択しますが、近年では高トラフィック環境でLNMPが好まれるケースが多いです。

基本的なアーキテクチャ(流れ)

  • クライアント(ブラウザ)→ Nginx(リバースプロキシ、TLS終端、静的ファイル処理)
  • 動的リクエスト→ Nginx が FastCGI (unix ソケットまたは TCP) 経由で PHP-FPM に転送
  • PHP-FPM がアプリ(例:WordPress)を実行し、必要に応じて MySQL/MariaDB にクエリを投げる
  • DBからの結果を受け取って HTML を組み立て、Nginx 経由でクライアントに返却

導入・設定のポイント(概要)

主要なポイントは以下です。各ディストリビューションでパッケージ名やパスが異なるので注意してください。

  • PHP-FPMはUNIXドメインソケット(例:/run/php/php7.4-fpm.sock)かTCP(127.0.0.1:9000)のどちらかでNginxと接続する。UNIXソケットは少し高速でセキュアだが、権限管理に注意。
  • Nginxのserverブロックで静的ファイルは直接処理し、PHPファイルのみfastcgiで渡す(try_filesでの安全なルーティング)。
  • MySQLはbind-addressの設定やrootユーザーのリモートアクセス制限、mysql_secure_installationの実行など基本的なハードニングを行う。

サンプル(最小限のNginxサーバブロック)

WordPress等を動かす際の代表的な設定例(抜粋):

<?php ?>等は使わず、以下のように設定します(実際のファイルでは<と>を記述)。

<pre>server {
listen 80;
server_name example.com;
root /var/www/example.com/public;
index index.php index.html;

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}

location ~* \.(jpg|jpeg|png|gif|css|js|webp)$ {
expires 30d;
access_log off;
}
}</pre>

PHP-FPMの基本設定例(プール)

pool設定(例 /etc/php/7.4/fpm/pool.d/www.conf)の重要項目:

  • listen = /run/php/php7.4-fpm.sock(または 127.0.0.1:9000)
  • user / group = www-data(Webサーバと合わせる)
  • pm = dynamic(dynamic/static/ondemand)
  • pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers — リソースに合わせて調整

パフォーマンス向上のポイント

  • OPcacheを有効化してPHPの実行を高速化する。
  • FastCGIキャッシュ(Nginxのproxy_cache / fastcgi_cache)を使って動的生成の負荷を軽減する。
  • gzip圧縮、ブラウザキャッシュ、HTTP/2(TLS有効時)やTLS設定の最適化で通信効率を改善する。
  • DB負荷はクエリ最適化、インデックス適用、スロークエリログの解析で改善する。必要に応じてクエリキャッシュ(MySQLでは非推奨のため代替でRedisやアプリ側のキャッシュを検討)や読み取りレプリカを導入する。
  • セッションストレージやオブジェクトキャッシュにはRedis/Memcachedを使い、DBアクセスを減らす。

セキュリティと運用の注意点

  • サーバは定期的にOSやパッケージのアップデートを行う(セキュリティパッチ適用)。
  • ファイアウォール(UFW/iptables/nftables)で不要なポートを閉じる。MySQLは原則ローカルアクセスのみ(bind-address=127.0.0.1)にする。
  • Let's Encrypt等でTLSを導入し、HSTSや安全なサイファーを設定する。
  • PHPの設定でdisplay_errorsをオフにし、エラーログは適切にローテートする。
  • ファイル・ディレクトリの権限は最小権限の原則で設定。アップロードディレクトリに実行権限を付与しない等。
  • MySQLのrootアカウントは強力なパスワードにし、不要なユーザーや権限は削除する。mysql_secure_installationを実行する。

スケーリングと高可用性

  • 読み取り負荷が高い場合はDBの読み取りレプリカを追加。
  • アプリ層はステートレス化して複数台化、Nginxやロードバランサ(HAProxy、AWS ELBなど)で負荷分散。
  • セッション管理はRedis等外部に置くことで水平スケールを容易にする。
  • DBの高可用化にはマスター/スレーブ、クラスタ(MySQL Group Replication、Galera Cluster、MariaDB Galera)や、CloudのマネージドDBを検討。

監視・ログ・バックアップ

  • 監視:Nginxステータス(stub_status)、PHP-FPMのstatusページ、MySQLの監視(Percona Monitoring、Prometheus exporter等)を導入し、レスポンス時間・接続数・負荷を可視化する。
  • ログ:アクセスログ、エラーログ、DBのスロークエリログを有効にして分析。ログローテーションを設定する。
  • バックアップ:論理バックアップ(mysqldump)と物理バックアップ(Percona XtraBackup)を用途に応じて使い分け、定期バックアップと復旧手順を必ず検証する。バイナリログでPoint-in-Timeリカバリ(PITR)を可能にする。

よくあるトラブルと対処法

  • 502 Bad Gateway:PHP-FPMが停止している、ソケットの権限不整合、PHP-FPMが過負荷で応答できない等が原因。PHP-FPMログとNginxエラーログを確認。
  • 504 Gateway Timeout:バックエンド処理(DBクエリや外部API)が遅い。Nginxのタイムアウト値、PHPの実行時間、DBのスロークエリを点検。
  • DB接続エラー:認証情報、接続先(socket/tcp)、max_connections超過、ユーザ権限の確認。
  • パフォーマンス低下:OPcache無効、I/O待ち、インデックス欠如、メモリ不足などを疑い、プロファイリング/モニタリングで原因特定。

導入時のチェックリスト(簡易)

  • OS・パッケージのバージョンを決める(LTS推奨)。
  • Nginx, PHP, MySQL/MariaDBのバージョン互換性を確認。
  • PHP-FPMのプール設定とNginxのfastcgi_passを一致させる。
  • ファイル/ディレクトリの所有者と権限を設計する。
  • TLS、ファイアウォール、ログローテーション、バックアップの実装。
  • 監視とアラートの設置(閾値・通知方法の定義)。

まとめ

LNMPは性能と拡張性に優れたWebアーキテクチャで、特に高トラフィック環境やリソース効率を重視する場面で有効です。Nginxのイベント駆動モデルとPHP-FPMのプロセス管理、DBのチューニングを組み合わせることで、WordPressのようなPHPベースのアプリケーションを高いパフォーマンスで運用できます。ただし、セキュリティ、監視、バックアップ、適切なチューニングが欠かせません。導入前には動作検証と運用設計(スケール方針、HA設計、復旧手順)の準備を行いましょう。

参考文献