一 负载均衡概述
1.1 负载均衡介绍
负载均衡是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。对于Web应用,通过负载均衡,可以将一台服务器的工作扩展到多台服务器中执行,提高整个网站的负载能力。其本质采用一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。二 Nginx负载均衡
2.1 优点
- 高并发连接
- 内存消耗少
- 配置文件非常简单
- 成本低廉
- 支持Rewrite重写规则
- 内置的健康检查功能
- 节省带宽
- 稳定性高
2.2 主要均衡机制
- round-robin:轮询。以轮询方式将请求分配到不同服务器上。
- least-connected:最少连接数。将下一个请求分配到连接数最少的那台服务器上。
- ip-hash:基于客户端的IP地址。散列函数被用于确定下一个请求分配到哪台服务器上。
2.3 负载均衡策略
nginx的负载均衡策略可以划分为两大类:内置策略和扩展策略,扩展策略为第三方提供。 内置策略- 轮询(默认):Nginx根据请求次数,将每个请求均匀分配到每台服务器;
- weight:加权轮询,加权轮询则是在第一种轮询的基础上对后台的每台服务赋予权重,服务器的权重比例越大,被分发到的概率也就越大。
- least_conn:最少连接,将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
- ip_hash:IP 哈希,绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。
- fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
2.4 负载均衡内置变量
nginx负载均衡器内置变量(Embedded Variables),nginx负载均衡模块ngx_http_upstream_module支持下列内置变量:- $upstream_addr:保存一个服务器的IP地址和端口号或者UNIX-domain套接字文件的路径。如果在处理请求过程中使用了多个服务器,那么它们的地址将以逗号分割,例如 :“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。如果一个内置的从一个服务器组到另一个服务器组的重定向使用X-Accel-Redirect” or error_page ,那么那些服务器组以冒号隔开,例如“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。
- $upstream_response_time:保存nginx负载均衡服务器响应时间,以毫秒计。多个响应也以逗号和冒号隔开。
- $upstream_status:保存nginx负载均衡服务器响应代码。多个响应代码也以逗号或冒号隔开。
- $upstream_http_:保存nginx负载均衡服务器响应头字段。例如,the “Server” response header field is made available through the $upstream_http_server variable.注意,只有最后一个服务器响应头字段被保存。
2.5 负载均衡健康检查
nginx反向代理包含内置的或第三方扩展来实现服务器健康检测的。如果后端某台服务器响应失败,nginx会标记该台服务器失效,在特定时间内,请求不分发到该台上。 fail_timeout:该指令定义了多长时间服务器将被标记为失败。在fail_timeout后,服务器还是failed,nginx将检测该服务器是否存活,如果探测成功,将标记为活的。 max_fails:该指令设置在fail_timeout期间内连续的失败尝试。默认情况下,max_fails为1。如果被设置为0,该服务器的健康检测将禁用。2.6 负载均衡状态码
状态 |
概述 |
max_fails | 允许请求失败的次数,默认为1。 |
max_conns | 限制最大接受的连接数。 |
fail_timeout | 在经历了max_fails次失败后,暂停服务的时间。 |
backup | 预留的备份机器。 |
down | 表示当前的server暂时不参与负载均衡。 |
三 默认轮询负载均衡
3.1 环境预设
主机 |
IP |
备注 |
nginx01 | 172.24.10.21 | Nginx负载均衡 |
nginx02 | 172.24.10.22 | 后端RS 01 |
nginx03 | 172.24.10.23 | 后端RS 02 |
nginx04 | 172.24.10.24 | 后端RS 03 |
1 [root@nginx02 ~]# mkdir /usr/share/nginx/balanc/ 2 [root@nginx02 ~]# echo '<h1>Rs_172.24.10.22</h1>' > /usr/share/nginx/balanc/index.html
[root@nginx02 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF server { listen 9090; server_name 172.24.10.22; location / { root /usr/share/nginx/balanc; index index.html; access_log /var/log/nginx/rs.access.log main; error_log /var/log/nginx/rs.error.log warn; } } EOF
1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 2 [root@nginx02 ~]# nginx -s reload #重载配置文件
1 [root@nginx03 ~]# mkdir /usr/share/nginx/balanc/ 2 [root@nginx03 ~]# echo '<h1>Rs_172.24.10.23</h1>' > /usr/share/nginx/balanc/index.html
[root@nginx03 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF server { listen 9090; server_name 172.24.10.23; location / { root /usr/share/nginx/balanc/; index index.html; access_log /var/log/nginx/rs.access.log main; error_log /var/log/nginx/rs.error.log warn; } } EOF
1 [root@nginx03 ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 2 [root@nginx03 ~]# nginx -s reload #重载配置文件
1 [root@nginx04 ~]# mkdir /usr/share/nginx/balanc/ 2 [root@nginx04 ~]# echo '<h1>Rs_172.24.10.24</h1>' > /usr/share/nginx/balanc/index.html
[root@nginx04 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF server { listen 9090; server_name 172.24.10.24; location / { root /usr/share/nginx/balanc/; index index.html; access_log /var/log/nginx/rs.access.log main; error_log /var/log/nginx/rs.error.log warn; } } EOF
[root@nginx04 ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 [root@nginx04 ~]# nginx -s reload #重载配置文件 [root@client ~]# curl 172.24.10.22:9090 <h1>Rs_172.24.10.22</h1> [root@client ~]# curl 172.24.10.23:9090 <h1>Rs_172.24.10.23</h1> [root@client ~]# curl 172.24.10.24:9090 <h1>Rs_172.24.10.24</h1>
3.2 默认轮询方式配置
[root@nginx01 ~]# vi /etc/nginx/conf.d/balance.conf upstream mybalance01 { server 172.24.10.22:9090; server 172.24.10.23:9090; server 172.24.10.24:9090; } server { listen 80; server_name balance.linuxds.com; access_log /var/log/nginx/mybalance.access.log main; error_log /var/log/nginx/mybalance.error.log warn; location / { proxy_pass http://mybalance01; index index.html; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } }
1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 2 [root@balance ~]# nginx -s reload #重载配置文件
3.3 确认测试
浏览器访问:http://balance.linuxds.com/,并且刷新3次测试效果。 回到顶部四 加权轮询负载均衡
4.1 环境预设
参考3.1。4.2 加权轮询方式配置
[root@balance ~]# vi /etc/nginx/conf.d/balance.conf upstream mybalance01 { server 172.24.9.11:9090 weight=1 max_fails=1 fail_timeout=2; server 172.24.9.12:9090 weight=8 max_fails=2 fail_timeout=2; server 172.24.9.13:9090 backup; #配置为备份服务器 } server { listen 80; server_name balance.linuxds.com; access_log /var/log/nginx/mybalance.access.log main; error_log /var/log/nginx/mybalance.error.log warn; location / { proxy_pass http://mybalance01; index index.html; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 2 [root@balance ~]# nginx -s reload #重载配置文件配置释义: weight:参数值越高则被分配到的概率越大。
4.3 确认测试
浏览器访问:http://balance.odocker.com/,并且刷新3次测试效果。此时测试172.24.9.12更容易被分配,172.24.9.13在其他RS正常的时候不会参与响应。五 最小连接负载均衡
5.1 环境预设
参考3.1。5.2 最小连接方式配置
[root@balance ~]# vi /etc/nginx/conf.d/balance.conf upstream mybalance01 { least_conn; server 172.24.10.21:9090; server 172.24.10.22:9090; server 172.24.10.23:9090; } server { listen 80; server_name balance.linuxds.com; access_log /var/log/nginx/mybalance.access.log main; error_log /var/log/nginx/mybalance.error.log warn; location / { proxy_pass http://mybalance01; index index.html; } }
1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 2 [root@balance ~]# nginx -s reload #重载配置文件
5.3 确认测试
浏览器访问:http://balance.linuxds.com/。 提示:此方式主要应用于请求处理时间长短不一造成服务器过载的情况。六 IP hash负载均衡
6.1 环境预设
参考3.1。6.2 ip hash方式配置
[root@balance ~]# vi /etc/nginx/conf.d/balance.conf upstream mybalance01 { ip_hash; server 172.24.10.21:9090; server 172.24.10.22:9090; server 172.24.10.23:9090; } server { listen 80; server_name balance.linuxds.com; access_log /var/log/nginx/mybalance.access.log main; error_log /var/log/nginx/mybalance.error.log warn; location / { proxy_pass http://mybalance01; index index.html; } }
1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 2 [root@balance ~]# nginx -s reload #重载配置文件
6.3 确认测试
浏览器访问:http://balance.linuxds.com/。 提示:此方式主要应用于会话保持。七 fair负载均衡
7.1 环境预设
参考3.1。7.2 fair方式配置
[root@balance ~]# vi /etc/nginx/conf.d/balance.conf upstream mybalance01 { fair; server 172.24.10.21:9090; server 172.24.10.22:9090; server 172.24.10.23:9090; } server { listen 80; server_name balance.linuxds.com; access_log /var/log/nginx/mybalance.access.log main; error_log /var/log/nginx/mybalance.error.log warn; location / { proxy_pass http://mybalance01; index index.html; } }
1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 2 [root@balance ~]# nginx -s reload #重载配置文件
7.3 确认测试
浏览器访问:http://balance.linuxds.com/。 提示:该方式下响应快的服务器都会优先分配,接着才会分配响应速度较慢的服务器。因此此方式主要应用于后端服务器性能不均一。八 url_hash负载均衡
8.1 环境预设
参考3.1。8.2 ip hash方式配置
[root@balance ~]# vi /etc/nginx/conf.d/balance.conf upstream mybalance01 { hash $request_uri; hash_method crc32; server 172.24.10.21:9090; server 172.24.10.22:9090; server 172.24.10.23:9090; } server { listen 80; server_name balance.linuxds.com; access_log /var/log/nginx/mybalance.access.log main; error_log /var/log/nginx/mybalance.error.log warn; location / { proxy_pass http://mybalance01; index index.html; } }
1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf #检查配置文件 2 [root@balance ~]# nginx -s reload #重载配置文件