负载均衡概述
负载均衡是一种分布式计算技术,用于将网络流量和用户请求分散到多台服务器上,以此来提高网络服务的可用性和可靠性。它通过优化资源使用、最大化吞吐量以及最小化响应时间,增强了网络、服务器和数据中心的伸缩性和灵活性。
Nginx的负载均衡功能主要通过其反向代理模式实现。当客户端发送请求到Nginx服务器时,Nginx会根据预设的负载均衡策略将请求转发给后端服务器,并将后端服务器的响应返回给客户端。Nginx作为代理服务器,有效地分摊了请求压力,提高了系统的处理能力。
Nginx的负载均衡分为七层负载和四层负载,七层负载是指OSI网络模型中的第七层,对应的是HTTP请求。而四层负载对应的是OSI网络模型中的第四层,对应的是IP+PORT。
负载均衡的目的
- 提高可用性:通过将请求分散到多个服务器,即使部分服务器出现故障,整个系统仍然可以继续提供服务。
- 增强性能:负载均衡可以提高系统处理大量并发请求的能力,从而提升整体性能。
- 故障转移:当一台服务器发生故障时,负载均衡器可以自动将流量转移到其他健康的服务器上,以避免服务中断。
- 降低延迟:通过选择最佳的服务器来处理请求,减少数据传输的延迟。
- 资源优化:合理分配请求到各个服务器,避免某些服务器过载而其他服务器空闲,优化资源使用。
Nginx的负载均衡调度算法
- 轮询(Round Robin)
轮询是 Nginx 默认的负载均衡算法。它按照顺序依次将请求分配给后端服务器,不考虑服务器的当前负载和响应时间。
- 加权轮询(Weighted Round Robin)
加权轮询是轮询算法的一个变体,它允许为每个服务器分配重权。权重损失的服务器将接收到更多的请求。这种方法可以根据服务器的性能和负载情况动态调整负载分配。
- 最少连接数(Least Connections)
最少连接数算法会将请求分配给当前连接数最少的服务器。这种算法适用于后端服务器性能差异不大的情况。
- 加权最少连接数(Weighted Least Connections)
加权最少连接数算法在最少连接数的基础上引入了权重的概念。权重值越高的服务器,会优先分配更多的请求。
- IP哈希(IP Hash)
IP 哈希算法会根据客户端的 IP 地址进行哈希计算,将请求分配到固定的后端服务器。这种算法可以实现会话保持,即同一个客户端的请求总是被分配到同一个后端服务器。
- URL哈希(URL Hash)
URL 哈希算法会根据请求的 URL 进行哈希计算,将请求分配到固定的后端服务器。这种算法同样可以实现会话保持,适用于基于 URL 的会话管理。
- 随机(Random)
随机算法会随机选择一个后端服务器来处理请求。这种算法简单且不考虑服务器的负载情况。
- 公平(Fair)
公平算法会根据后端服务器的响应时间来分配请求,响应时间越短的服务器会优先分配更多的请求。这种算法需要安装额外的模块(如 ngx_http_upstream_fair_module)。
七层负载均衡实现
环境信息
IP作用系统规格10.0.0.10lb-负载均衡服务器Ubuntu22.042c4g10.0.0.20web-nginx服务器Ubuntu22.042c4g10.0.0.21web-nginx服务器Ubuntu22.042c4gnginx服务器操作
所有nginx服务器操作这一次即可
10.0.0.20服务器配置网页和nginx配置文件- [root@master ~]# mkdir -p /data/nginx/lb
- [root@master ~]# echo '<h1>10.0.0.20<h1/>' >> /data/nginx/lb/index.html
- [root@master ~]# cat /etc/nginx/conf.d/lb.conf
- server{
- listen 1999;
- server_name _;
- root /data/nginx/lb;
- location / {
- index index.html;
- }
- }
- [root@master ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@master ~]# nginx -s reload
复制代码 10.0.0.21服务器配置网页和nginx配置文件- [root@master ~]# mkdir -p /data/nginx/lb
- [root@master ~]# echo '<h1>10.0.0.21<h1/>' >> /data/nginx/lb/index.html
- [root@master ~]# cat /etc/nginx/conf.d/lb.conf
- server{
- listen 1999;
- server_name _;
- root /data/nginx/lb;
- location / {
- index index.html;
- }
- }
- [root@master ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@master ~]# nginx -s reload
复制代码 轮询实操配置
轮询是 Nginx 默认的负载均衡算法。它按照顺序依次将请求分配给后端服务器,不考虑服务器的当前负载和响应时间。
10.0.0.10服务器中操作- [root@lb ~]# cat /etc/nginx/conf.d/lb.conf
- #upstream模块,实现负载均衡和反向代理的核心组件,upstream的名称,也就是lb字段,在同一个nginx服务器中不能重复
- upstream lb {
- server 10.0.0.20:1999;
- server 10.0.0.21:1999;
- }
- server {
- listen 1999;
- server_name lb.huangSir-devops.com;
- location / {
- proxy_pass http://lb;
- #转发客户端请求的域名
- proxy_set_header Host $http_host;
- #记录客户端请求的真实IP地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Real-Ip $remote_addr;
- }
- }
- [root@lb ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb ~]# nginx -s reload
复制代码 使用curl命令测试访问,可以发现后端服务器在20和21之间轮询- [root@lb ~]# curl 10.0.0.10:1999 -H lb.huangSir-devops.com
- <h1>10.0.0.20<h1/>
- [root@lb ~]# curl 10.0.0.10:1999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
- [root@lb ~]# curl 10.0.0.10:1999 -H lb.huangSir-devops.com
- <h1>10.0.0.20<h1/>
- [root@lb ~]# curl 10.0.0.10:1999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
复制代码 加权轮询配置
加权轮询是轮询算法的一个变体,它允许为每个服务器分配重权。权重损失的服务器将接收到更多的请求。这种方法可以根据服务器的性能和负载情况动态调整负载分配。使用weight指令设置权重,权重值越高,分配到的请求越多,默认权重为1
10.0.0.10服务器中操作:- [root@lb ~]# cat /etc/nginx/conf.d/lb_weight.conf
- upstream lb_weight {
- server 10.0.0.20:1999 weight=1;
- server 10.0.0.21:1999 weight=2;
- }
- server {
- listen 2999;
- server_name lb.huangSir-devops.com;
- location / {
- proxy_pass http://lb_weight;
- #转发客户端请求的域名
- proxy_set_header Host $http_host;
- #记录客户端请求的真实IP地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Real-Ip $remote_addr;
- }
- }
- [root@lb ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb ~]# nginx -s reload
复制代码 使用curl命令测试访问,经过测试发现,20和21服务器之间是会进行1:2的次数出现- [root@lb ~]# curl 10.0.0.10:2999 -H lb.huangSir-devops.com
- <h1>10.0.0.20<h1/>
- [root@lb ~]# curl 10.0.0.10:2999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
- [root@lb ~]# curl 10.0.0.10:2999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
- [root@lb ~]# curl 10.0.0.10:2999 -H lb.huangSir-devops.com
- <h1>10.0.0.20<h1/>
- [root@lb ~]# curl 10.0.0.10:2999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
- [root@lb ~]# curl 10.0.0.10:2999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
复制代码 最少连接数配置
最少连接数算法会将请求分配给当前连接数最少的服务器。这种算法适用于后端服务器性能差异不大的情况。
最少连接数配置使用least_conn指令进行配置
10.0.0.10服务器中操作:- [root@lb ~]# cat /etc/nginx/conf.d/lb_least_conn.conf
- upstream lb_least_conn {
- least_conn;
- server 10.0.0.20:1999;
- server 10.0.0.21:1999;
- }
- server {
- listen 3999;
- server_name lb.huangSir-devops.com;
- location / {
- proxy_pass http://lb_least_conn;
- #转发客户端请求的域名
- proxy_set_header Host $http_host;
- #记录客户端请求的真实IP地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Real-Ip $remote_addr;
- }
- }
- [root@lb ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb ~]# nginx -s reload
复制代码 在10机器上使用ab命令进行测试访问,然后查看后面代理的两台服务器的请求日志- [root@lb ~]# apt update -y
- [root@lb ~]# apt install apache2-utils -y
- #-n 100:发送 100 个请求。-c 10:并发数为 10。
- [root@lb ~]# ab -n 100 -c 10 http://lb.huangSir-devops.com:3999/
- This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
- Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
- Licensed to The Apache Software Foundation, http://www.apache.org/
- Benchmarking lb.huangSir-devops.com (be patient).....done
- Server Software: nginx/1.18.0
- Server Hostname: lb.huangSir-devops.com
- Server Port: 3999
- Document Path: /
- Document Length: 19 bytes
- Concurrency Level: 10
- Time taken for tests: 0.023 seconds
- Complete requests: 100
- Failed requests: 0
- Total transferred: 25900 bytes
- HTML transferred: 1900 bytes
- Requests per second: 4287.98 [#/sec] (mean)
- Time per request: 2.332 [ms] (mean)
- Time per request: 0.233 [ms] (mean, across all concurrent requests)
- Transfer rate: 1084.56 [Kbytes/sec] received
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 0 0 0.3 0 2
- Processing: 1 2 0.4 2 3
- Waiting: 0 2 0.5 2 3
- Total: 1 2 0.4 2 4
- Percentage of the requests served within a certain time (ms)
- 50% 2
- 66% 2
- 75% 2
- 80% 2
- 90% 3
- 95% 3
- 98% 3
- 99% 4
- 100% 4 (longest request)
复制代码 加权最少连接数配置
加权最少连接数算法在最少连接数的基础上引入了权重的概念。权重值越高的服务器,会优先分配更多的请求。
最少连接数配置使用least_conn和weight指令进行配置
10.0.0.10服务器中操作:- [root@lb ~]# cat /etc/nginx/conf.d/lb_least_weight.conf
- upstream lb_least_weight {
- least_conn;
- server 10.0.0.20:1999 weight=1;
- server 10.0.0.21:1999 weight=2;
- }
- server {
- listen 4999;
- server_name lb.huangSir-devops.com;
- location / {
- proxy_pass http://lb_least_weight;
- #转发客户端请求的域名
- proxy_set_header Host $http_host;
- #记录客户端请求的真实IP地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Real-Ip $remote_addr;
- }
- }
- [root@lb ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb ~]# nginx -s reload
复制代码 测试过程略
IP哈希配置
IP 哈希算法会根据客户端的 IP 地址进行哈希计算,将请求分配到固定的后端服务器。这种算法可以实现会话保持,即同一个客户端的请求总是被分配到同一个后端服务器。
IP哈希使用ip_hash指令进行配置
10.0.0.10服务器中操作:- [root@lb ~]# cat /etc/nginx/conf.d/lb_ip.conf
- upstream lb_ip {
- #指定ip_hash负载算法
- ip_hash;
- server 10.0.0.20:1999;
- server 10.0.0.21:1999;
- }
- server {
- listen 5999;
- server_name lb.huangSir-devops.com;
- location / {
- proxy_pass http://lb_ip;
- #转发客户端请求的域名
- proxy_set_header Host $http_host;
- #记录客户端请求的真实IP地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Real-Ip $remote_addr;
- }
- }
- [root@lb ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb ~]# nginx -s reload
复制代码 使用curl测试,可以发现连接的服务器都是21- [root@lb ~]# cat /etc/nginx/conf.d/lb_ip.conf
- upstream lb_ip {
- ip_hash;
- server 10.0.0.20:1999;
- server 10.0.0.21:1999;
- }
- server {
- listen 5999;
- server_name lb.huangSir-devops.com;
- location / {
- proxy_pass http://lb_ip;
- #转发客户端请求的域名
- proxy_set_header Host $http_host;
- #记录客户端请求的真实IP地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Real-Ip $remote_addr;
- }
- }
- [root@lb ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb ~]# nginx -s reload
- [root@lb ~]# curl 10.0.0.10:5999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
- [root@lb ~]# curl 10.0.0.10:5999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
- [root@lb ~]# curl 10.0.0.10:5999 -H lb.huangSir-devops.com
- <h1>10.0.0.21<h1/>
复制代码 URL哈希配置
URL 哈希算法会根据请求的 URL 进行哈希计算,将请求分配到固定的后端服务器。这种算法同样可以实现会话保持,适用于基于 URL 的会话管理。
URL哈希配置使用hash指令来进行配置
10.0.0.10服务器中操作:- [root@lb ~]# cat /etc/nginx/conf.d/lb_url.conf
- upstream lb_url {
- server 10.0.0.20:1999;
- server 10.0.0.21:1999;
- }
- server {
- listen 6999;
- server_name lb.huangSir-devops.com;
- location / {
- proxy_pass http://lb_url;
- #转发客户端请求的域名
- proxy_set_header Host $http_host;
- #记录客户端请求的真实IP地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Real-Ip $remote_addr;
- }
- }
- [root@lb ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb ~]# nginx -s reload
复制代码 测试略
随机配置
随机算法会随机选择一个后端服务器来处理请求。这种算法简单且不考虑服务器的负载情况。
随机算法使用random来进行配置
10.0.0.10服务器中操作:- [root@lb ~]# cat /etc/nginx/conf.d/lb_random.conf
- upstream lb_random {
- random;
- server 10.0.0.20:1999;
- server 10.0.0.21:1999;
- }
- server {
- listen 7999;
- server_name lb.huangSir-devops.com;
- location / {
- proxy_pass http://lb_random;
- #转发客户端请求的域名
- proxy_set_header Host $http_host;
- #记录客户端请求的真实IP地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Real-Ip $remote_addr;
- }
- }
- [root@lb ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb ~]# nginx -s reload
复制代码 使用curl命令进行测试,发现符合预期- [root@lb ~]# curl 10.0.0.10:7999 -H huangSir-devops.com
- <h1>10.0.0.20<h1/>
- [root@lb ~]# curl 10.0.0.10:7999 -H huangSir-devops.com
- <h1>10.0.0.21<h1/>
- [root@lb ~]# curl 10.0.0.10:7999 -H huangSir-devops.com
- <h1>10.0.0.20<h1/>
- [root@lb ~]# curl 10.0.0.10:7999 -H huangSir-devops.com
- <h1>10.0.0.21<h1/>
- [root@lb ~]# curl 10.0.0.10:7999 -H huangSir-devops.com
- <h1>10.0.0.21<h1/>
复制代码 四层负载均衡实现
Nginx 实现四层负载均衡主要通过其 stream 模块完成。四层负载均衡工作在网络模型的第四层(传输层),基于 IP 地址和端口号进行流量分发,适用于 TCP 和 UDP 协议。
四层负载均衡主要通过报文中的目标地址和端口来分发流量。当 Nginx 接收到客户端的请求时,它会根据配置的负载均衡策略(如轮询、最少连接等),选择一个后端服务器,并将请求直接转发到该服务器。
相关配置
10.0.0.10服务其配置- [root@lb ~]# cat /etc/nginx/nginx.conf
- user www-data;
- worker_processes auto;
- pid /run/nginx.pid;
- include /etc/nginx/modules-enabled/*.conf;
- events {
- worker_connections 768;
- # multi_accept on;
- }
- #配置四层负载均衡
- stream {
- upstream backend{
- server 10.0.0.20:8848;
- server 10.0.0.21:8848;
- }
- server {
- listen 9999;
- #四层负载均衡没有http协议
- proxy backend;
- proxy_connect_timeout 1s;
- proxy_timeout 3s;
- }
- }
- http {
- #http相关内容
- }
复制代码 测试
10.0.0.20和10.0.0.21分别开启8848端口- [root@master ~]# apt update -y
- [root@master ~]# apt install -y netcat
- [root@master ~]# nc -kl 8848
复制代码 10.0.0.10服务器使用telnet或者nc命令进行测试- [root@lb ~]# echo 'test' | nc 10.0.0.10 9999
- [root@lb ~]# echo 'test' | nc 10.0.0.10 9999
- [root@lb ~]# echo 'test' | nc 10.0.0.10 9999
- [root@lb ~]# echo 'test' | nc 10.0.0.10 9999
复制代码 查看20服务器- [root@master ~]# nc -kl 8848
- test
- test
- test
复制代码 查看21服务器- [root@master ~]# nc -kl 8848
- test
- test
复制代码 nginx配置动静分离
在 Nginx 中实现动静分离是一种常见的优化策略,可以提高网站的响应速度并减轻应用服务器的负载。
动静分离是指将动态请求(如 PHP、JSP、ASP 等)和静态请求(如 HTML、CSS、JavaScript、图片等)分开处理。通过这种方式,可以将静态资源直接由 Nginx 提供,而动态请求则转发到后端应用服务器(如 Tomcat、PHP-FPM 等)
其主要实现方式就是用location的匹配规则将动态或者静态的请求转发到相对应的服务器上
配置实现方式
这里给几个案例,就不进行一一测试了
负载均衡案例
- #动态组
- upstream blog_pools {
- server 172.16.1.7:80;
- server 172.16.1.8:80;
- }
- #静态组
- upstream static_pools {
- server 172.16.1.9:80;
- }
- server {
- listen 80;
- server_name huangSir-devops.com;
- error_log /var/log/blog-error.log notice;
- access_log /var/log/blog-access.log main;
-
- #静态组的转发规则
- location ~* \.(jpg|jpeg|bmp|png|js|css|html)$ {
- proxy_pass http://static_pools;
- proxy_set_header Host $http_host;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X_Real_Ip $remote_addr;
- }
- }
- #动态组的转发规则
- location / {
- proxy_pass http://blog_pools;
- proxy_set_header Host $http_host;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X_Real_Ip $remote_addr;
- }
复制代码 单个nginx实现动静分离
- server {
- listen 80;
- server_name huangSir-devops.com;
- # 静态资源请求
- location ~* \.(jpg|jpeg|png|gif|css|js|ico|html)$ {
- root /var/www/html/static; # 静态资源目录
- expires 30d; # 设置缓存过期时间
- }
- # 动态请求转发到后端应用服务器
- location / {
- proxy_pass http://backend_server; # 后端应用服务器地址
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |