【发布时间】:2020-09-07 14:56:18
【问题描述】:
我有一台服务器,我想将其设置为负载平衡器/反向代理。
在 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;
}
}
所有节点和负载均衡器在他们的 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
在 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 这是正确的吗?我在负载均衡器上设置了keepalive,但它似乎总是关闭
【问题讨论】:
-
对于#1,它是正确的。见xpertdeveloper.com/…
-
我实际上通过在两个节点上使用
set_real_ip_from [loadbalancerip]修复了REMOTE_ADDR 问题。我希望解决方案可以仅在负载均衡器上运行,但情况似乎并非如此 -
对于#3,根据docs`应该清除“Connection”头字段`在
location指令中使用proxy_set_header Connection ""; -
对于#2,它在哪里添加这个?在对代理的请求中还是在代理的响应中?
标签: php nginx proxy nginx-reverse-proxy