Nginx负载均衡
- 1. upstream 配置
- 2. 负载均衡调度算法
- 3. 负载均衡类型讲解
- 3.1. backup热备
- 3.2. RR轮询
- 3.3. WRR加权轮询
- 3.4. IP_Hash算法
- 3.5. URL_Hash算法
- 3.6. 负载均衡的其他配置
- 4. Nginx 负载均衡7层负载配置实战
- 4.1. OSI七层回顾
- 4.2. 配置实战
- 5. Nginx 负载均衡4层配置方法(扩展)
1. upstream 配置
Nginx 的upstream模块允许我们定义一组后端服务器,并根据一定的策略转发客户端请求到这些后端服务器上。通过upstream配置,可以实现负载均衡和故障转移等功能。
Nginx 根据配置的策略,自动选择后端服务器,并将客户端请求转发到所选的服务器上。在后端服务器故障时,Nginx 支持自动剔除故障服务器,并将请求重新分配到其他正常的服务器上。
#upstream语法upstream testapp { server 10.0.105.199:8081 backup;#后端服务器的IP和端口,backup策略server 10.0.105.202:8081; #后端服务器的IP和端口}server {....location / {proxy_passhttp://testapp;#请求转向 testapp 定义的服务器列表 } }
2. 负载均衡调度算法
1.轮询(默认的负载均衡算法):每个请求按时间顺序逐一分配到不同的后端服务器。
2.ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
3.url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。
4.fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
3. 负载均衡类型讲解
3.1. backup热备
热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务,A服务器正常的情况,B服务器是不会工作的,就是用来当备胎的
upstream myweb { server 172.17.14.2:8080; server 172.17.14.3:8080 backup;#热备 }
3.2. RR轮询
轮询(round robin):nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…
upstream myweb { server 172.17.14.2:8080; server 172.17.14.3:8080;}
3.3. WRR加权轮询
加权轮询(weight round robin):跟据配置的权重的大小,分发给不同服务器不同数量的请求。
如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…
upstream myweb { server 172.17.14.2:8080 weight=1;server 172.17.14.3:8080 weight=2;}
3.4. IP_Hash算法
ip_hash:nginx会让相同的客户端ip请求相同的服务器。
upstream myweb { server 172.17.14.2:8080; server 172.17.14.3:8080;ip_hash;}
3.5. URL_Hash算法
upstream myweb { server 172.17.14.2:8080; server 172.17.14.3:8080;hash $request_uri;hash_method crc32;}#hash_method是使用的hash算法
3.6. 负载均衡的其他配置
nginx负载均衡配置状态参数
1.down
:表示当前的server暂时不参与负载均衡。
2.backup
:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
3.max_fails
:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
4.fail_timeout
:在经历了max_fails次失败后,暂停服务的时间,单位秒。
max_fails可以和fail_timeout一起使用。相当于一个冷却服务的时间
upstream myweb { server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1;}
4. Nginx 负载均衡7层负载配置实战
4.1. OSI七层回顾
OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议。
4.2. 配置实战
准备三台机器,再增加一台机器,作为nginx的后端服务器,安装方式建议跟前面2台保持一致
IP | 主要作用 | 注意事项 |
---|---|---|
192.168.221.130 | 反向代理服务器(客户访问的最前端的服务器) | 在本地做好host文件解析,解析的IP是128 |
192.168.221.136 | 后端真实服务器 | index.html文件要和138不一致 |
192.168.221.138 | 后端真实服务器 | index.html文件要和136不一致 |
- 配置nginx反向代理服务器
//nginx配置文件[root@localhost ~]# cd /etc/nginx/conf.d[root@localhost conf.d]# cp proxy.conf upstream.conf[root@localhost conf.d]# vim upstream.confupstream testweb { server 192.168.221.136:80 weight=1 max_fails=2 fail_timeout=2s; server 192.168.221.138:80 weight=3 max_fails=2 fail_timeout=2s;#ip_hash; #ip_hash会话保持 }server {listen 80;server_namewww.test-upstream.com;access_log/var/log/nginx/test-upstrem_access.logmain;location / {proxy_pass http://testweb; proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30;proxy_send_timeout 60;proxy_read_timeout 60; }error_page 500 502 503 504/50x.html;location = /50x.html {root /usr/share/nginx/html;}}
- 配置nginx后端服务器
192.168.221.136修改index.html文件(随意改动一点)
192.168.221.138使用官方yum源安装后,只需要启动nginx即可,不需要修改index.html文件,也是保持默认即可 - 访问反向代理服务器,观察情况
在hosts文件的最尾部添加一行
192.168.221.130 www.test-upstream.com
浏览器测试访问:http://www.test-upstream.com
声明:在浏览器中访问,ip_hash注释的情况下,权重的访问并不明显,这是因为浏览器中有缓存的原因;我们在服务器中使用elinks工具访问
//在136修改/etc/hosts文件[root@localhost conf.d]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.17.128 www.test-upstream.com//在136中使用elinks访问域名;第一次访问,跳到了129中[root@localhost conf.d]# elinks-dump www.test-upstream.com欢迎来到我的网站 * [1]主页 * [2]关于 * [3]联系方式 在这里添加您的主要内容... 版权所有 © 2023 My WebsiteReferences Visible links 1. http://www.test-upstream.com/# 2. http://www.test-upstream.com/# 3. http://www.test-upstream.com/# //第二次访问,跳到了138上面 [root@localhost conf.d]# elinks-dump www.test-upstream.com Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to [1]nginx.org. Commercial support is available at [2]nginx.com. Thank you for using nginx.References Visible links 1. http://nginx.org/ 2. http://nginx.com///后面多访问几次,可以看到跳转页面根据权重来分配
现在将130中配置文件的ip_hash取消注释,也就是将ip_hash算法打开,再次使用elinks访问,观察情况
[root@localhost conf.d]# hostname -I192.168.221.130[root@localhost conf.d]# vim upstrem.conf upstream testweb {server 192.168.221.136:80 weight=1 max_fails=2 fail_timeout=2s;server 192.168.221.138:80 weight=3 max_fails=2 fail_timeout=2s;ip_hash;#将这行的注释打开 }[root@localhost conf.d]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@localhost conf.d]# systemctl restart nginx //136使用elinks访问,观察情况[root@localhost conf.d]# elinks-dump www.test-upstream.com Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to [1]nginx.org. Commercial support is available at [2]nginx.com. Thank you for using nginx.References Visible links 1. http://nginx.org/ 2. http://nginx.com/http://nginx.com///多访问几次,可以看到都是访问到权重较大的服务器上了
总结:加了ip_hash算法的时候,同一个客户端的访问IP会被转发到同一个后端服务器中,没有加ip_hash的时候会按照upstream中的权重来访问
5. Nginx 负载均衡4层配置方法(扩展)
4层协议:TCP/IP协议
之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。
从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。
nginx在1.9.0的时候,增加了一个 stream 模块,用来实现四层协议(网络层和传输层)的转发、代理、负载均衡等。
stream 模块的用法跟 http 的用法类似,允许我们配置一组TCP或者UDP等协议的监听
配置案例:
#4层tcp负载 stream {upstream myweb {hash $remote_addr consistent;server 172.17.14.2:8080;server 172.17.14.3:8080;}server {listen 82;proxy_connect_timeout 10s;proxy_timeout 30s;proxy_pass myweb;}}