后端的real server不知道前端真正访问的ip地址,只知道负载均衡器的ip地址,如何让后端的real server知道前端真正的用户的ip地址?
解决方法1:后端real server不使用realip模块
步骤1:在负载均衡器上修改http请求报文头部字段,添加一个X-Real-IP字段
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb;
proxy_set_header X-Real-IP $remote_addr;
}
}
将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值。
X-Real-IP 这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写。
步骤2:在后端real server上使用这个x_real_ip这个字段
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
}
在主配置文件nginx.conf里的日志部分调用这个变量,获取x_real_ip的值
变量名不区分大小写($HTTP_X_REAL_IP、$http_x_real_ip)
解决方法2:后端real server使用realip模块
realip模块的作用是:当本机的nginx处于一个反向代理的后端时获取到真实的用户IP。
给后端(backend)服务器使用的。
前提条件,需要在后端(backend)服务器上在编译安装nginx的时候,开启 --with-http_realip_module 功能,如果没有开启,需要重新编译安装nginx。
步骤1:在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
proxy_set_header X-Real-IP $remote_addr;
}
}
将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值。
X-Real-IP 这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写。
步骤2:在后端real server上使用set_real_ip_from 192.168.0.160
server{
listen 80;
set_real_ip_from 192.168.0.160;
}
set_real_ip_from 192.168.0.160 # 告诉本机的nginx ,192.168.0.160 是负载均衡器,不是真正的client。
健康检查(Health Checks)
两种方式
Active Health Checks 主动的健康检查,LB每隔一段时间就去检查下后端的real server的状态,不管是否有client发请求过来,都会去检查。
server {
location / {
proxy_pass http://backend;
health_check port=80; # 指定检测的端口号
}
}
location / {
proxy_pass http://backend;
health_check interval=10 fails=3 passes=2; # 每隔10秒去检查一次后端的real server, 失败的次数到达3次的时候,就标识这台上游服务器不可用,如果连续2次又可用访问了,就标识这台上游的服务器为up(可用)
# 主动检查:默认的失败次数是1次,默认的时间间隔是5秒,默认只要能成功访问一次就认为服务器up 了
}
需要安装nginx plus(需要购买)
Passive Health Checks 被动的健康检查: 当client发请求给LB,然后LB再去转发请求给后端的real server ,这个时候如果后端的服务器出现问题,LB就发现了。被客户机逼着去检查后端的real server。
参数
fail_timeout –设置必须多次尝试失败才能将服务器标记为不可用的时间,以及将服务器标记为不可用的时间(默认为10秒)。
max_fails –设置在fail_timeout服务器标记为不可用的时间内必须发生的失败尝试次数(默认为1次尝试)。
backup 备份:当其他的服务器都不提供服务的时候,再启用这台服务器提供服务。
slow_start 慢启动
down 将上游的服务器标识为不可用,不会再发送任何的请求给这台服务器。
upstream backend {
server backend1.example.com;
server backend2.example.com max_fails=3 fail_timeout=30s;
}
upstream backend {
server backend1.example.com slow_start=30s;
server backend2.example.com backup;
server backend3.example.com;
}