Nginx 如何配置负载均衡
负载均衡是指把请求分配到不同的服务器上,以提升系统的性能和可靠性。Nginx 不仅是一款优秀的 Web 服务器,它也是一款优秀的反向代理服务器,其通过不同的负载均衡算法来分配流量反向代理出去,以实现服务的扩展。
反向代理
使用负载均衡之前,先要搞清楚反向代理。反向代理是指客户端发请求抵达A服务器,A服务器不做实际的业务处理,而是把请求转发到另外一台服务器B,由服务器B进行处理。服务器A转发到服务器B的这个过程就是反向代理。为了描述方便,暂且把A称为代理服务器,B称为业务服务器。Nginx 通过 proxy_pass
来配置反向代理。来看一个例子,先使用 Nginx 启用一个 server ,用来模拟业务服务器:
server {
listen 80;
server_name localhost;
location /about {
add_header Content-Type 'text/html; charset=utf-8';
return 200 "I am first server.My port is 80.";
}
}
此时,访问 http://IP:PORT,会返回我们 return 的信息:
配置另一个 server,用来模拟代理服务器,并监听 80 端口对外服务,业务服务器改为监听 8001 端口:
server {
listen 80;
server_name localhost;
location = /about {
proxy_pass http://localhost:8001;
}
}
server {
listen 8001;
server_name localhost;
location /about {
add_header Content-Type 'text/html; charset=utf-8';
return 200 "I am first server.My port is 8001.";
}
}
此时,我们的访问 80 端口的 /about 地址,会被反向代理到 8001,由 8001 处理请求。
轮询负载均衡
了解反向代理后,我们就可以着手负载均衡了,Nginx 自身有四种负载均衡:轮询、加权、IP_hash、least_conn。轮询是默认的负载均衡方式,配置一个负载均衡:
upstream myLoad {
server localhost:8001;
server localhost:8002;
server localhost:8003;
}
upstream 定义一个负载均衡器,myLoad 是它的名字,这个负载均衡指定了三台业务服务器:8001、8002、8003,Nginx 会轮询的使用它们,如果其中一台服务器挂掉了,会自动从轮询中剔除。接下来我们模拟三台业务服务器,并在代理服务器中使用负载均衡。此时的 Nginx 整体配置如下:
server {
listen 80;
server_name localhost;
location = /about {
# 使用负载均衡
proxy_pass http://myLoad;
}
}
upstream myLoad {
server localhost:8001;
server localhost:8002;
server localhost:8003;
}
server {
listen 8001;
server_name localhost;
location /about {
add_header Content-Type 'text/html; charset=utf-8';
return 200 "I am first server.My port is 8001.";
}
}
server {
listen 8002;
server_name localhost;
location /about {
add_header Content-Type 'text/html; charset=utf-8';
return 200 "I am second server.My port is 8002.";
}
}
server {
listen 8003;
server_name localhost;
location /about {
add_header Content-Type 'text/html; charset=utf-8';
return 200 "I am third server.My port is 8003.";
}
}
并发十次请求的结果:
加权负载均衡
实际的业务中,业务服务器可能会存在性能不一致问题,这种情况再使用轮询负载均衡可能会导致性能较好的服务器性能浪费,性能较差的服务器压力过大,这显然不合理。Nginx 提供了 weight
原语来调整负载的权重,让性能较好的服务器承受多一些的请求,较差的服务求承受少一些的请求,修改配置如下:
upstream myLoad {
server localhost:8001 weight=5;
server localhost:8002 weight=3;
server localhost:8003 weight=1;
}
并发十次请求的结果:
IP_hash
IP_hash 可以确保同一客户端 IP 访问到同一台业务服务器上,以保证 session 会话在分布式系统中不能跨服务的问题:
upstream myLoad {
ip_hash;
server localhost:8001;
server localhost:8002;
server localhost:8003;
}
并发十次请求的结果:
least_conn
在实际的业务场景中,有的请求时间长,有的短,如果大量的长时间请求落在了同一台业务服务器上,会增加客户端的响应时间,least_conn
会尝试把请求转发给上一次请求成功的服务,用以均衡负载:
upstream myLoad {
least_conn;
server localhost:8001;
server localhost:8002;
server localhost:8003;
}
额外参数
Nginx 负载均衡还有一些的额外参数可供使用:
名称 | 介绍 |
down | 标记该 server down掉了,不参与负载均衡。 |
backup | 标记预留的 server。当主服务故障时,才会请求 backup。 |
max_fails | 允许请求失败的最大次数,默认为1。当超过最大次数时,将暂停此服务。 |
fail_timeout | max_fails 次失败后暂停服务秒数,max_fails和fail_timeout通常配合使用。 |
使用 Demo:
upstream myLoad {
least_conn;
server localhost:8001 max_fails=3 fail_timeout=10;
server localhost:8002 down;
server localhost:8003 backup;
}
本文目录