繁体   English   中英

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

[英]How to configure nginx as basic load balancer

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

I do not want caching at all, I simply want when people visit the load balancing nginx server it sends the TCP directly to backend servers (based on nginx's ip hash algo) as if they connected to it originally.

我还想在这个负载均衡器上使用 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;
    }
}

所有节点和负载均衡器在他们的 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;

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

第一期

PHP server running on node1.example.com or node2.example.com is currently reporting the the following where (abc.d) is the load balancers IP and (wxyz) is the connecting client's 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 header CACHE_CONTROL: max-age=0
这个对吗? 如果没有,我怎样才能让负载均衡器使用 CACHE_CONTROL cloudflare 发送的任何内容

第 3 期

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

第 2 期

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

默认情况下,Nginx 的缓存不支持 Cache-Control:no-cache 请求 header,也不支持 Pragma:no-cache 请求 header。 当用户代理发送这些请求标头时,您必须显式配置 Nginx 以绕过缓存并将请求传递到源服务器。

可能这会帮助你:

proxy_cache_bypass $http_pragma;
proxy_cache_bypass $http_cache_control; 

在这种情况下,代理将使用 Cloudflare 服务发送的缓存 header。

第 3 期

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

根据 http keepalive 文档,您还应该设置:

proxy_http_version 1.1;
proxy_set_header Connection "";

请注意 proxy_http_version 的默认行为是 1.0

并确保您设置的 100 连接足够keepalive 100; 因为设置太低的值也可能导致CONNECTION: closed行为。

问题 1 已通过在 node1 和 node2 上使用set_real_ip_from abc.d解决,其中 abc.d 是负载平衡 ZA12A3079E14CED9046E69BA52B8。

第一期

……剪……

我认为real_ip_header X-Forwarded-For; 将使用 X-Forwarded-For(来自 CloudFlare)并将其存储为真正的 IP,这样 PHP 会说$_SERVER["REMOTE_ADDR"]X-Forwarded-For相同

你可以,但请不要那样做 这是语义,真的。 我的意思是你可以用你汽车的左前轮作为方向盘,这是有原因的,因为两者都是轮子,但我相信如果你这样做,人们会觉得你很有趣。

PHP 脚本中的$_SERVER["REMOTE_ADDR"]或 nginx 中的$remote_addr指的是它接受来自的请求的直接客户端; 您的客户端(如果他们直接连接到您的后端),或者您的负载均衡器/代理(如果您的客户端从那里连接)。

X-Forwarded-For来自负载均衡器(或代理)服务器的请求 header 指的是您的真实客户端 IP 地址。 因为这是一个简单的请求 header,所以任何客户端都可以欺骗它们,无论是意外(假设客户端配置错误)还是故意。

这样做是出于安全原因,因此如果您的请求是代理/负载平衡请求(具有X-Forwarded-For请求标头); 如果他们的远程地址(nginx 中的$remote_addr或 PHP 中的$_SERVER["REMOTE_ADDR"] )在您的受信任负载均衡器/代理列表中,您可以接受连接,或者如果他们的远程地址不在,则将其作为伪造请求拒绝名单。

第 2 期

负载均衡器正在添加请求 HTTP header CACHE_CONTROL: max-age=0 这是正确的吗?

Cache-Control可以是请求或响应 header,因此您需要确认此 header 是谁发送的; 您的客户端 CloudFlare、nginx 负载均衡器或 PHP 脚本。

第 3 期

负载均衡器发出请求 HTTP header CONNECTION: closed 但如果我访问后端我总是得到 CONNECTION: keep-alive 这是正确的吗?

nginx 默认添加Host: $proxy_hostConnection: close到每个proxy_pass后端请求。 使用proxy_set_header指令来防止这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM