LEMPスタック完全ガイド:Nginx・MariaDB・PHP-FPMで構築・運用するベストプラクティス

LEMPスタックとは

LEMPスタックは、Linux(L)、Nginx(E: Engine-X)、MySQL/MariaDB(M)、PHP(P)の組み合わせによるWebサーバ環境を指す用語です。Apacheを用いるLAMPスタックに対して、NginxとPHP-FPM(FastCGI Process Manager)を組み合わせることで高い同時接続性能と効率的なリソース利用を実現します。近年はMySQLのフォークであるMariaDBやPercona Serverを用いるケースも多く、柔軟な選択が可能です。

各コンポーネントの役割と選定ポイント

  • Linux:サーバOS。ディストリビューション(Ubuntu、CentOS/RHEL、Debianなど)選定はパッケージ管理、長期サポート、セキュリティポリシーに依存します。コンテナ化(Docker)やクラウド(AWS/GCP/Azure)での運用も一般的です。

  • Nginx:リバースプロキシ兼Webサーバ。イベント駆動モデルにより高い同時接続処理能力を持ち、静的コンテンツ配信やTLS終端、ロードバランシングに適します。設定はシンプルだが、正しいupstream、プロキシやFastCGIのバッファ設定が性能に直結します。

  • MySQL / MariaDB:関係データベース。トランザクション処理や複雑なクエリを扱います。MariaDBは互換性に加え機能拡張があり、Perconaは高負荷環境向けの拡張や監視が充実しています。ストレージエンジン(InnoDB等)のチューニングが重要です。

  • PHP-FPM:PHPの実行環境。FastCGIプロトコルでNginxと連携し、プロセスマネージャによるプロセスプールでリクエストを処理します。pm設定(dynamic/static/ondemand)、max_childrenなどを適切に設定することがアプリケーションの安定稼働に不可欠です。

基本的な構築手順(概要)

  • OSの選定と初期ハードニング(SSH鍵認証、不要サービスの停止、タイムゾーン・ロケール設定)。

  • Nginxのインストールと基本設定(serverブロック、TLS設定、gzip、HTTP/2の有効化)。

  • データベースのインストールと初期設定(ユーザー・権限の最小化、必要な設定値の調整、バックアップ設定)。

  • PHPとPHP-FPMのインストール。php.iniとwww.conf(プール設定)の調整、必須拡張(PDO、mbstring、openssl等)の導入。

  • アプリケーションの配置と権限設定、SELinux/AppArmorポリシーの確認、動作確認。

  • 監視・ログ管理(アクセスログ/エラーログのローテート、メトリクス収集)と定期バックアップの導入。

パフォーマンスチューニングの主要ポイント

  • Nginx:worker_processesはCPUコア数を基本に、worker_connectionsで同時接続数を調整。sendfile/tcp_nopush/keepalive_timeout/gzipの有効化や、fastcgi_buffers、fastcgi_cacheなどの利用で静的・動的共に性能向上が図れます。TLS設定では優先する暗号スイートやOCSP stapling、TLS 1.3の活用で遅延削減が可能です。

  • PHP-FPM:opcacheは有効化必須。pm設定(pm.max_children, pm.start_servers, pm.min/max_spare_servers または ondemand の閾値)はメモリとリクエストパターンに合わせて調整します。長時間実行のスクリプトやブロッキング処理は別ワーカーやジョブキューへ移行すること。

  • DB:innodb_buffer_pool_sizeを物理メモリの60〜80%程度(DB専用サーバの場合)に設定。スロークエリログを有効化し、インデックス最適化やクエリリライトで負荷を下げます。接続プールの導入や適切なmax_connections設定も重要です。

  • キャッシュ戦略:フロントにCDN、アプリ側でRedis/Memcachedを導入し、DB負荷を削減。Nginxのfastcgi_cacheやproxy_cacheも効果的です。キャッシュの有効期限設計とキャッシュ破棄ポリシー(キャッシュインバリデーション)を明確に。

セキュリティ上の考慮点

  • HTTPS強制と証明書管理:Let's Encryptなどで自動更新を導入し、TLSは最新のベストプラクティスに従って設定(TLS 1.2+/1.3推奨、脆弱な暗号スイートは無効)。HSTSやTLSセッション再利用も検討します。

  • PHP保護:不要な関数の無効化(exec, system等)、display_errorsの無効化、適切なopen_basedirやファイルアップロード制限。コード側では入力バリデーション、CSRF対策、SQLインジェクションの防止(プリペアドステートメント)を徹底。

  • OSレベルの防御:ファイアウォール(iptables/nftables/ufw)、Fail2banでブルートフォース防止。SELinux/AppArmorを有効化しポリシーでプロセス隔離。ログ監査と脆弱性アラートの導入。

  • 権限と分離:Webコンテンツは最小権限で配置、データベースはアプリごとに専用ユーザーと最小権限を割り当て。管理インターフェースはアクセス制限(IP制限・2要素認証)を実施。

可用性・スケーリング戦略

  • 水平スケール:Nginxをロードバランサーとして複数のアプリサーバに振る。セッションはステートレス化(クッキー+サーバ側ストア/Redis)してスケーリングを容易に。

  • データベースのスケール:リードレプリカで読み取り負荷を分散。高可用性が必要ならGalera ClusterやMySQL Group Replication、プロキシ(ProxySQL)を組み合わせる。重要なのは整合性要件とスキーマ設計。

  • フェイルオーバーとバックアップ:自動フェイルオーバー(MHA、Orchestrator等)や定期的な物理・論理バックアップ(mysqldump、xtrabackup)を設定。バックアップのリストア手順は定期的に検証すること。

運用と監視

  • ログとメトリクス:Nginxのアクセス・エラーログ、PHP-FPMのslowlog、DBのスロークエリを収集。Prometheus+Grafana、Elasticsearch/Kibana、Datadogなどで可視化とアラート設定を行います。

  • デプロイとCI/CD:コードの自動テスト、ステージング環境での検証、ロールアウト時のブルーグリーンやカナリアデプロイでリスクを低減します。マイグレーションはバージョン管理(Flyway、Liquibase等)で追跡。

  • パッチと脆弱性管理:OS・ミドルウェア・ライブラリの定期的なパッチ適用。重大な脆弱性が見つかった場合の影響範囲評価と緊急対応手順を用意します。

導入時によくある落とし穴と回避法

  • デフォルト設定のまま運用してメモリ不足やスレッド枯渇を起こすケース。ベンチマークと負荷試験で適切なパラメータを決定すること。

  • ログローテートが未設定でディスクが埋まる問題。logrotateやクラウドのログサービスへ送る設計を行う。

  • セキュリティ設定の不備(パーミッション、公開鍵/秘密鍵の管理)。最小権限の原則を守り、機密情報はVault等で管理。

  • スケーリングできないアプリ設計。セッションやファイルストレージのステートフルな設計はスケールの障壁になるため外部化する。

まとめ

LEMPスタックは、高い並列処理性能と柔軟な運用を両立できる成熟した構成です。重要なのは単にソフトウェアを組み合わせることではなく、負荷特性に合わせたチューニング、セキュリティ対策、監視・バックアップ体制を含めた運用設計です。小さく始めて、計測と改善を繰り返すことで、コストと性能のバランスが取れた安定したサービス基盤を構築できます。

参考文献