web-dev-qa-db-ja.com

nginxを基本的なロードバランサーとして構成する方法

ロードバランサー/リバースプロキシとしてセットアップするサーバーがあります。
Debian 10で実行されているnginx/1.14.2

私はまったくキャッシングをしたくありません。単に、負荷分散nginxサーバーにアクセスしたときに、TCPをバックエンドサーバーに直接送信します(nginxのIPハッシュアルゴに基づいて)。もともと。

CDNとキャッシュのために、このロードバランサーの上でcloudflareも使用したいと思います。

これが私の現在の設定です:

upstream backend {
    ip_hash;
    server node1.example.com;
    server node2.example.com;
    keepalive 100;
}

server {
    listen 80;
    listen [::]:80;
    access_log off;

    location / {
        proxy_http_version 1.1;

        proxy_set_header Host $http_Host;
        real_ip_header X-Forwarded-For;

        proxy_pass http://backend;
        proxy_redirect off;
        proxy_request_buffering off;
        proxy_buffering off;
    }
}

すべてのノードとロードバランサーのconf.d /にこれがあります(これはnginxに対するcloudflareの推奨から直接来ています)

set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;
real_ip_header CF-Connecting-IP;

正常に動作しているように見えるCF-Connecting-IPがクライアントのIPに設定されています。

第1号

node1.example.comまたはnode2.example.comで実行されているPHPサーバーは、現在次のように報告しています。ここで、(a.b.c.d)はロードバランサーのIPで、(w.x.y.z)は接続しているクライアントのIPです。

  ["REMOTE_ADDR"]=>  "a.b.c.d"
  ["HTTP_X_FORWARDED_FOR"]=>  "w.x.y.z"

私はreal_ip_header X-Forwarded-For;がHTTP_X_FORWARDED_FOR(cloudflareからのもの)を使用し、それを実際のIPとして保存するので、phpはREMOTE_ADDRがHTTP_X_FORWARDED_FORと同じであると言うだろうと思いました

これが私が欲しいものです

  ["REMOTE_ADDR"]=> "w.x.y.z"
  ["HTTP_X_FORWARDED_FOR"]=>  "w.x.y.z"

どうすればこれを達成できますか?

第2号

ロードバランサーはリクエストHTTPヘッダーCACHE_CONTROL: max-age=0を追加しています
これは正しいです?そうでない場合、どのようにしてCACHE_CONTROL cloudflareが送信するものをロードバランサに使用させるだけですか

第3号

ロードバランサーはリクエストHTTPヘッダーCONNECTION: closedを作成していますが、バックエンドにアクセスする場合、常にCONNECTION: keep-aliveを取得します。これは正しいですか?ロードバランサーにキープアライブを設定しましたが、常に閉じられているようです

5
ParoX

問題1

... snip ...

real_ip_header X-Forwarded-For;はX-Forwarded-For(CloudFlareから取得)を使用し、PHPが$_SERVER["REMOTE_ADDR"]X-Forwarded-Forと同じです

できますが、 それは行わないでください です。本当に意味論です。車の左前輪をステアリングホイールとして使用できるのは、理由と両方の理由からですが、そうすれば、人々があなたを面白いと思うでしょう。

$_SERVER["REMOTE_ADDR"] in your PHP script or $remote_addr in nginxは、それがリクエストを受け入れている直接クライアントを指します。クライアントがバックエンドに直接接続している場合はクライアント、クライアントがバックエンドから接続している場合はロードバランサー/プロキシ。

X-Forwarded-For ロードバランサー(またはプロキシ)サーバーからのリクエストヘッダーは、realクライアントIPアドレスを参照します。これはプレーンなリクエストヘッダーであるため、どのクライアントも、誤って(クライアントの設定ミスとしましょう)、または意図的に、なりすましを行う可能性があります。

これはセキュリティ上の理由で行われるため、リクエストがプロキシされた/負荷分散されたリクエスト(X-Forwarded-Forリクエストヘッダーを持つ)の場合、リモートアドレス(nginxでは$remote_addrまたはPHPでは$_SERVER["REMOTE_ADDR"])が信頼できるロードバランサー/プロキシのリストにある場合、接続を受け入れることができます。または、 rejectリモートアドレスがリストにない場合は、偽造された要求としてそれを送信します。

問題2

ロードバランサーはリクエストHTTPヘッダーCACHE_CONTROLを追加しています:max-age = 0これは正しいですか?

Cache-Control はリクエストヘッダーまたはレスポンスヘッダーの可能性があるため、このヘッダーの送信者を確認する必要があります。クライアント、CloudFlare、nginxロードバランサー、またはPHPスクリプト。

問題3

ロードバランサーはリクエストHTTPヘッダーを作成していますCONNECTION:クローズしましたが、バックエンドにアクセスした場合は常にCONNECTIONを取得します:キープアライブは正しいですか?

nginx デフォルト は、すべてのHost: $proxy_HostバックエンドリクエストにConnection: closeおよびproxy_passを追加します。これを防ぐには、 proxy_set_header ディレクティブを使用します。

0
mforsetti