如何将 nginx 配置为基本负载均衡器

Par*_*roX 5 php proxy nginx nginx-reverse-proxy

我有一台服务器,我想将其设置为负载平衡器/反向代理。
在 debian 10 上运行的 nginx/1.14.2

我根本不想缓存,我只是希望当人们访问负载平衡 nginx 服务器时,它将 TCP 直接发送到后端服务器(基于 nginx 的 ip 哈希算法),就像他们最初连接到它一样。

我还想在这个负载均衡器之上使用 cloudflare 作为它的 CDN 和缓存。

这是我目前的设置:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所有节点和负载均衡器在他们的 conf.d/ 中都有这个(来自 cloudflare 对 nginx 的推荐)

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;
Run Code Online (Sandbox Code Playgroud)

CF-Connecting-IP 设置为客户端的 Ip,这似乎工作正常。

第 1 期

PHP 服务器正在运行node1.example.comnode2.example.com当前正在报告以下内容,其中 (abcd) 是负载均衡器 IP,(wxyz) 是连接客户端的 IP

  ["REMOTE_ADDR"]=>  "a.b.c.d"
  ["HTTP_X_FORWARDED_FOR"]=>  "w.x.y.z"
Run Code Online (Sandbox Code Playgroud)

我认为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"
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

第二期

负载均衡器正在添加请求 HTTP 标头CACHE_CONTROL: max-age=0
这是正确的吗?如果没有,我怎么能让负载均衡器使用 CACHE_CONTROL cloudflare 发送的任何内容

第 3 期

负载均衡器正在发出请求 HTTP 标头,CONNECTION: closed 但如果我访问后端,我总是得到CONNECTION: keep-alive 这是正确的吗?我在负载均衡器上设置了 keepalive 但它似乎总是关闭

Par*_*roX 0

问题 1 已通过在节点 1 和节点 2 上使用来解决,set_real_ip_from a.b.c.d 其中 abcd 是负载平衡 IP。