利用upstream配置nginx负载均衡
nginx的负载均衡策略
- Nginx 提供了多种负载均衡策略,可以根据实际需求进行选择(可以搭配多个策略使用)。
策略名称 | 策略特点 | 适用场景 |
---|---|---|
轮询(Round Robin) | 按请求的时间顺序分配到每个后端节点,节点故障会自动剔除 | 默认策略,适合多台配置相近的场景,相当于每台权重都为1 |
加权轮询(Weighted Round Robin) | 指定轮询几率,weight和访问比率成正比 | 适用于多台服务器性能差异较大的场景 |
IP Hash | 每个请求按访问ip的hash值分配到对应且固定的节点 | 适用于需要客户端始终访问同一台服务器的场景,可保持会话 |
最小连接数(Least Connections) | 将请求发送到当前连接数最少的后端节点 | 适用于后端服务器性能差异较大,连接数分布不均的场景 |
随机(Random) | 将请求随机发送到一个后端节点 | 适用于多台服务器性能相近,没有特别要求的场景 |
注:ip hash解决的问题:在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
实战配置
- 如下示例共有4个后端节点,由于每台机器的配置不一样,所以采用了 ip_hash + 加权轮询 策略,下面是核心配置:
http {
#.设定负载均衡的服务器列表.
upstream myservers {
ip_hash; #.负载均衡策略:可选 ip_hash | least_conn | random
server 192.168.0.21:8001 max_fails=5 fail_timeout=300s weight=1; #.weigth表示权值,权值越高被分配到的几率越大,默认为1.
server 192.168.0.22:8001 max_fails=5 fail_timeout=300s weight=5; #.max_fails表示:在fail_timeout时间内,允许请求失败的次数,默认为1.当超过最大次数时,返回错误.
server 192.168.0.23:8001 max_fails=5 fail_timeout=300s weight=5; #.fail_timeout表示:在这个时间内max_fails次失败后,暂停服务的时间,默认为10秒.
server 192.168.0.24:8001 down; #.down表示当前的server不参与负载.
}
server {
listen 80;
server_name xxx.abc.com;
location / {
#.反向代理的地址
proxy_pass http://myservers;
#.设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#.禁用缓存
proxy_buffering off;
}
}
}