はじめに

Nginxのプロキシ機能とロードバランシング機能は最もよく使われるものです。nginxの基本構文の常識と設定については既にNginx 設定詳解で説明しています。この記事では単刀直入に、まずプロキシ機能に関する設定を説明し、その後ロードバランシングの詳細を説明します。

Nginx プロキシサービス設定の説明

1、404ページのリダイレクト先アドレスを設定する

error_page 404 https://www.runnob.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.0版本

4、もしnginxサーバーが2台のWebサーバーに対してプロキシを行い、ロードバランシングアルゴリズムとしてラウンドロビンを採用している場合、そのうちの1台のマシンのWebプログラム(IIS)が停止している、つまりWebにアクセスできない場合、nginxサーバーはリクエストをこのアクセスできないWebサーバーに配信し続けます。ここで応答接続時間が長すぎると、クライアントのページが応答を待ち続けることになり、ユーザーエクスペリエンスが大幅に低下します。このような状況をどう回避すればよいでしょうか。ここで図を1枚用意して問題を説明します。

ロードバランシング中にweb2でこのような状況が発生した場合、nginxはまずweb1にリクエストしますが、nginxが不適切に設定されていると、リクエストをweb2に配信し続け、web2の応答を待ちます。応答タイムアウトになって初めて、リクエストをweb1に再配信します。この応答時間が長すぎると、ユーザーの待ち時間も長くなります。

以下の設定は解決策の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 ;host是访问URL中的域名和端口  www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr;  #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP

X-Forwarded-ForとX-Real-IPに関する関連記事は以下を参照してください:HTTPリクエストヘッダー内のX-Forwarded-For 。

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;  #连接超时时间,默认为75s,可以在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;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。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 設定詳解で、nginxにはどのようなロードバランシングアルゴリズムがあるかについて述べました。この節では、設定の操作方法について詳しく説明します。

まず、upstreamという設定について説明します。この設定は、プロキシ先サーバーのアドレスのグループを記述し、その後ロードバランシングアルゴリズムを設定するものです。ここでのプロキシ先サーバーアドレスには2つの書き方があります。

upstream mysvr { 
    server 192.168.10.121:3333;
    server 192.168.10.122:3333;
}
server {
    ....
    location  ~*^.+$ {         
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
    }
}

それでは、実践的な内容に入りましょう。

1、ホットスタンバイ:2台のサーバーがある場合、1台のサーバーに障害が発生したときにのみ2台目のサーバーがサービスを提供します。サーバーがリクエストを処理する順序:AAAAAAが突然ダウンしたら、BBBBBBBBBBBBBB.....

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333 backup;  #热备     
}

2、ラウンドロビン:nginxのデフォルトはラウンドロビンで、その重みはすべてデフォルトで1です。サーバーがリクエストを処理する順序:ABABABAB....

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

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

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のロードバランシング設定がとても簡単で強力だと感じたでしょうか?まだ終わりません。続けましょう。ここで少し雑談します。

nginxロードバランシング設定に関するいくつかのステータスパラメータの説明です。

  • down:現在のserverが一時的にロードバランシングに参加しないことを示します。

  • backup:予約されたバックアップマシンです。他のすべてのbackup以外のマシンに障害が発生した場合や忙しい場合にのみ、backupマシンにリクエストが送信されます。そのため、このマシンの負荷は最も軽くなります。

  • max_fails:許可されるリクエスト失敗回数。デフォルトは1です。最大回数を超えると、proxy_next_upstreamモジュールで定義されたエラーを返します。

  • fail_timeout:max_fails回の失敗を経験した後、サービスを一時停止する時間です。max_failsはfail_timeoutと一緒に使用できます。

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公式が提供するいくつかのプラグインを参照してみてください。

原文アドレス:https://www.cnblogs.com/knowledgesea/p/5199046.html