English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Nginxの代理機能および負荷分散の詳細

本文

序論

Nginxのプロキシ機能と負荷バランス機能は最もよく使用されます。nginxの基本的な文法や設定については、前の記事で説明しました。この記事では、まずプロキシ機能の設定について説明し、次に詳細な負荷バランスについて説明します。

1Nginxプロキシサービスの設定説明404、前回のHTTPモジュールの設定では以下の設定がありました。代理がステータスコード404ページを百度にリダイレクトします。

error_page 404 https://www.baidu.com; #エラーページ

しかし、この設定は、注意深いユーザーならその効果がないことに気づくでしょう。

この機能を有効にするためには、以下の設定と組み合わせて使用する必要があります。

proxy_intercept_errors on;    #プロキシサーバーが返信するステータスコードが400またはそれ以上400、設定されたerror_pageの設定が有効になります。デフォルトはoff。

2、私たちのプロキシがget、postリクエストメソッドのいずれかを許可する場合

proxy_method get;  #クライアントのリクエストメソッドをサポート。post/get;

3、サポートするHTTPプロトコルのバージョンを設定します。

proxy_http_version 1.0 ; #Nginx服务器提供代理服务的httpプロトコルバージョン1.0,1.1、デフォルト設定为1バージョン

4如果你的nginxサーバーが2台のwebサーバーがプロキシとして使用され、負荷バランスアルゴリズムがループリングを使用している場合、あなたの一台のマシンのwebプログラムiisが閉じられており、つまりwebにアクセスできない場合、nginxサーバーがリクエストを配信する際に、アクセスできないこのwebサーバーにリクエストを配信します。ここでの応答接続時間が長いと、クライアントのページが常に応答を待っている状態になり、ユーザーにとっての体験は非常に悪くなります。ここではどうすればこのような状況を避けることができますか。この問題を説明するために図を配置します。

 

 負荷バランスの中で、あるweb2このような状況が発生した場合、nginxはまずwebにアクセスします。1リクエストはwebに送信されますが、nginxが不適切に設定されている場合、リクエストはwebに続けて配信されます。2その後、webを待ちます。2応答が来ない場合、私たちの応答時間がタイムアウトに達するまで、リクエストはwebに再配信されます。1ここでの応答時間が長いと、ユーザーが待つ時間も長くなります。

以下の設定はその一つの解決策です。

proxy_connect_timeout 1;  #nginx服务器与被代理的服务器建立连接的超时时间、デフォルト60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出readリクエスト後、応答を待つ超時時間、デフォルト为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出writeリクエスト後、応答を待つ超時時間、デフォルト为60秒。
proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终止对被代理服务器的请求。默认为off。

5、upstream指令でサーバーグループを設定し、そのサーバー内のアクセスアルゴリズムが設定された負荷バランスルールに従います。また、この指令を使用して、どの異常状況が発生した場合に次のサーバーグループを順次処理するかを設定できます。

proxy_next_upstream timeout;  #upstream指令で設定されたサーバーグループに障害が発生した場合、プロキシサーバーが返すステータス値。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

  • error:接続を確立したり、プロキシサーバーにリクエストを送信したり、応答情報を読み取ろうとしたときにサーバーがエラーが発生しました。
  • timeout:接続を確立し、プロキシサーバーにリクエストを送信したり、応答情報を読み取ろうとしたときにサーバーがタイムアウトしました。
  • invalid_header:プロキシサーバーが返す応答ヘッダが異常です。
  • off:リクエストをプロキシサーバーに配信することができません。
  • http_400,....:プロキシサーバーが返すステータスコードは400,500,502など。

6、httpを通じてクライアントの実際のIPアドレスを取得し、プロキシサーバーのIPアドレスを取得するのではなく、以下の設定を行う必要があります。

proxy_set_header Host $host; #ユーザーがブラウザでアクセスするドメインがVIPにバインドされている場合、VIPの下にRSがある場合、$hostを使用します。ドメインとポートはURLのアクセスURLに含まれます。www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr; #ソースIP【$remote_addr、HTTP接続ヘッダ情報の内訳】をXに割り当てます。-Real-IP; これにより、コードで $X-Real-IPからソースIPを取得します。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#nginxがプロキシサーバーとして設定されている場合、通過するマシンのIPアドレスとプロキシマシンのIPアドレスが記録されます。コードでは echo $x-forwarded-for |awk -F, '{print $1}' としてソースIP

Xについて-Forwarded-ForとX-Real-IPに関連する記事を以下のブログ友達に推薦します:HTTPリクエストヘッダのX-Forwarded-For ,このブログ友達はhttpプロトコルに関する一連の記事を説明しています。皆さんにご注意ください。

