LNMPスタック完全ガイド:Nginx・MySQL/MariaDB・PHP-FPMの導入と最適化

概要 — LNMPとは何か

LNMPは、Linux(L),Nginx(N),MySQL/MariaDB(M),PHP(P)で構成されるWebサーバースタックの総称です。従来のLAMP(Apache)と比べて、Nginxのイベント駆動型アーキテクチャにより高い同時接続処理能力を持ち、リバースプロキシやロードバランサとしても優れています。PHPは通常PHP-FPM(FastCGI Process Manager)で動作させ、MySQLの代わりに互換性の高いMariaDBを使うことも一般的です。

各コンポーネントの役割詳細

  • Linux:基盤OS。Ubuntu、Debian、CentOS、Rocky Linuxなどが採用されます。パッケージ管理(apt/yum/dnf)やsystemd、ネットワーク、カーネルパラメータが運用に影響します。

  • Nginx:リバースプロキシ/HTTPサーバ。イベント駆動で低メモリ・高スループットが特徴。静的配信、TLS終端、ロードバランス、FastCGIプロキシとして使用します。

  • MySQL / MariaDB:RDBMS。トランザクション処理にはInnoDBが標準。MariaDBはフォークで互換性・機能差があります。運用に応じてレプリケーションやクラスタ化を検討します。

  • PHP-FPM:PHPのFastCGI実装。プロセスマネージャによってワーカープロセスを管理し、NginxからFastCGI経由でリクエストを受けます。プール設定でプロセス数やユーザ、ソケット/TCPの指定を行います。

LNMPのリクエストフロー

クライアント→Nginx(TLS終端、静的配信、キャッシュ判定)→FastCGI(php-fpm)→アプリケーション(WordPress等)→DB(MySQL/MariaDB)。Nginxでキャッシュやgzip/Brotli圧縮、HTTPヘッダを制御し、バックエンド負荷を低減します。

導入の基本手順(高レベル)

  • OS選定(Ubuntu LTS/Debian/CentOS系)と初期セキュリティ設定(ファイアウォール、ユーザ管理)

  • Nginxインストール(公式リポジトリ推奨、mainline/stableを選択)

  • PHP-FPMインストール(PHP 8系を推奨)。必要な拡張(pdo_mysql, mbstring, opcache など)を追加

  • MySQLまたはMariaDBインストール。初期rootパスワード設定、bind-addressやリモート接続制限

  • Nginxでserver blockを作成し、php-fpmへfastcgi_passで接続。TLSはLet's Encryptで自動更新

よく使うNginx設定例(サンプル)

下記は基本的なserverブロックの例です(Unixソケット使用)。

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com/public;

    index index.php index.html index.htm;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

PHP-FPMのポイント

  • プール設定(/etc/php/*/fpm/pool.d/*.conf)でpm = dynamic/static/ondemand を選択。動的なサイトは dynamic、メモリ節約が重要なら ondemand を検討します。

  • pm.max_children は利用可能メモリと1プロセス当たりメモリ量を基に計算。過小はスループット低下、過大はスワップによる性能劣化を招きます。

  • opcache 有効化はPHPアプリの性能向上に有効。opcache.memory_consumption や revalidate_freq を適切に設定します。

MySQL/MariaDBのチューニング要点

  • innodb_buffer_pool_size:専用DBサーバでは物理メモリの70〜80%を目安に設定(複合用途のサーバは調整)。

  • max_connections はアプリの同時DB接続数に合わせる。ただし高値にするとメモリ消費が増える。

  • Query CacheはMySQL 8で削除されているため、最新バージョンでは使わない。キャッシュはアプリレイヤ(Redis等)や運用設計で実現。

  • スロークエリログを有効化して遅いクエリを特定。explain でインデックス最適化を行う。

パフォーマンス最適化の実践技術

  • Nginx:worker_processes auto、worker_connections は適切に設定。sendfile、tcp_nopush、tcp_nodelay 有効化でIO効率改善。

  • 圧縮:gzip あるいは Brotli を利用。Brotliは静的コンテンツに効果的。

  • キャッシュ:Nginxのfastcgi_cache や proxy_cache、あるいは外部にVarnish/Redisを導入。WordPress等はオブジェクトキャッシュを有効化。

  • TLS:Let's Encryptで自動更新し、HTTP/2を有効化。HTTP/3はNginxのビルドやバージョンによる対応状況を確認。

セキュリティ運用上の注意

  • OSとパッケージは定期的にアップデートし、サポート期間のあるバージョンを使用。

  • ファイアウォール(ufw、firewalld)で不要ポートを閉じる。SSHは鍵認証、rootログイン禁止。

  • MySQLはrootのリモート接続を無効化し、必要なアクセスにのみアカウントを発行。権限は最小権限の原則。

  • NginxではTLS設定を最新の暗号スイートやプロトコルに合わせ、古い弱い設定を無効化。OCSP stapling、HSTSの利用も検討。

  • SELinux/AppArmorのポリシーを確認。誤設定でphp-fpmやNginxからソケットやディレクトリへアクセスできなくなることがある。

可用性とスケーラビリティ

スケールアウト:フロントにロードバランサ(Nginx cluster、HAProxy、クラウドLB)、アプリ層を複数台にし、セッションはステートレス化 or Redisで共有。DBはレプリケーション(Master-Slave)やGaleraクラスタ、ProxySQLなどで読み取り分散やフェイルオーバーを実現します。バックアップとフェイルオーバーテストは必須です。

運用と監視

  • ログ監視:Nginxのaccess/error、php-fpmログ、MySQLのエラーログとスロークエリログを収集。

  • メトリクス収集:Prometheus + Grafana、Percona Monitoring and Management、Datadog等を利用し、レスポンス時間、CPU/メモリ、接続数、クエリ遅延を可視化。

  • 定期的な負荷試験と障害シミュレーションでボトルネックを特定。

コンテナ化・クラウド化の考え方

DockerやKubernetesでLNMPを構築するケースが増えています。公式イメージ(nginx, php, mariadb/mysql)を利用すれば環境の再現性が高まりますが、ストレージ(永続ボリューム)、ネットワーク、秘密情報管理、リソース上限の設定に注意が必要です。クラウドではマネージドDB(RDS、Cloud SQL等)を利用して運用負荷を下げる選択肢も有効です。

トラブルシューティング・FAQ

  • 502 Bad Gateway:php-fpmが落ちている、ソケットパスが間違っている、ファイル権限が原因であることが多い。systemctl status php*-fpm を確認。

  • 504 Gateway Timeout:バックエンド処理が長時間かかっている。fastcgi_read_timeout を一時的に延長し、原因のクエリや処理を最適化。

  • 高メモリ消費:php-fpm のpm設定や個々のPHPスクリプトのメモリリークを疑う。opcache設定や不必要な拡張の削除も有効。

導入チェックリスト

  • OSとパッケージのサポート期限を確認

  • php-fpm のプロセス数・メモリ計算

  • MySQLのinnodb_buffer_pool_size 設定

  • NginxでTLS、HTTP/2、gzip/Brotli、キャッシュ設定

  • バックアップスケジュールとリストア手順の検証

  • 監視・アラート設定の導入

まとめ

LNMPは高性能・高効率なWebスタックの基本形であり、Nginxの非同期処理、PHP-FPMの柔軟なプロセスマネジメント、MySQL/MariaDBの堅牢なストレージが組み合わさることで、多様なWebアプリケーションに適応します。導入時はパラメータチューニング、セキュリティ対策、運用監視をセットで設計することが成功の鍵です。

参考文献