translation

AIが翻訳した投稿です。

뚠뚠멍의 생각들

nginxをウェブサーバーとして使用する場合の主要な設定

プロフィール画像

durumis AIが要約した投稿

  • nginxウェブサーバーのパフォーマンス最適化のためのgzip圧縮、proxy_buffer設定、workerおよびkeep-alive設定などの主要な設定を取り上げました。
  • 特に、データ転送量の削減とサーバー負荷の最小化のためのgzip圧縮とproxy_bufferバッファリング、そしてworkerプロセスとkeep-alive設定による接続管理の重要性を強調しました。
  • 様々なテストを経て、サーバー環境に適した最適な設定を適用し、安定したサーバー運用のための注意事項を示しました

nginxはオープンソースで、ウェブサーバーまたはウェブプロキシサーバーとして広く利用されています。

適切に設定すれば、静的コンテンツを効率的に配信できます。

その中でも、いくつかの主要な設定を記録したいと思います。


パフォーマンスに関するいくつかの主要な設定

1. gzip圧縮

ウェブサイトを読み込む際、ウェブサーバーからJavaScript、画像、HTML、CSSなど、無数のファイルを受け取ります。

この時、これらのコンテンツをそのまま配信するのではなく、gzip圧縮を利用することで、転送されるデータ量を大幅に削減できます。


つまり、これを実装することで

- データ量が減り、帯域幅を節約できます。

- サーバーリソースを節約できます。

- ユーザーにとって、実際の読み込み速度が向上します。


一方で、サーバーはコンテンツに応答する前にgzip圧縮を実行する必要があるため、サーバーのCPU使用率が高くなる可能性があります。

どの種類のファイルを圧縮するか、圧縮率はどの程度にするか、どのくらいの大きさのファイルを圧縮するかなど、運用レベルに適用する前にテストが必要です。


以下は、gzipに関するいくつかの設定です。


gzip on; # gzip圧縮を設定します。
gzip_vary on; # ヘッダーにVary: Accept-Encodingを追加します。
gzip_proxied any; # nginxをプロキシサーバーとして使用する場合は、バックエンドから受信した応答を圧縮します。(プロキシされたリクエストに対する圧縮)
gzip_min_length 256; # 256バイト以上のファイルのみ圧縮
gzip_comp_level 5; # 1~9の圧縮レベルを設定します。値が大きくなるほどCPU使用率が増加します。5は約50%圧縮します。
gzip_types text/plain text/css text/xml application/json application/javascript;
// 圧縮するコンテンツの種類を設定します。

* gzip_varyは、クライアントがgzipをサポートする場合とサポートしない場合に、コンテンツを圧縮版と非圧縮版でそれぞれ送信できるように指示します。(クライアントのリクエストヘッダー(Accept-Encoding)に応じて、異なるバージョンのコンテンツが提供される可能性があることを示します。)


2. proxy_buffer設定

nginxはクライアントにレスポンスを送信する前に、レスポンスをバッファーに保存します。

ウェブサーバーがクライアントにレスポンスを送信する際、クライアントの速度が遅い場合、サーバーはデータの送信を待ち続ける必要があります。(ネットワークボトルネック)

この時、サーバーリソースを継続的に使用しているため、これを解決するためにバッファーを使用して、クライアントの処理速度に関係なくレスポンスを一時的に処理します。これにより、以下の利点があります。

- サーバー負荷の最適化

- ネットワークボトルネックの軽減

  
location / {
proxy_pass サーバーURL;
        // プロキシバッファー設定
        proxy_buffering on; // バッファーを有効にします。
        proxy_buffer_size 4k; // バッファーのサイズを設定します。(主にヘッダーが入ります。)
        proxy_buffers 8 4k; // 各接続に対するバッファーの数とサイズ(4KBの8個)
        proxy_busy_buffers_size 8k; // クライアントにレスポンスを送信する際に使用できる最大バッファーサイズ

    }

※ バッファーサイズを大きくしすぎると、テキストストリーミングなどのリアルタイムデータ転送が遅延する可能性があるため、必ずテストが必要です。特に近年AI関連サービスが多く登場していますが、テキストストリームが機能しない場合は、この設定を必ず確認しましょう。


3. workerとhttpの設定

workerはクライアントのリクエストを処理するプロセスであり、サーバーのCPUコアごとにいくつ持つかを設定できます。

httpは一般的にリクエスト-接続-レスポンス-接続終了ですが、複数回のリクエストに対して接続するリソースを削減するために、クライアント接続を維持できます。これがkeep alive設定です。


worker_processes auto; # 使用可能なCPUコア数に応じて自動設定
worker_connections 1024; # 各workerが同時に処理できる接続数


// keep-alive設定
keepalive_timeout 65;
keepalive_requests 100;

