介绍
在上篇中利用反向代理将http
请求映射到后端服务器,但是为了应对并发,就有了负载均衡的概念。它通常配合反向代理的使用,将请求映射到多个后端服务器上。nginx
会根据配置均匀的将请求分配给每个服务器。
upstream
结合反向代理,配置负载均衡:
nginx
serevr {
listen 80;
server_name jsgoshu.cn;
location /api/ {
proxy_set_header X-Real-IP $ClientRealIP;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1 ;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
access_log logs/api_access.log;
error_log logs/api_error.log;
#在这里自定一个路径即可
proxy_pass http://blog_nginx;
}
}
#对应反向代理的路径 将请求根据策略分发到不同的服务器上
upstream blog_nginx {
#ip_hash;
server 192.168.168.70:8600 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.168.69:8600 weight=1 max_fails=3 fail_timeout=30s;
}
负载均衡的策略
负载均衡的策略,大致有4种:
- 轮询(默认)
轮询策略就是按照顺序将请求分配给不同的服务器。譬如有3台服务器A B C。第一次访问是A,第二次就是B,第三次就是C。
nginx
upstream pollingServer {
server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8082 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8083 weight=2 max_fails=3 fail_timeout=30s;
}
轮询策略提供了一些额外的参数。他们的含义分别是:
weight
:权重。默认为1,值越大,表示这台机器被访问的几率越大。(可以结合ip_hash策略来使用)。适用于服务器硬件配置差别比较大的情况。max_fails
:最大失败次数。fail_timeout
:超过服务器的最大失败次数后的暂停时间。fail_time
:服务器会被认作停机的时间长度。默认是10s。backup
:表示该服务器为备用服务器。当其他所有非备用服务器挂掉时,会将请求分配到该备用服务器。down
:表示该服务器停机,不再参与负载。
- 根据响应时间(fair)
fair
根据服务器的响应时间来分配。响应时间短的优先分配。它是第三方策略。需要按照对应的nginx
插件。
nginx
upstream fairServer {
fair;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
- 根据IP(ip_hash)
ip_hash
根据客户端的IP
来分配服务器,使得同一个客户端的请求都转发到同一个后端服务器。保证了session
的统一性。
nginx
upstream ipHashServer {
ip_hash;
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
server localhost:8084 weight=2;
}
- 根据URL(url_hash)
url_hash
是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash
的话,就可以使得同一个url(也就是同一个资源请求)到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。它也是第三方策略,需要额外安装插件。
nginx
upstream urlHashServer {
url_hash;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}