LEMP入門:Nginx+PHP-FPM+MySQLで作る高性能Web環境の構築・設定と最適化ガイド
LEMPとは — 概要
LEMPは、Webアプリケーションを動かすためのソフトウェアスタックの一つで、一般的に「Linux」「Engine X(Nginx)」「MySQL(またはMariaDB)」「PHP」を組み合わせた構成を指します。LAMP(Linux, Apache, MySQL, PHP)の派生で、Apacheの代わりに高性能で軽量なWebサーバであるNginxを用いる点が特徴です。動的なPHPアプリケーション(WordPress、Drupal、Laravelなど)を効率よく配信するために広く使われています。
各コンポーネントの役割
- Linux: OS(例: Ubuntu、Debian、CentOS、Rocky、Alma)。プロセス管理、ネットワーク、ストレージ、セキュリティなど基盤を提供。
- Nginx(Engine X): 高速なHTTPサーバ・リバースプロキシ。イベント駆動で少ないリソースで多数の接続を捌けるため、静的コンテンツの配信やリバースプロキシとしての役割に優れる。
- MySQL / MariaDB: リレーショナルデータベース管理システム。データ永続化、トランザクション、レプリケーション、バックアップなどを担う。MariaDBはMySQLの互換実装で、多くのディストリビューションで採用されている。
- PHP(PHP-FPM): サーバサイドのスクリプト言語。PHP-FPMはFastCGI Process Managerで、NginxからFastCGI経由でPHP処理を効率よく分散・管理するためのプロセスマネージャ。
なぜNginxを選ぶのか
Nginxはイベント駆動のアーキテクチャにより、同時接続数が多い環境でもメモリやスレッドの消費を抑えられます。以下のような利点があります。
- リバースプロキシやロードバランサとしての性能が高い
- 静的ファイルの配信が高速
- 設定によるキャッシュ(proxy_cache、FastCGIキャッシュ)や圧縮、TLS終端などが柔軟に行える
- コンフィグが比較的シンプルで拡張可能
基本的な動作フロー
典型的なLEMPのリクエストフローは以下の通りです。
- クライアントがWebリクエスト(HTTP/HTTPS)を送る
- Nginxがリクエストを受け取り、静的ファイルなら直接応答する
- 動的処理(PHP)が必要な場合、NginxはFastCGI(通常はUNIXソケットかTCP)経由でPHP-FPMにリクエストを渡す
- PHP-FPMがスクリプトを実行し、結果をNginxに返す
- Nginxがクライアントにレスポンスを返す
- データ操作があればPHPからMySQL/MariaDBに接続してクエリを実行する
代表的な設定例(簡易)
WordPress等を動かす際の最小構成サンプル(抜粋)です。実環境ではセキュリティや最適化の追加が必要です。
<server>
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # PHPバージョンに合わせる
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* \.(css|js|jpg|jpeg|png|gif|svg|ico)$ {
expires 30d;
access_log off;
}
</server>
PHP-FPMのプール設定例(/etc/php/7.4/fpm/pool.d/www.confの抜粋):
[www] user = www-data group = www-data listen = /var/run/php/php7.4-fpm.sock pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35
パフォーマンス最適化のポイント
- PHP: PHP-FPMのpm設定をワークロード(CPU・メモリ)に合わせて調整。OPcacheを有効にしてコードの再コンパイルを抑制。
- Nginx: gzip/Brotli圧縮、sendfile、tcp_nopush、keepalive_timeout等のチューニング。FastCGIキャッシュやproxy_cacheで動的ページのキャッシュを利用。
- DB: 適切なインデックス設計、クエリチューニング、接続プールの検討。InnoDBの設定(innodb_buffer_pool_size等)をメモリに合わせる。
- キャッシュ層: RedisやMemcachedでセッションやキャッシュをオフロード。
- CDNの利用: 静的アセットをCDNに置くことで負荷軽減と配信の高速化。
スケーリングと高可用性
単一サーバで始めることが多いですが、負荷や可用性の要件に応じて横方向にスケールできます。
- ロードバランサ(NginxやHAProxy)を前段に置き、複数のアプリケーションサーバ(Nginx+PHP-FPM)へ振り分け
- データベースはマスター・スレーブ(レプリケーション)やクラスタ(Galera、MySQL Group Replicationなど)で冗長化
- ステートフルな情報(セッション)はRedisなど外部ストアへ移行してスケールを容易にする
- フェイルオーバー: Keepalived等でIPフェイルオーバー、またはクラウドのロードバランサを利用
セキュリティの考慮点
- TLS/HTTPSを常時有効にし、Let's Encryptで自動更新を行う。
- HTTPヘッダー(HSTS、Content-Security-Policy、X-Frame-Options等)の適切な設定。
- 不要な情報開示を避ける(Nginxのserver_tokens off、PHPのdisplay_errors off)。
- OSパッチの適用、不要パッケージの削除、最小権限のユーザ実行。
- ファイアウォール(ufw、firewalld、iptables)で不要なポートを閉鎖。
- Fail2ban等でブルートフォース対策。SELinux/AppArmorでプロセス制限を強化する。
- データベースのバックアップと暗号化、アクセス制御(最小権限のDBユーザ)。
運用・監視
長期運用ではログ、メトリクス、アラートが重要です。
- ログ: Nginxのaccess/errorログ、PHP-FPMログ、MySQLログを収集し、logrotateで管理
- メトリクス: Prometheus + GrafanaでNginx、PHP-FPM、MySQLのメトリクスを可視化
- Apm: New RelicやDatadogでアプリケーションレベルのパフォーマンスを監視
- 障害対策: 自動復旧(systemd、プロセスマネージャ、監視による再起動)や手順書の整備
コンテナ化とクラウド
最近ではDockerやKubernetes上でLEMPコンポーネントを分離して運用するケースが増えています。代表的な構成は以下。
- nginxコンテナをリバースプロキシとして稼働
- php-fpmは別コンテナで実行(UNIXソケットは使えないためTCPでFastCGI接続)
- データベースはマネージドDBサービス(RDS、Cloud SQL等)やステートフルセットで実行
- KubernetesではIngressやServiceでロードバランシング、ConfigMap/Secretで設定管理
よくあるトラブルと対処法
- 502 Bad Gateway: NginxとPHP-FPM間の接続(ソケットパスやポート)が合っているか、PHP-FPMが稼働しているかを確認。
- タイムアウトや高負荷: PHP-FPMのpm設定、MySQLクエリ、外部API待ちの処理を確認。
- ファイルアクセス権問題: webユーザ(例: www-data)とファイル所有権、ディレクトリのパーミッションを確認。
- セッション損失: 複数サーバでセッションをファイルに保存している場合はRedis等に移行。
まとめ
LEMPは高性能で比較的軽量にWebアプリケーションを運用できるスタックです。Nginxの高い同時接続性能とPHP-FPMの柔軟なプロセスマネジメントを組み合わせることで、WordPressなどの一般的なPHPアプリケーションを効率よく動かせます。ただし、実運用ではDBチューニング、キャッシュ、HTTPS、監視、バックアップ、セキュリティ対策などを適切に設計・運用することが不可欠です。最近はコンテナやマネージドサービスを取り入れることで運用負荷を下げつつスケールする選択肢も増えています。
参考文献
- Nginx — Official website
- PHP: Hypertext Preprocessor — php.net
- MySQL — Official website
- MariaDB — Official website
- Let's Encrypt — Free SSL/TLS Certificates
- OWASP — Web Application Security Resources
- Docker Documentation
- Kubernetes — Production-Grade Container Orchestration
- DigitalOcean Community Tutorials — 様々なLEMPガイド


