GNU/Linux >> Linux の 問題 >  >> Linux

Nginx パフォーマンス チューニング

Nginx は、ロード バランサー、リバース プロキシ、HTTP キャッシュ、およびメール プロキシとして使用される、高性能で軽量な無料のオープン ソース Web サーバーです。 Nginx は他の Web サーバーに比べてかなり新しいものですが、そのパフォーマンスの高さから人気が高まっています。 Nginx の既定の構成では、高速なパフォーマンスが得られる場合がありますが、いくつかの構成を変更することで、Nginx のパフォーマンスをさらに向上させることができます。

この記事では、Nginx のパフォーマンスを向上させる 8 つの異なる方法について説明します。この記事の例を説明するために、Ubuntu 22.04 LTS システムに Nginx をインストールしました。

ワーカー プロセスの変更

Nginx のすべての Web サーバー リクエストは、ワーカー プロセスによって処理されます。 Nginx では、ワーカー プロセスは複数のワーカー プロセスとして作成されてリクエストを処理し、マスター プロセスはすべてのワーカー プロセスの管理と構成の分析を担当します。 Nginx のデフォルト構成では、ワーカー プロセス パラメーターは auto に設定されており、利用可能な CPU コアに応じてワーカー プロセスが開始されます。 Nginx の公式ドキュメントで推奨されているように、利用可能な CPU コアに応じてワーカー プロセスを維持するのが最善の方法であるため、auto が推奨されるパラメーターです。プロセッサーのコア数を知りたい場合は、次のコマンドを実行してください。

$ grep processor /proc/cpuinfo | wc -l

ワーカー プロセスのデフォルト値は、/etc/nginx/nginx.conf にある Nginx 構成ファイルから変更できます。 サーバーのトラフィックが増加し、ワーカー プロセスを追加する必要がある場合は、サーバーをより多くのコア プロセッサにアップグレードすることをお勧めします。

ワーカー接続制限の強化

ワーカー接続は、使用可能な各ワーカー プロセスが管理できる同時接続の総数です。デフォルトでは、ワーカー プロセスは一度に 512 の接続を管理できます。ワーカー接続値を変更する前に、次のコマンドを使用して最大接続システムを確認し、それに応じて接続構成を更新できるようにする必要があります。

$ ulimit -n

Nginx を最大限に強化するには、nginx.conf ファイルでワーカー接続の値を、システムが許可する最大接続システムに設定します。

コンテンツ圧縮の実装

Web コンテンツの圧縮に、Nginx は gzip を使用してコンテンツの配信時間を増やし、ネットワーク帯域幅の使用量を減らします。構成では、コメント化された状態で gzip 構成を見つけることができますが、必要に応じて gzip のコメントを外して変更することができます。 gzip 圧縮プロセスはシステム リソースを使用するため、リソースが限られている場合は、特定の種類のファイル、圧縮レベルなどのみを圧縮するなど、それに応じて構成を変更します。

静的コンテンツのキャッシュ

この現代の Web 開発では、ほとんどのコンテンツがブラウザーまたはクライアントに静的に提供されるため、静的ファイルをキャッシュすると、コンテンツがより速く読み込まれます。また、コンテンツがキャッシュから読み込まれるため、Nginx への接続要求も減少します。キャッシュ プロセスを開始するには、次のディレクティブを Nginx 仮想ホスト構成ファイルに追加します。

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {expires 30d;}

上記のディレクティブは、リソース ファイルを 30 日間キャッシュします。必要に応じてキャッシュの有効期限を設定できます。

バッファリング

バッファリングは、バッファがいっぱいになるまで応答の一部を保持するため、クライアントとサーバー間の通信をより効率的にすることができます。応答が実際のバッファ サイズよりも大きすぎる場合、Nginx は応答をディスクに書き込み、パフォーマンスの問題につながる可能性があります。次のディレクティブを更新して、要件に応じてバッファ サイズを調整できます。

Client_body_buffer_size :クライアント応答データを保持するために使用される実際のバッファー サイズを決定します。

Client_header_buffer_size :クライアントヘッダーのサイズを管理します。通常は、値を 1k に設定するだけで十分です。

Client_max_body_size :クライアントに許可される本文の最大応答を制限します。本体のサイズがその値を超えると、Nginx は「Request Entity Too Large」というエラーをスローします。

バッファリング サイズを調整するには、http セクション内に次のディレクティブを追加します。

http {
…
client_body_buffer_size 80k;
client_max_body_size 9m;
client_header_buffer_size 1k;
...
}

アクセスログのバッファリング

ロギングは、問題のデバッグと監査において極めて重要な役割の 1 つです。ロギングは、パフォーマンスの問題を引き起こす I/O サイクルと CPU の両方に影響を与えるすべての要求データを保存するためです。ログへのバッファリングを有効にすることで、この種の影響を軽減できます。バッファ サイズが上限に達すると、Nginx はバッファ コンテンツをログに書き込みます。アクセス ログ ディレクティブにサイズ値を持つバッファ パラメータを追加することで、バッファリングを有効にできます。

access_log /var/log/nginx/access.log main buffer=16k;

または、次の方法でアクセス ログを無効にすることもできます (不要な場合)。

access_log off;

タイムアウト値の制限

タイムアウト値を制限すると、Nginx のパフォーマンスが向上します。 Nginx は、指定された期間、クライアントの本文とヘッダーのリクエストを待ちます。時間内に応答データを受信しない場合、Nginx はそれぞれのクライアントのタイムアウトをトリガーします。タイムアウト値は、次のディレクティブで管理できます。タイムアウト期間を設定するには、以下のディレクティブをコピーして http セクション内に貼り付けます。

client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 13;
send_timeout 10;

クライアントの本文とヘッダーのタイムアウトは、Nginx がクライアント リクエストからヘッダーと本文を読み取る期間です。時間内に完了しない場合、要求はタイムアウト エラーで終了します。 Keepalive_timeout は、nginx がクライアント接続を閉じた後、キープアライブ接続が開いたままになる期間です。 Send_timeout は、クライアントが Nginx によって送信された応答を受信する必要がある期間です。

ファイルキャッシュを開く

Linux では、ほとんどすべてがファイルです。open_file_cache を使用すると、ファイル記述子と頻繁にアクセスされるすべてのファイルがサーバーにキャッシュされます。特に、オープン ファイル キャッシュを使用して静的 Html ファイルを提供する場合、Nginx のパフォーマンスが向上します。これは、特定の間隔でキャッシュを開いてメモリに保存するためです。次の open_file_cache のディレクティブを http セクションに配置して、キャッシュを開始します。

http {
...
open_file_cache max=1024 inactive=10s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

結論

これらは、Nginx 構成ファイルを変更するだけで Nginx Web サーバーのパフォーマンスを向上させる 8 つの方法です。この記事を読んで、Ngunx のセットアップを改善し、サーバー、サーバー、またはクラウド システムで可能な限り最高のパフォーマンスを得るのに役立つことを願っています。


Linux
  1. MySQL –パフォーマンスの調整と最適化

  2. nginx-413リクエストエンティティが大きすぎます

  3. AwkパターンがNginx-vのConfigure引数と一致しないのはなぜですか?

  1. 基本的なNginxのトラブルシューティング

  2. NginxをFedoraにインストールする

  3. ext3 のファイルシステム パフォーマンス チューニング オプション

  1. UbuntuにNginxをインストールする

  2. Mac OS X と Linux での dd パフォーマンス

  3. /etc/nginx/nginx.conf で getpwnam(www) が失敗しました