一 负载均衡概述

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定向到同一个后端服务器,后端服务器为缓存时比较有效。
  • 提示:默认轮询可能存在一个问题,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,其登录信息会丢失。因为在负载均衡系统中,每次请求都会重新定位到服务器集群中的某一个,那么就会导致已经登录某一个服务器的用户在重新定位到另一个服务器了,所以就会导致丢失登录信息。


    因此针对如上问题,可以采用ip_hash方式解决,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

    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
    所有节点安装Nginx:略
    配置RS测试页面:
      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
      1 [root@nginx02 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
    2 server {
    3 listen 9090;
    4 server_name 172.24.10.22;
    5 location / {
    6 root /usr/share/nginx/balanc;
    7 index index.html;
    8 access_log /var/log/nginx/rs.access.log main;
    9 error_log /var/log/nginx/rs.error.log warn;
    10 }
    11 }
    12 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
      1 [root@nginx03 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
    2 server {
    3 listen 9090;
    4 server_name 172.24.10.23;
    5 location / {
    6 root /usr/share/nginx/balanc/;
    7 index index.html;
    8 access_log /var/log/nginx/rs.access.log main;
    9 error_log /var/log/nginx/rs.error.log warn;
    10 }
    11 }
    12 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
      1 [root@nginx04 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
    2 server {
    3 listen 9090;
    4 server_name 172.24.10.24;
    5 location / {
    6 root /usr/share/nginx/balanc/;
    7 index index.html;
    8 access_log /var/log/nginx/rs.access.log main;
    9 error_log /var/log/nginx/rs.error.log warn;
    10 }
    11 }
    12 EOF
      1 [root@nginx04 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
    2 [root@nginx04 ~]# nginx -s reload #重载配置文件
    3 [root@client ~]# curl 172.24.10.22:9090
    4 <h1>Rs_172.24.10.22</h1>
    5 [root@client ~]# curl 172.24.10.23:9090
    6 <h1>Rs_172.24.10.23</h1>
    7 [root@client ~]# curl 172.24.10.24:9090
    8 <h1>Rs_172.24.10.24</h1>

    3.2 默认轮询方式配置

      1 [root@nginx01 ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 server 172.24.10.22:9090;
    4 server 172.24.10.23:9090;
    5 server 172.24.10.24:9090;
    6 }
    7
    8 server {
    9 listen 80;
    10 server_name balance.linuxds.com;
    11 access_log /var/log/nginx/mybalance.access.log main;
    12 error_log /var/log/nginx/mybalance.error.log warn;
    13 location / {
    14 proxy_pass http://mybalance01;
    15 index index.html;
    16 proxy_redirect off;
    17 proxy_set_header Host $host;
    18 proxy_set_header X-Real-IP $remote_addr;
    19 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    20 client_max_body_size 10m; #允许客户端请求的最大单文件字节数
    21 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
    22 proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时)
    23 proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
    24 proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
    25 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    26 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
    27 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
    28 proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    29 }
    30 }
      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 加权轮询方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 server 172.24.9.11:9090 weight=1 max_fails=1 fail_timeout=2;
    4 server 172.24.9.12:9090 weight=8 max_fails=2 fail_timeout=2;
    5 server 172.24.9.13:9090 backup; #配置为备份服务器
    6 }
    7
    8 server {
    9 listen 80;
    10 server_name balance.linuxds.com;
    11 access_log /var/log/nginx/mybalance.access.log main;
    12 error_log /var/log/nginx/mybalance.error.log warn;
    13 location / {
    14 proxy_pass http://mybalance01;
    15 index index.html;
    16 proxy_redirect off;
    17 proxy_set_header Host $host;
    18 proxy_set_header X-Real-IP $remote_addr;
    19 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    20 client_max_body_size 10m;
    21 client_body_buffer_size 128k;
    22 proxy_connect_timeout 300;
    23 proxy_send_timeout 300;
    24 proxy_read_timeout 300;
    25 proxy_buffer_size 4k;
    26 proxy_buffers 4 32k;
    27 proxy_busy_buffers_size 64k;
    28 proxy_temp_file_write_size 64k;
    29 }
    30 }
    配置释义:
    weight:参数值越高则被分配到的概率越大。

    4.3 确认测试

    浏览器访问:http://balance.odocker.com/,并且刷新3次测试效果。此时测试172.24.9.12更容易被分配,172.24.9.13在其他RS正常的时候不会参与响应。

    五 最小连接负载均衡

    5.1 环境预设

    参考3.1。

    5.2 最小连接方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 least_conn;
    4 server 172.24.10.21:9090;
    5 server 172.24.10.22:9090;
    6 server 172.24.10.23:9090;
    7 }
    8
    9 server {
    10 listen 80;
    11 server_name balance.linuxds.com;
    12 access_log /var/log/nginx/mybalance.access.log main;
    13 error_log /var/log/nginx/mybalance.error.log warn;
    14 location / {
    15 proxy_pass http://mybalance01;
    16 index index.html;
    17 }
    18 }

    5.3 确认测试

    浏览器访问:http://balance.linuxds.com/。
    提示:此方式主要应用于请求处理时间长短不一造成服务器过载的情况。



    六 IP hash负载均衡

    6.1 环境预设

    参考3.1。

    6.2 ip hash方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 ip_hash;
    4 server 172.24.10.21:9090;
    5 server 172.24.10.22:9090;
    6 server 172.24.10.23:9090;
    7 }
    8
    9 server {
    10 listen 80;
    11 server_name balance.linuxds.com;
    12 access_log /var/log/nginx/mybalance.access.log main;
    13 error_log /var/log/nginx/mybalance.error.log warn;
    14 location / {
    15 proxy_pass http://mybalance01;
    16 index index.html;
    17 }
    18 }

    6.3 确认测试

    浏览器访问:http://balance.linuxds.com/。
    提示:此方式主要应用于会话保持。



    七 fair负载均衡

    7.1 环境预设

    参考3.1。

    7.2 fair方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 fair;
    4 server 172.24.10.21:9090;
    5 server 172.24.10.22:9090;
    6 server 172.24.10.23:9090;
    7 }
    8
    9 server {
    10 listen 80;
    11 server_name balance.linuxds.com;
    12 access_log /var/log/nginx/mybalance.access.log main;
    13 error_log /var/log/nginx/mybalance.error.log warn;
    14 location / {
    15 proxy_pass http://mybalance01;
    16 index index.html;
    17 }
    18 }

    7.3 确认测试

    浏览器访问:http://balance.linuxds.com/。
    提示:该方式下响应快的服务器都会优先分配,接着才会分配响应速度较慢的服务器。因此此方式主要应用于后端服务器性能不均一。



    八 url_hash负载均衡

    8.1 环境预设

    参考3.1。

    8.2 ip hash方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 hash $request_uri;
    4 hash_method crc32;
    5 server 172.24.10.21:9090;
    6 server 172.24.10.22:9090;
    7 server 172.24.10.23:9090;
    8 }
    9
    10 server {
    11 listen 80;
    12 server_name balance.linuxds.com;
    13 access_log /var/log/nginx/mybalance.access.log main;
    14 error_log /var/log/nginx/mybalance.error.log warn;
    15 location / {
    16 proxy_pass http://mybalance01;
    17 index index.html;
    18 }
    19 }

    8.3 确认测试

    浏览器访问:http://balance.linuxds.com/。
    提示:此方式主要应用于后端服务器为缓存时比较适用。


    参考文档:
    https://ifeve.com/nginx-http/
    https://www.cnblogs.com/lcword/p/11800474.html

    012.Nginx负载均衡的更多相关文章

    1. 对比Haproxy和Nginx负载均衡效果

      为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析.下面说下这两种负载均衡环境下抓包 ...

    2. nginx负载均衡集群

      nginx负载均衡集群  0.前言:nginx 负载均衡,属于网络7层模型中的应用层,说白了就是一个代理,要用 upstrem 模块实现,代理则用proxy模块 1.可以针对域名做转发,lvs只能针对 ...

    3. 手把手教你玩转nginx负载均衡(二)----安装虚拟机操作系统

      引言 在上一篇,我们组装好了虚拟机的硬件部分,那么现在我们就要把操作系统装上了,既然是服务器,那么安装linux操作系统是个比较好的选择,如果你喜欢的话,安装windows也是没有任何问题的 我这里选 ...

    4. nginx负载均衡基于ip_hash的session粘帖

      nginx负载均衡基于ip_hash的session粘帖 nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除 ...

    5. Net分布式系统之二:CentOS系统搭建Nginx负载均衡

      一.关于CentOS系统介绍 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat ...

    6. Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用

      上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行.针对系统架构设计的高可用要求,我们需要解决Nginx ...

    7. 配置nginx负载均衡

      配置nginx负载均衡 执行命令:vi /usr/local/nginx/sbin/nginx/conf/nginx.conf 修改为: worker_processes  2; events {   ...

    8. 烂泥:nginx负载均衡

      本文由秀依林枫提供友情赞助,首发于烂泥行天下. 今天我们来学习下有关nginx的负载均衡配置.nginx的负载均衡是通过nginx的upstream模块和proxy_pass反向代理来实现的. 说明: ...

    9. nginx负载均衡集群中的session共享说明

      在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...

    随机推荐

    1. 挖洞入门_显错型SQL注入

      简介:在漏洞盒子挖洞已经有一段时间了,虽说还不是大佬,但技术也有所进步,安全行业就是这样,只有自己动手去做,才能将理论的知识变为个人的经验.本篇文章打算分享一下我在挖显错型SQL注入漏洞过程中的一些个 ...

    2. spring cloud config 配置文件更新

      Spring Cloud Config Server 作为配置中心服务端 拉取配置时更新 git 仓库副本,保证是最新结果 支持数据结构丰富,yml, json, properties 等 配合 eu ...

    3. 题解 - 【NOI2015】维修数列

      题面大意: 使用平衡树维护一个数列,支持插入,修改,删除,翻转,求和,求最大和这 \(6\) 个操作. 题意分析: Splay 裸题,几乎各种操作都有了,这个代码就发给大家当个模板吧. 最后求最大和的 ...

    4. JDK8--08:Optional

      在程序运行时,空指针异常应该是最常见的异常之一,因此JDK8提供了Optional来避免空指针异常. 首先说明JDK8新增的Optional及相关方法的使用 Optional的常用操作: Option ...

    5. js语法基础入门(5.2)

      5.2.循环结构 当一段代码被重复调用多次的时候,可以用循环结构来实现,就像第一个实例中出现的场景一样,需要重复询问对方是否有空,这样就可以使用循环结构来搞定 5.2.1.for循环语句 //语法结构 ...

    6. C# Thread、lock

      class Program { private static readonly object obj = new object(); static void Main(string[] args) { ...

    7. 【Flutter 实战】简约而不简单的计算器

      老孟导读:这是 [Flutter 实战]组件系列文章的最后一篇,其他组件地址:http://laomengit.com/guide/widgets/Text.html,接下来将会讲解动画系列,关注老孟 ...

    8. hive中left semi join 与join 的区别

      LEFT SEMI JOIN:左半开连接会返回左边表的记录,前提是其记录对于右边表满足ON语句中的判定条件.对于常见的内连接(INNER JOIN),这是一个特殊的,优化了的情况.大多数的SQL方言会 ...

    9. 4 个好用的 Linux 监控工具

      下面是 Linux 下 4 个日常使用率非常高的监控工具,可以帮助我们准确快速的诊断系统问题. 1. iotop 如果你想知道某些进程使用了多少你宝贵的 I/O 资源,那么就使用 iotop 吧. i ...

    10. 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译

      源码学习第一步,Spring源码编译 之所以写这么一篇文章是因为群里的小伙伴在编译源码时碰到了问题,再加上笔者自身正准备做一个源码的注释版本,恰好也需要重新编译一份代码,至于为什么要将源码编译到本地就 ...