一 负载均衡概述

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. vc6.0打开类向导时报错-Parsing error: Expected ";".Input Line: "解决方法

      --------------------------- Microsoft Visual C++ --------------------------- Parsing error:  Expecte ...

    2. AbstractQueuedSynchronizer和ReentranLock基本原理

      先把我主要学习参考的文章放上来先,这篇文章讲的挺好的,分析比较到位,最好是先看完这篇文章,在接下去看我写的.不然你会一脸懵逼,不过等你看完这篇文章,可能我的文章对你也用途不大了 深入分析Abstrac ...

    3. SQL注入之MySQL常用的查询语句

      MySQL是一种使用很广的数据库,大部分网站都是用MySQL,所以熟悉对MySQL数据库的注入很重要. 首先来说下MySQL注入的相关知识点 在MySQL5.0版本之后,MySQL默认在数据库存放一个 ...

    4. Spring Boot入门系列(十六)使用pagehelper实现分页功能

      之前讲了Springboot整合Mybatis,然后介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.接下来要说一说Mybatis 的分页 ...

    5. windows下 react-native环境搭建

      跟着慕课网做案例,搭建rn环境遇到很大问题. 下面说一下: 首先看一下文档:http://reactnative.cn/docs/0.44/getting-started.html#content 注 ...

    6. SpringBoot中Service实现类添加@Service却任然无法注入的问题

      最近一直在研究Spring Boot.从GitHub上下载了一个my-Blog源码,一边看,一边自己尝试去实现,结果掉在坑了,研究了近一周才爬出来,特地来这博客园记录下来,一是避免自己在放这样的错误, ...

    7. 一.3.序列化使用之idc资源与api文档

      前后端分离,前端写前端的,后端写后端的,但是它们中间得有一个api文档 1.idc资源 (1)models.py: from django.db import models class Idc(mod ...

    8. 利用binarySearch实现抽奖计算逻辑

      前言 我们平时抽奖总感觉想抽到最高的奖那么难,哈哈当然不会那么容易啦,正巧写了个抽奖的功能,趁着有时间把抽奖的功能实现整理一下,我们要抽奖首先要定义一个奖品的实体类,这个实体类中包含奖品的基本信息,比 ...

    9. 为什么是link-visited-hover-active原理这样的特殊

      前言 通常我们在设置链接的一些伪类(link,visited,hover,active)样式时,要让不同的状态显示正确的样式,我们需要按一定的顺序设置这些伪类的样式.这里我就按css2规范中推荐的顺序 ...

    10. MySQL实验 内连接优化order by+limit 以及添加索引再次改进

      MySQL实验 内连接优化order by+limit 以及添加索引再次改进 在进行子查询优化双参数limit时我萌生了测试更加符合实际生产需要的ORDER BY + LIMIT的想法,或许我们也可以 ...