Nginx
部署多个web服务,利用nginx反向代理,根据权重(weight)进行转发;
登录权限验证相关的,可以用ip_hash进行转发。
Nginx配置示例
server{
#监听端口
server_name "ip"
listen "port";
location / {
proxy_pass http://test_weight_proxy;
#设置的请求头是传递给后端服务器的
proxy_set_header Host $host;
}
location /login/ {
proxy_pass http://test_ip_hash_proxy;
proxy_set_header Host $host;
}
}
#权重
upstream test_weight_proxy{
server ip:prot weight = 3;
server ip:prot weight = 3;
server ip:prot weight = 3;
}
#ip_hash
upstream test_ip_hash_proxy{
ip_hash;
server ip:prot;
server ip:prot;
server ip:prot;
}
Nginx负载均衡方式
- 轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉能够被自动剔除。轮询算法适合服务器配置相当,无状态且短平快的服务使用。
- weight权重:指定轮询的几率,weight和后端的访问比例成比例,weight权重越高比例越大。通常用于后端服务器配置不均的情况。
- ip_hash:上面两种算法存在一个问题是就是无法做到会话保持,当用户登录到服务器上后,第二次请求的时候会被定位到服务器集群中的某一个,那么已经登录到某个服务器上的用户会重新定位到另一台,之前的登录信息会丢失。ip_hash算法可以解决这个问题,当用户再次访问请求时,会通过hash算法自动定位到已经登录的服务器上,这样每个客户端可以固定在某个web服务器上,解决客户端session的问题。
proxy_set_header
1.proxy_set_header设置的请求头是传递给后端服务器的
2.ngixn反向代理中proxy_set_header的设置:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Uri $request_uri;
解析:
1)$http_host:代理服务器本身IP。
2)$remote_addr:前一节点的IP,并不一定是用户的真实IP。
$proxy_host:代理服务器请求的host,即后端服务器/源站的IP,后端服务器有可能还是代理服务器。
$proxy_port:代理服务器请求的后端服务器的端口。
3)$http_x_real_ip:获取的是前一节点的X-Real-IP的值。
4)$proxy_add_x_forwarded_for:获取的是前一节点的X-Forwarded-For的值。
3. X-Forwarded-For 对应不同值:
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
当只有一层代理服务器的情况下,两者的X-Forwarded-For值一致,都是用户的真实IP。
$remote_addr是前一节点的IP,并不一定是用户的真实IP。
$proxy_add_x_forwarded_for变量 包含http_x_forwarded_for与remote_addr两部分,他们之间用逗号分开。