9阅网

您现在的位置是:首页 > 知识 > 正文

知识

php - 如何将nginx配置为基本的负载均衡器?

admin2022-11-06知识19

我有一个服务器,我想设置为负载均衡器反向代理,nginx1.14.2运行在debian 10上。

我根本不想要缓存,我只是希望当人们访问负载均衡的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;
    }
}

所有节点和负载均衡器的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,似乎可以正常工作。

问题1

PHP服务器运行在 node1.example.comnode2.example.com 目前报告如下,其中(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 这是正确的吗? 我在负载均衡器上设置了keepalive,但它似乎总是关闭的。



【回答】:

问题2

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

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

这可能会对你有所帮助。

proxy_cache_bypass $http_pragma;
proxy_cache_bypass $http_cache_control; 

在这种情况下,代理服务器会尊重Cloudflare服务发送的缓存头。

问题3

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

docs的http keepalive也应该设置。

proxy_http_version 1.1;
proxy_set_header Connection "";

请注意 默认 代理_http_version的行为是1.0。

并确保你所设置的100个连接是足够的。keepalive 100;因为设置过低的数值也会导致 CONNECTION: closed 行为。

【回答】:

问题1

...狙击...

我以为... real_ip_header X-Forwarded-For; 会使用X-Forwarded-For(来自CloudFlare),并将其作为真实IP存储,例如PHP会说 $_SERVER["REMOTE_ADDR"] 是一样的 X-Forwarded-For

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

$_SERVER["REMOTE_ADDR"] 在你的PHP脚本或 $remote_addr 在nginx中,指的是接受请求的直接客户端;如果你的客户端直接连接到你的后端,或者如果你的客户端从后端连接到负载均衡器,则指的是你的负载均衡器代理服务器。

X-Forwarded-For 来自负载均衡器(或代理)服务器的请求头指的是你的请求。真正 客户端IP地址。因为它是一个普通的请求头,任何客户端都可以欺骗它们,无论是意外的(比方说客户端配置错误)还是故意的。

这是为了安全起见,所以如果你的请求是一个proxiedload-balanced的请求(有一个 X-Forwarded-For 请求头);你可以 接受 如果他们的远程地址($remote_addr 在nginx或 $_SERVER["REMOTE_ADDR"] 在PHP中)在你的受信任的负载均衡器proxy列表中,或者是 拒绝 如果他们的远程地址不在列表中,则将其作为一个伪造的请求。

问题二

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

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

问题3

负载均衡器使请求的HTTP头CONNECTION: closed,但如果我访问后台,总是得到CONNECTION: keep-alive,这是正确的吗?

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

【回答】:

问题1通过使用 set_real_ip_from a.b.c.d 在节点1和节点2上,其中a.b.c.d为负载均衡IP。