一 负载均衡概述

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. Linux MySQL分库分表之Mycat

      介绍 背景 当表的个数达到了几百千万张表时,众多的业务模块都访问这个数据库,压力会比较大,考虑对其进行分库 当表的数据达到几千万级别,在做很多操作都比较吃力,考虑对其进行分库或分表 数据切分(shar ...

    2. Nginx 如何自定义变量?

      之前的两篇文章 Nginx 变量介绍以及利用 Nginx 变量做防盗链 讲的是 Nginx 有哪些变量以及一个常见的应用.那么如此灵活的 Nginx 怎么能不支持自定义变量呢,今天的文章就来说一下自定 ...

    3. CentOS7 开机进入emergency mode

      今天突然操作了一下磁盘挂载,然后系统启动之后,就直接进入emergency模式了,然后只能输入密码进行救援,截图如下: 突然想了一下最近的一次操作,是因为要挂在镜像,然后每次开机都要挂载一次,觉得比较 ...

    4. 连接 mongodb 数据库 :

      mongodb  数据库: 安装 mongodb  数据库: 安装 mongodb 数据库网址: https://www.mongodb.com/download-center#community 检 ...

    5. 性能测试之JVM的故障分析工具VisualVM

      VisualVM 是随JDK一同发布的jvm诊断工具,通过插件可以扩展很多功能,插件扩展也是其精华所在. 提供了一个可视界面,用于在Java应用程序在Java虚拟机上运行时查看有关Java应用程序的详 ...

    6. 8.eclipse 安装 lombook插件

      参考博客:https://www.liangzl.com/get-article-detail-129979.html

    7. elasticSearch插件metricbeat收集nginx的度量指标

      ngx_http_stub_status_module模块是Nginx中用来统计Nginx服务所接收和处理的请求数量,只要在编译安装Nginx的时候加上参数--with-http_stub_statu ...

    8. could not resolve property(无法解析属性)

      could not resolve property(无法解析属性) 顾名思义在写hql语句的时候,属性写错了! 请检查大小写,是实体类的,不是数据库表的! 一个一个检查,仔细看!

    9. win10 麦克风无法使用,可能是设置了权限

      驱动什么的都正常,平白无故麦克风不好用了,原来是之前自己设置了麦克风权限: 把这个开关打开就可以了. (完)

    10. 使用centos8搭建僵尸毁灭工程(PZ)服务器

      自从领到了阿里云的ECS服务器后,本着既能熟悉linux操作,又能为喜欢的游戏搭建一个可以和朋友一起联机的服务器(游戏提供自建本地服务器极渣)的想法.作为linux小白的我翻遍了网上的资料,用了五天终 ...