7以下は、代理設定に関する設定ファイルの一部です。参考としてください。

  include    mime.types;  #ファイル拡張子とファイルタイプのマッピングテーブル
  default_type application/octet-stream; #默认文件类型、默认为text/plain
  #access_log off; #取消服务日志  
  log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
  access_log log/access.log myFormat; #combined为日志格式的默认值
  sendfile on;  #允许sendfile方式传输文件、デフォルト为off、可以在httpブロック、serverブロック、locationブロック。
  sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值、デフォルト为0、即不设上限。
  keepalive_timeout 65; #连接超时时间、デフォルト为75秒、http、server、locationブロックで設定可能。
  proxy_connect_timeout 1;  #nginx服务器与被代理的服务器建立连接的超时时间、デフォルト60秒
  proxy_read_timeout 1; #nginx服务器想被代理服务器组发出readリクエスト後、応答を待つ超時時間、デフォルト为60秒。
  proxy_send_timeout 1; #nginx服务器想被代理服务器组发出writeリクエスト後、応答を待つ超時時間、デフォルト为60秒。
  proxy_http_version 1.0 ; #Nginx服务器提供代理服务的httpプロトコルバージョン1.0,1.1、デフォルト設定为1.0バージョン。
  #proxy_method get;  #支持客户端的請求方法。post/get;
  proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终止对被代理服务器的请求。默认为off。
  proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服务器不处理设置的http响应头域,这里空格隔开可以设置多个。
  proxy_intercept_errors on;  #如果被代理服务器返回的状态码为400またはそれ以上400、設定されたerror_pageの設定が有効になります。デフォルトはoff。
  proxy_headers_hash_max_size 1024; #HTTPヘッダーを保存するハッシュテーブルの容量上限。デフォルトは512文字
  proxy_headers_hash_bucket_size 128; #nginxサーバーがHTTPヘッダーを保存するハッシュテーブルの容量。デフォルトは64文字
  proxy_next_upstream timeout; #リバックエンドアップストリームで設定されたサーバーグループが障害を起こした場合、代理されるサーバーが返すステータスコード。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
  #proxy_ssl_session_reuse on; デフォルトはon、エラーログで「SSL3_GET_FINSHED:digest check failed”の状況で、このコマンドをoffに設定することができます。

Nginx負荷分散詳細

前の記事でnginxにどのような負荷分散アルゴリズムがあるか説明しました。この節では、設定された負荷分散アルゴリズムについて詳細に説明します。

まず、upstreamの設定について説明します。この設定は、代理されるサーバーのアドレスのグループを書き、負荷分散のアルゴリズムを設定します。ここでは、代理されるサーバーのアドレスは以下の通りです2の書き方

upstream mysvr { 
   server 192.168.10.121:3333;
   server 192.168.10.122:3333;
  }
 server {
    ....
    location ~*^.+$ {     
      proxy_pass http://mysvr; #リクエストをmysvrが定義するサーバーリストにリダイレクト     
    } 
upstream mysvr { 
   server http://192.168.10.121:3333;
   server http://192.168.10.122:3333;
  }
 server {
    ....
    location ~*^.+$ {     
      proxy_pass mysvr; #リクエストをmysvrが定義するサーバーリストにリダイレクト     
    } 

それでは、実際のものを少し紹介します。

1、ホットスワップ:もし2台のサーバーがあり、一つのサーバーが障害を起こした場合に、二つ目のサーバーを起動してサービスを提供します。サーバーがリクエストを処理する順序:AAAAAA突然Aが落ちた、BBBBBBBBBBBBBB.....

upstream mysvr { 
   server 127.0.0.1:7878; 
   server 192.168.10.121:3333 backup; #ホットスワップ   
  }

2、ロウト:nginxはデフォルトでロウトを行い、ウェイトはデフォルトで1、サーバーがリクエストを処理する順序:ABABABABAB....

upstream mysvr { 
   server 127.0.0.1:7878;
   server 192.168.10.121:3333;    
  }

3、ウェイトドローテーション:設定されたウェイトの大きさに応じて、異なるサーバーに異なる数のリクエストを配信します。設定しない場合は、デフォルトで1。以下はサーバーのリクエスト順序です:ABBABBABBABBABB....

 upstream mysvr { 
   server 127.0.0.1:7878 weight=1;
   server 192.168.10.121:3333 weight=2;
}

4、ip_hash:nginxは同じクライアントIPのリクエストを同じサーバーにリダイレクトします。

upstream mysvr { 
   server 127.0.0.1:7878; 
   server 192.168.10.121:3333;
   ip_hash;
  }

5、もしあなたが上記4この均等化アルゴリズムがよく理解できない場合は、私の前の記事で提供した画像を見てみてください。もっと簡単に理解できるかもしれません。

ここまで来たら、nginxの負荷均等化設定が非常に簡単で強力に感じるかもしれませんが、まだ終わりではありません。ここで少し話を変えてみましょう。

nginxの負荷均等化設定のいくつかの状態パラメータについて説明します。

  • down、現在のserverは負荷均等化に参加していません。
  • backup、予備のマシンです。他のすべての非backupマシンが障害または忙しい場合にのみ、backupマシンにリクエストが行われます。したがって、このマシンの負荷は最も軽いです。
  • max_fails、許可されるリクエストの失敗回数です。デフォルトは1。最大回数を超えた場合、proxy_next_upstreamモジュールで定義されたエラーメッセージが返されます。
  • fail_timeout、max_fails回数の失敗後にサービスを停止する時間です。fail_timeoutとmax_failsを一緒に使用できます。
upstream mysvr { 
   server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
   server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;  
  }

ここまで来たら、nginxの内蔵の負荷均等化アルゴリズムはもう在庫切れかもしれません。nginxの負荷均等化アルゴリズムについてもっと深く理解したい場合は、nginx公式が提供するプラグインを確認してください。

これで本文のすべてが終わりました。皆様の学習に役立つことを願っています。また、ナイアラチュートリアルのサポートをどうぞ。

声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、アップロードした内容です。このサイトは所有権を持ちません。また、人工編集は行われていません。著作権侵害が見つかった場合は、notice#wまでメールを送ってください。3codebox.com(メールを送信する際に、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れたら、このサイトは即座に侵害する可能性のある内容を削除します。)

おすすめ