在有些情况下,服务器访问量过大,单一服务器无法承受,这时候就用到了nginx负载均衡的特性
负载均衡其实也是一种反向代理
在http中定义一组upstream,然后在proxy_pass中使用定义好得upsteam,然后nginx在访问得时候,就会将请求发送到服务器中
http{
upstream www{
server 192.168.0.1;
server 192.168.0.2;
server 192.168.0.3;
}
server{
listen 80;
server_name muyu.com;
location / {
proxy_pass http://www/;
proxy_set_header Host $host;
#真实IP
proxy_set_header X-Real-IP $remote_addr;
#访问IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
这样配置之后,对于访问到nginx的请求会平均的分配到upstream中的IP组,如果想指定一下IP的分配权重,只需要在每个IP后面加上weight参数即可
upstream www{
server 192.168.0.1 weight=1;
server 192.168.0.2 weight=2;
server 192.168.0.3 weight=1;
}
设置之后,分配0.2的数量是0.1和0.3的两倍,0.1和0.3的分配数量相同
这样配置之后,对于同一个IP的访问来说,请求的到upstream的每个IP都是随机的,可以第一次是第一个IP,到第二次请求就会变成第二个IP,这样就会导致登录状态丢失等问题
解决这个问题也很简单,只需要在upstream中加入nginx中自带的ip_hash算法,就可以保证用一个IP访问时,请求到的总是upstream中的同一IP
upstream www{
server 192.168.0.1 weight=1;
server 192.168.0.2 weight=2;
server 192.168.0.3 weight=1;
ip_hash
}