server {
    listen 80;

    location / {
        proxy_pass サーバーURL;
    }
}

上記2つをまとめる理由は以下の通りです。

使用しているサーバーのコア数が4つの場合、理論上可能な接続数は1,024 * 4 = 4,096です。

(リソースやトラフィック環境によって正確ではない場合があります)

4,096個のクライアントが同時接続し、65秒間すべてのkeepaliveを占有している場合、

4,097番目のユーザーが接続しようとすると、接続できなくなるため、レスポンスが遅延する可能性があります。


したがって、auto scalingなどによってサーバーリソースが安定していると仮定した場合、イベント時にレスポンス遅延が発生する場合は、上記の設定が間接的に影響を与える可能性があります。


4. その他 - locationブロック

proxy bufferなどの設定の一部は、リクエストURLごとに適用できます。

* keep-aliveなどの設定の一部はHTTP/Serverレベルで適用されるため、ブロックごとに設定できません。

server {
listen 80;
server_name example.com;

// 基本パスの処理(/)
location / {
    proxy_pass サーバーURL;

    // バッファリング設定
    proxy_buffering on;                   
    proxy_buffers 8 16k;                  
    proxy_buffer_size 32k;                
    proxy_busy_buffers_size 64k;          
}

// /testパスの処理
location /test {
    proxy_pass サーバーURL2;

    // バッファリング無効化
    proxy_buffering off;                  // バッファリングを無効化(レスポンスをすぐに送信)
}
}


上記の設定により、ウェブパフォーマンスを最適化できます。様々なテストケースを考慮して十分にテストを行い、サーバーパフォーマンスを最適化しましょう!

* サーバーのダウンタイムなしに変更された設定のnginxを適用できるため、非常に安定しています。






뚠뚠멍
뚠뚠멍의 생각들
뚠뚠멍
ウェブサイトのパフォーマンス測定 - PerformanceObserverウェブサイトのパフォーマンス測定ツールPerformanceObserverとWeb Core Vitalsの改善方法を紹介します。CLS、LCP、FCP、FID指標の改善のための具体的な方法について見ていきましょう。

2024年9月24日

私が経験したクロスブラウジングの問題(主にSafari)モバイルウェブ開発中に発生したクロスブラウジングの問題(主にSafari)と解決策を記録した記事です。ビューポートの高さを計算する問題と、仮想キーボードによるUIのずれの問題、そしてSafariのLocalStorage容量制限などを扱います。

2024年9月27日

私が経験したクロスブラウジングの問題(Safari)モバイルウェブ開発中にSafariで発生するレイアウト問題の解決策を紹介します。ビューポート計算の問題とキーボードの位置の問題に対する解決策、そして-webkit-ベンダープレフィックスの使い方を扱います。

2024年9月27日

Google Cloud StorageとCloud Runを使用したCDN活用 - 2Google Cloud StorageとCloud Runを活用してCDNを構築する方法に関する2番目の記事です。画像とテキストファイルを最適化して送信し、世界8つのリージョンにリソースを配信してレイテンシを削減する方法について説明します。
두루미스 기술 블로그
두루미스 기술 블로그
두루미스 기술 블로그
두루미스 기술 블로그

2024年9月6日

[DB] キャッシュ設定の基準データベースのキャッシュ設定基準と実際の適用事例を紹介します。頻繁に読み書きされる頻度が低いデータにキャッシュを設定し、TTL設定などを通じて最新性を維持する方法を紹介します。
제이온
제이온
제이온
제이온

2024年4月25日

Cloud Runを活用した静的ファイルの提供 - 1Google Cloud Runを使用して静的ファイルを提供する方法に関するブログ記事です。リダイレクトとパフォーマンスの向上に重点を置いています。
두루미스 기술 블로그
두루미스 기술 블로그
두루미스 기술 블로그
두루미스 기술 블로그

2024年9月4日

[非エンジニア、開発者として生き残る] 14. 新規開発者のよくある技術面接内容要約新規開発者の面接でよく出る技術的な質問(メモリ領域、データ構造、データベースなど)を要約してまとめました。開発面接の準備に役立ててください。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年4月3日

Google Cloud StorageとCloud Runを活用した画像最適化と同期 - 3Google Cloud StorageとCloud Runを活用して、画像を最適化し、複数のリージョンに同期する方法について説明します。画像ファイルの変換、複製、削除機能の実装方法を扱います。
두루미스 기술 블로그
두루미스 기술 블로그
두루미스 기술 블로그
두루미스 기술 블로그

2024年9月8日

[Spring] @Async の使用方法Spring @Asyncを使用して、Javaの非同期処理を簡単に実装する方法を学びましょう。スレッドプールの設定と、Future、ListenableFuture、CompletableFutureの使用方法について説明します。
제이온
제이온
제이온
제이온

2024年4月25日