Nginx 负载均衡常见问题
那么,Nginx 负载均衡的通常配置会出现哪些问题呢?这里列出几种比较常见的问题:
- 客户端 IP 地址获取问题
- 域名携带问题
- 负载均衡导致 session 丢失问题
- 动态负载均衡问题
- 真实的 Realserver 状态检测
接下来,我们就重点讲解下 Nginx 作为负载均衡的这几个问题,值得一提的是,这五个问题中的动态负载均衡问题将在下一课时重点讲解,所以本课时就不再讲解了。
客户端IP地址获取问题
第一个问题是客户端 IP 地址获取问题,为什么会存在客户端 IP 地址获取问题呢?

我们来看这样一张模拟图,图中请求从用户到 Nginx,再到后端服务。我们可以看到用户的 IP 地址是 100.100.100.100,Nginx 的地址是 192.168.0.1,通过 Nginx 负载均衡到三台后端服务,它们的 IP 分别是 192.168.1.1、192.168.1.2、192.168.1.3。
那么客户端的 IP 地址为什么会无法被后端服务获取呢?原因是我们获取方式在Nginx的加入负载均衡后出现了差异,具体如下:
我们了解后端服务获取IP的方式,第一种方式是由后端服务通过 4 层 TCP 协议获取源 IP 地址,你会发现,通过这种方式,后端服务只能获取 Nginx 的 IP 地址,而无法获取到 100.100.100.100 这个 IP 地址,原因在于 Nginx 做了一层反向代理,而反向代理修改了客户的源地址和源端口的包头,所以在后端服务,通过这种方式只能获取到 Nginx 的 IP,而无法获取到用户的 IP。
另外一种方式是后端服务通过 HTTP 标准请求头信息 X-forwarded-for 获取用户IP信息,但是通过代理这一层时,有可能把 X-forwarded-for 改写或丢失用户的请求地址,这样就有可能导致 X-forwarded-for 在后端无法获取用户信息。
X-forwarded-for 头的格式,它会一层一层往后添加信息,比如第一层是客户端的 IP 地址,然后是通过代理后的代理层IP,代理层后一层一层的追加信息。X-forwarded-for需要通过 Nginx 配置添加,从而使得标准协议将以 X-forwarded-for 头为载体,把用户的 IP 地址和代理层 IP 地址添加到这个载体中,这样后端才能通过X-forwarded-for 获取到详细的 IP 地址信息。
解决办法
知道了问题发生的原因,我们如何来解决呢?第一种方式的解决办法是在 Nginx 负载均衡的基础上添加了一个转发到后端的标准 head 信息,把用户的 IP 信息通过 X-Forwarded-For 方式传递过去。
第二种方式是就是添加一个 X-Real 的自定义头,自定义头我们可以随意的命名,一般情况下命名为 X-Real_IP,把用户的真实四层 IP地址赋值给它,如何做到呢?
remote_addr 是一个 Nginx 的内置变量,它获取到的是 Nginx 层前端的用户 IP 地址,这个地址是一个 4 层的 IP 地址,我们来看这张图,Nginx 的 IP 地址是 192.168.0.1,它的 remote_addr 是什么呢?它就是用户的 100.100.100.100 这个地址,也就是直接将 TCP/IP 协议的用户 IP 地址(源地址)以 remote_addr 变量的方式赋值给 X-Real_IP 的自定义变量,后端直接通过 X-Real 获取 X-Real

本文深入探讨了Nginx作为负载均衡时遇到的常见问题,包括客户端IP地址获取、域名携带、session丢失以及真实后端服务器(Realserver)状态检测。针对这些问题,提出了相应的解决方案,如通过X-Real-IP或X-Forwarded-For头信息传递客户端IP,设置proxy_set_header保留Host头信息,采用ip_hash或URL_hash策略保持session,以及利用第三方模块nginx_upstream_check_module进行更细粒度的Realserver状态监测。
1663

被折叠的 条评论
为什么被折叠?



