在有些情况下,服务器访问量过大,单一服务器无法承受,这时候就用到了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
}