Nginx系列(一)——HTTP/TCP/UDP负载均衡
本文最近更新于2020.06.04
本文内容总结自Nginx Cookbook 2019
该电子书下载链接:
链接:https://pan.baidu.com/s/1Sob4JSjNKe77wMACmDZHig
提取码:rhc6
(一)HTTP负载均衡
Nginx经常用在一些HTTP服务的负载均衡上.
只需要在http模块内定义upstream模块.
先来看一下简单示例(主要是以下两个有注释的地方)
[root@129-node conf]# cat nginx.conf|grep -v '#'|grep -v ^$ worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream backup{ #定义一个名为backup的upstream模块 server 192.168.2.130:80; server 192.168.2.133:80; } server { listen 80; server_name localhost; location / { proxy_pass http://backup; #这里做相应的修改,使其转向upstream } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
假设我们的Nginx服务器为192.168.2.129,同时130和133的内容不同
那么当我们做了以上配置后,在浏览器中访问192.168.2.129,每次刷新页面都会轮流显示130和133的页面内容
upstream的调度算法主要有五种
1.轮询算法
轮询算法是默认的调度算法.所谓的轮询,即轮流调用后台服务器对外服务.
按照以下配置,则client会轮流访问130和133服务器内容
upstream backup{ server 192.168.2.130:80; server 192.168.2.133:80; }
2.权重算法
权重算法是在轮询算法上增加一个权重,使轮询时优先权重大的后台服务器.当后台服务器性能差异较大时,可以考虑将性能好的那台服务器权重加大.
按照以下配置,则client进行三次访问时,有1次会访问到130,另外2次会访问到133
upstream backup{
server 192.168.2.130:80 weight=1;
server 192.168.2.133:80 weight=2;
}
3.ip_hash算法
根据client的IP进行hash,根据hash结果分配后台服务器,从而使得该client每次访问的后台服务器都是同一台.该调度算法可以很好解决会话session问题.
安装以下配置,同一个client(也就是同一个IP)每次访问时都是访问到同一台后台服务器
upstream backup{ ip_hash; server 192.168.2.130:80; server 192.168.2.133:80; }
ps:ip_hash不能和weight权重算法搭配使用
4.fair算法(第三方)
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。如果需要使用这种调度算法,必须下载Nginx的upstr_fair模块。
upstream backend { server 192.168.1.101; server 192.168.1.102; server 192.168.1.103; fair; }
5.url_hash算法(第三方)
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
upstream backend { server 192.168.1.101; server 192.168.1.102; server 192.168.1.103; hash $request_uri; hash_method crc32; }
注意:url_hash算法的server语句中不能加weight等参数。
upstream中server指令语法如下:server address [parameters]
parameters:可选参数,可选参数如下:
1.down:表示当前server已停用
2.backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求。
3.weight:表示当前server负载权重,权重越大被请求几率越大。默认是1.
4.max_fails和fail_timeout一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查
5.slow_start:在服务故障重启时,让服务器逐步增加接收请求,避免大量请求短时间内再次搞垮服务器.对热点数据进行缓存,初始化数据库连接等等进行升温
(二)TCP Load Balancing
使用于mysql等tcp服务。不能放入默认配置文件中,因为该配置不能加入到http{}中。stream{}类似于http{},允许定义upstream{}。upstream里的服务器可设置三种模式,分别是Active,down,backup
1.添加stream模块
默认nginx没有安装stream模块,需要重新编译,编辑时指定--with-stream
./configure --prefix=/usr/local/nginx --with-stream #重新编译,添加--with-stream模块 make mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak #移除原nginx可执行文件 cp objs/nginx /usr/local/nginx/sbin/nginx #使用新编译后得到的nginx可执行文件代替原可执行文件 /usr/local/nginx/sbin/nginx -t #测试配置文件是否正常 make upgrade #执行最后的平滑升级,不影响业务
2.查看stream模块
如下带--with-stream即为安装成功
[root@129-node conf]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.19.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) configure arguments: --prefix=/usr/local/nginx --with-stream
3.配置nginx文件
和平时配置http负载均衡略有不同.该配置不能放在http{}模块中
以下配置实现通过3306端口对两台mysql服务器进行负载均衡
[root@129-node conf]# cat nginx.conf|grep -v ^#|grep -v ^$ worker_processes 1; events { worker_connections 1024; } stream{ upstream mysql{ server 192.168.2.130:3306; server 192.168.2.133:3306; } server { listen 3306; proxy_pass mysql; } } [root@129-node conf]# /usr/local/nginx/sbin/nginx -s reload #平滑重启
[root@129-node conf]# netstat -tlnp #可以看到我们的nginx监听了3306端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1085/master
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1279/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 961/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1085/master
tcp6 0 0 :::22 :::* LISTEN 961/sshd
PS:有一个问题暂时还没确定,那就是nginx是否可以同时支持http和tcp负载均衡,后续有时间再查询一下相关资料验证一下.理论上,好像是可以通过同时使用多个配置文件实现
4.验证TCP负载均衡
提前在130上创建bp130数据库,133上创建bp133数据库.效果如下:
可以看到同样的连接命令,分别返回了两个后台数据库的数据
[root@134 ~]# mysql -uroot -h 192.168.2.129 --port 3306 -p123456 -e "show databases;" +--------------------+ | Database | +--------------------+ | information_schema | | bp130 | | mysql | | performance_schema | | sys | +--------------------+ [root@134 ~]# mysql -uroot -h 192.168.2.129 --port 3306 -p123456 -e "show databases;" +--------------------+ | Database | +--------------------+ | information_schema | | bp133 | | mysql | | performance_schema | | sys | +--------------------+ [root@134 ~]#
(三)UDP Load Balancing
例如ntp服务
stream{ upstream ntp { server ip1:123 weight=1; server ip2:123 weight=2; } server{ listen 123 udp; #需要明确指出是udp协议。添加reuseport值还可适用于vpn等client和server持续性连接服务 proxy_pass ntp; } }
这个没实际使用过..
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步