负载均衡
负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性
就像宋小宝说的雨露均沾
upstream
指令
upstream
块不属于虚拟主机,只能在 http 块里配置,它定义了在反向代理时 Nginx 需要访问的后端服务器集群和负载均衡策略。
http {
upstream back_end { # upstream 需要一个名字
server 192.168.66.100 max_conns=2 fail_timeout=1s;
server 192.168.66.101 weight = 1;
server 192.168.66.102 weight = 1;
}
server{
lisetn 80;
server_name *.*;
location / {
proxy_set_header Host $host; #转发原始请求的host头部
proxy_pass http://back_end; #转发到upstream块定义的服务器集群。
}
}
}
upstream 参数:
max_conns 节点的最大连接数
slow_start 缓慢启动时间
down 节点下线
backup 备用节点
max_fails 允许的最大失败数
fail_timeout 超过最大失败数后的等待时间
负载均衡算法
轮询(默认)
轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式。 适用于后台机器性能一致的情况。 挂掉的机器可以自动从服务列表中剔除。
http {
upstream back_end { # upstream 需要一个名字
server 192.168.0.14;
server 192.168.0.15;
}
server{
lisetn 80;
server_name *.*;
location / {
proxy_set_header Host $host; #转发原始请求的host头部
proxy_pass http://back_end; #转发到upstream块定义的服务器集群。
}
}
}
轮询加权重
根据权重来分发请求到不同的机器中,指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
http {
upstream back_end { # upstream 需要一个名字
server 192.168.0.14 weight=20;
server 192.168.0.15 weight=10; ;
}
server{
lisetn 80;
server_name *.*;
location / {
proxy_set_header Host $host; #转发原始请求的host头部
proxy_pass http://back_end; #转发到upstream块定义的服务器集群。
}
}
}
IP_hash
每个请求按访问 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的 session 共享问题。俗称 IP 绑定。
http {
upstream back_end { # upstream 需要一个名字
server 127.0.0.1:8080 ;
server 127.0.0.1:8081 ;
ip_hash;
}
server{
lisetn 80;
server_name *.*;
location / {
proxy_set_header Host $host; #转发原始请求的host头部
proxy_pass http://back_end; #转发到upstream块定义的服务器集群。
}
}
}
fair
比 weight、ip_hash 更加智能的负载均衡算法,fair 算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx 本身不支持 fair,如果需要这种调度算法,则必须安装 upstream_fair
模块。
下载nginx-upstream-fair-master
wget -P /opt https://github.com/gnosek/nginx-upstream-fair/archive/refs/heads/master.zip
解压
cd /opt
unzip master.zip -d /usr/local
提示
如果没有请先安装 unzip
apt install unzip
安装
切换到 nginx 目录执行以下操作
./configure --add-module=/usr/local/nginx-upstream-fair-master
编译
make
此步骤可能出现异常:
nginx-upstream-fair/ngx_http_upstream_fair_module.c:543:28: error: ‘ngx_http_upstream_srv_conf_t’ has no member named ‘default_port’ if (us->port == 0 && us->default_port == 0)
解决方案:
我们在 nginx 的编译目录下找到 ngx_http_upstream.h 配置文件的 ngx_http_upstream_srv_conf_s 模块,新增一个 default_port 即可
新增 nginx 命令
cp objs/nginx /usr/local/nginx/sbin/nginx1
警告
已安装 Nginx,配置第三方模块时,只需要--add-module=/第三方模块目录,然后 make 编译一下就可以,不要 make install 安装。编译后复制 objs 下面的 nginx 到指定目录下
配置实现
http {
upstream back_end { # upstream 需要一个名字
fair;
server 127.0.0.1:8080 ;
server 127.0.0.1:8081 ;
}
server{
lisetn 80;
server_name *.*;
location / {
proxy_set_header Host $host; #转发原始请求的host头部
proxy_pass http://back_end; #转发到upstream块定义的服务器集群。
}
}
}
启动
./sbin/nginx1
./sbin/nginx1 -s reload