nginx主要使用upstream配置多个服务器,设置负载均衡策略。
基本配置
upstream
upstream example.com{
server host1;
server host2;
}
server
server {
listen 90;
server_name example.com;
location / {
proxy_set_header Host $host;
proxy_set_header x-for $remote_addr;
proxy_set_header x-server $host;
proxy_set_header x-agent $http_user_agent;
proxy_pass http://example.com;
}
}
负载均衡策略
round-robin(轮询)
请求按时间顺序逐一分配服务器,如果服务器挂机,自动被剔除。nginx默认按轮询策略分配服务器。
缺点:轮询策略会导致同一客户端多次访问分配到不同的服务器,如果集群没有对session做处理,会导致客户端访问的session丢失。建议用作静态资源的分配策略,如图片服务器。
ip_hash
按请求的客户端ip计算hash,按hash结果分配服务器。这样每一个客户端固定访问同一服务器,一定程度上解决轮询策略session丢失的问题。
示例
upstream example.com{
ip_hash;
server host1;
server host2;
}
fair(第三方)
按服务器的响应时间来分配请求,响应时间短的优先分配。
upstream example.com{
server host1;
server host2;
fair;
}
url_hash(第三方)
计算请求url的hash,按hash的结果来分配服务器。这样每个url定向到同一服务器,此策略适用于服务器缓存url请求的场景。
upstream example.com{
server host1;
server host2;
hash $request_uri;
hash_method crc32;
}
注意:在upstream中加入hash语句,server语句中不能有weight等其他的参数,hash_method是使用的hash算法。
服务器状态
- weight:设置权重,默认为1,数值越大,负载分配到的机率越高。
- max_fails:最大失败连接次数,失败连接的超时时长由fail_timeout指定;
- fail_timeout:等待请求的目标服务器发送响应的时长;
- backup:用于fallback的目的,所有服务均故障时才启动此服务器;
- down:手动标记其不再处理任何请求;
示例
upstream bakend{
ip_hash;
server host1 down;
server host2 weight=2;
server host3;
server host4 backup;
}
注意:示例里的host可以为ip,也可以为ip加端口