NGINXとPHP-FPMを最適化して高パフォーマンスを実現する方法

CentOS 7 で高負荷 NGINX + PHP-FPM スタックをセットアップして最適化する方法

ウェブスタックを稼働させるのは簡単ですが、高トラフィック時に本当に*高速*に動作させるのは容易ではありません。これは全く別の話です。この設定は、多数の同時訪問者に最小限の遅延でサービスを提供したい場合に最適です。NGINX、PHP-FPMのインストール、負荷に合わせた設定の調整、サーバーのクラッシュ防止など、このガイドでは基本的な事項を網羅しています。より多くのリクエストを難なく処理できる、より高速で無駄のないサーバーが実現します。ピーク時でもサイトの読み込みがこれまで以上に速くなったら、いよいよ楽しい時間です。しかし、そこに到達するには、設定を微調整する必要があります。もちろん、デフォルト設定は通常、高トラフィック向けには設計されていません。—

大量のトラフィックに対してNGINX + PHP-FPMを修正または調整する方法

方法1: NGINXワーカーと接続設定を調整する

設定に入る前に、これがなぜ重要なのかを理解しておくといいでしょう。` worker processes ` と ` connections per worker ` は、サーバーが同時に処理できるリクエストの数を直接制御します。これらの値が低すぎると、訪問者は待機状態になり、高すぎるとサーバーのメモリが不足する可能性があります。まずは ` /etc/nginx/nginx.conf ` を編集してください。上部近くにある主なディレクティブを探します: – nginx worker_processes auto; worker_connections 1024; ここで、`auto` は NGINX に CPU コアを自動検出させます。通常はこれで問題ありません。ただし、サーバーに 4 つのコアがあることがわかっている場合は、明示的に `worker_processes 4;` を設定できます。`worker_connections` を 1024 から 4096 などに増やすと、サーバーがより多くの同時リクエストを処理できるようになります。これは、大量のトラフィックが予想される場合に特に便利です。次に、`http` ブロックで、最適な接続方法とより適切なリクエスト処理を有効にします。 – nginx use epoll; // Linux のパフォーマンスが向上 multi_accept on; // 一度に可能な限り多くを受け入れます tcp_nodelay on; // ネットワーク パケットの遅延を削減 tcp_nopush on; // TCP パケット送信を最適化 保存した後、NGINX を再起動することを忘れないでください。 – ` # systemctl restart nginx` 一部のセットアップでは、nginx がデフォルトのタイムアウトまたは最大ボディ サイズで停止する場合があります。 これを調整するには、次のようにします。 – nginx keepalive_timeout 30; // アイドル キープアライブを閉じる前に 30 秒待機します client_max_body_size 2m; // 必要に応じてアップロード サイズを制限 gzip 圧縮を追加すると、帯域幅が大幅に削減されます。 – nginx gzip on; gzip_types text/plain application/javascript application/json image/svg+xml;変更後、設定を確認して再起動します: – ` # nginx -t && systemctl restart nginx` この設定により、nginx はより多くの接続を受け入れ、データをより高速に送信し、速度を低下させることなく大きなファイルを処理できるようになります。

方法2: 高負荷時にPHP-FPMプール設定を調整する

PHP-FPM は、PHP コードを処理するバックエンドです。デフォルトでは小規模サイト向けに調整されているため、トラフィックが多い場合は、特に ` pm.max_children `、` pm.start_servers `、および関連パラメータの制限を増やす必要があります。 ` /etc/php-fpm.d/www.conf ` を開いて、以下を調整します。 – ini pm = dynamic pm.max_children = 18 // PHP プロセスの最大数 pm.start_servers = 6 // この数のプロセスで開始します pm.min_spare_servers = 4 // これらのプロセスをアイドル状態に保ちます pm.max_spare_servers = 16 // これ以上アイドル状態を維持しません pm.max_requests = 400 // リークを防ぐために、この数のリクエストの後で PHP を再起動します 簡単なヒント: 4 つの CPU コアと 1 GB の RAM を備えたサーバーの場合、18 個の子プロセスから始めるのが適切です。メモリ使用量に注意しながら実験する必要があるかもしれません。PHP が RAM を消費しすぎる場合は、減らしてください。 IPC を高速化するためにソケット設定を変更します: – ini listen = /var/run/php-fpm/php-fpm.sock listen.owner = nginx listen.group = nginx listen.mode = 0660 起動時に PHP-FPM が起動することを確認し、再起動します: – ` # systemctl restart php-fpm` この設定により、PHP はボトルネックを生成せずにリクエストを処理できます。

方法3: 静的ファイルとキャッシュを処理するためにNGINXをカスタマイズする

トラフィックの多いサイトでは、JS、CSS、画像などの静的アセットをキャッシュしてサーバーの負荷を最小限に抑えることで、より効率的に提供することがよくあります。 `/ etc/nginx/nginx.conf`の `http` ブロック内に、次の設定を追加します。 – nginx gzip on; gzip_types application/javascript application/json image/svg+xml; expires max; // 静的コンテンツのキャッシュ有効期限 特定のファイルタイプの場合は、次の設定が必要になる場合があります。 – nginx location ~* \.(js|css|png|jpg|gif|woff|woff2)$ { expires 7d; // 7 日間 cache access_log off; add_header Cache-Control “public”; } 接続タイムアウトとリクエスト制限を設定します。 – nginx keepalive_timeout 30; client_body_timeout 10; send_timeout 2; client_max_body_size 2m; nginx を再起動することを忘れないでください: – ` # systemctl restart nginx` これにより、静的ファイルの繰り返しアクセス時の読み込みが速くなり、PHP-FPM と nginx 自体の負荷が軽減されます。

最後の重要な調整:高負荷時のチューニング

– `worker_processes` をCPUコア数に合わせてください。- `worker_connections` を増やしてください。4096などの値を試してください。- 使用しているRAMに合わせてPHP-FPMの `pm.max_children` を調整してください。- スケーラブルなI/Oを実現するには、`epoll`(BSDの場合は `kqueue`)を使用してください。- サーバーレスポンスを圧縮するには、gzipを有効にしてください。- 静的アセットをキャッシュしてディスクI/Oを削減してください。これらはまさに基礎となるものです。また、サーバーのリソース使用状況を定期的に監視し(`htop`、`top`、または `vmstat` を使用)、何が負荷がかかっているかを確認し、さらに調整してください。—

まとめ

  • `worker_processes` を CPU コアまたは `auto` に設定します
  • 一度に処理できるクライアントを増やすには、`worker_connections` を増やします。
  • Linuxでepollとmulti_acceptを有効にする
  • PHP-FPM を `pm.max_children` を高く設定し、プロセス制限を調整する
  • キャッシュと gzip を使用して静的アセットの提供を最適化する
  • サーバーのリソースを監視し、それに応じて設定を調整する

まとめ

高負荷向けにサーバーをチューニングするのは、いわば芸術です。あちこち微調整し、あちこちテストし、最適な値を見つけ出すのです。これらはあくまでも目安であり、実際のトラフィックやサーバーのスペックに応じて調整が必要です。覚えておいてください。キャパシティを計画し、徹底的にテストし、パフォーマンス統計を常に監視してください。ピーク時のサイトの速度低下と高速化の違いは、多くの場合、これらの設定に起因しています。この設定がお役に立てば幸いです。私の場合は効果がありましたので、皆さんにも効果があることを願っています。