Nginx负载均衡

本文详细介绍了Nginx作为负载均衡器的工作原理和配置方法,包括集群概念、特点、分类以及Nginx负载均衡服务的准备和部署。通过设置不同调度策略,如轮询、权重分配、热备和错误重试,实现负载均衡。同时,讲解了如何根据用户访问URI和user-agent进行负载均衡,确保服务的高效性和可用性。
摘要由CSDN通过智能技术生成


nginx负载均衡概念

集群

集群介绍

简而言之,集群就是指一组相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点都是运行各自服务的独立服务器。这些服务器之间可以相互通信,协同向用户提供应用程序、系统资源和数据,并以单一系统的模式加以管理。当用户请求集群系统时,集群对用户来说就是一个单一独立的服务器。
中等规模网站集群架构逻辑图

集群特点

  • 高性能(Performance):集群的高性能只有在并发或总请求数量超过单台服务器的承受能力时,服务器集群才会体现出优势;
  • 价格有效性(Cost-effectiveness):在达到同样性能需求条件下,采用计算机集群架构比采用同等运算能力的大型计算机具有更高的性价比;
  • 可伸缩性(Scalability):当服务负载、压力增长时,针对集群系统进行简单的扩展即可满足需求,且不会降低服务质量;
  • 高可用性(Availability):在集群中,即使部分硬件或软件发生故障,但整个系统的服务仍可以保证7x24h可用;
  • 透明性(Transparency):多个独立计算机组成的松耦合集群系统构成的一个虚拟服务器,用户访问集群系统时就像访问一台高性能高可用的服务器一样,集群中一部分服务器的上线、下线不会中断整个系统服务,对用户都是透明的;
  • 可管理性(Manageability):整个系统可能在物理上很大范围,但是管理起来就像管理一个系统一样。在理想状况下,软硬件模块的插入能做到即插即用;
  • 可编程性(Programmability):在集群系统上,容易开发及修改各类应用程序。

集群分类

集群常见分类可以分为:

  • 负载均衡集群(Load balancing clusters),简称LBC或者LB:负载均衡集群可以把很多用户集中的访问请求负载压力尽可能平均的分摊在计算机集群中处理。客户访问请求负载通常包括应用程序处理负载和网络流量负载,负载均衡集群的每个节点都可以承担一定的访问请求负载压力,并实现负载请求在各节点之间的动态分配,以实现负载均衡。
  • 高可用性集群(High-availability(HA)clusters),简称HAC:一般指的是集群中任意一个节点失效的情况下,该节点上的所有任务会自动转移到其他正常的节点上。高可用性集群的主要目的是使集群的整体服务尽可能可用,使得服务器系统的运行速度和响应速度尽可能的快。它们经常利用在多台机器上运行的冗余节点和服务来相互追踪。常用于不易于实现负载均衡的应用,如负载均衡器、主数据库、主存储对之间。
  • 高性能计算集群(High-performance(HP)clusters),简称HPC:高性能计算集群也称为并行计算,高性能计算集群对外就像是一个超级计算机,内部由数十至上万个独立服务器组成,并且在公共消息传递层上进行通信并运行并行应用程序。

负载均衡集群

负载均衡服务需求

负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方式来扩展网络设备和服务器的负载、带宽和吞吐量,同时加强了网络数据处理能力,提高了网络的灵活性和可用性。在负载均衡集群中,同组集群的所有计算机节点都应该提供相同的服务。搭建负载均衡服务的需求如下:

  • 将单台计算机无法承受的大规模并发访问或数据流量分担到多台结点设备分别进行处理,减少用户等待响应时间,提升用户体验;
  • 单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总返回给用户,系统处理能力得到大幅提高;
  • 7 x 24h服务保证,任意一个或多个有限节点设备宕机,不影响业务的正常运行。

nginx负载均衡服务

严格来说,nginx仅作为nginx proxy反向代理使用,但该反向代理功能表现的效果是负载均衡集群的效果,因此称之为nginx负载均衡。

反向代理和负载均衡的区别:

  • 负载均衡软件(如LVS)实现的功能只是对请求数据包的转发/改写、传递,其中DR模式明显的特征是从负载均衡下面的节点服务器来看,收到的请求还是来自访问负载均衡器的客户端的真实用户;
  • 反向代理在接受访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问节点服务器的客户端用户就是反向代理服务器,而不是真实的客户端用户。
    反向代理

实现nginx负载均衡主要需要两个组件模块:

  • ngx_http_proxy_module:proxy代理模块,用于将请求抛给服务器节点或upstream服务器池;
  • ngx_http_upstream_module:负载均衡模块,可以实现网站的负载均衡功能以及节点的健康检查。

nginx负载均衡准备

硬件准备

主机名内网IP外网IP说明
lb0110.0.0.5172.16.1.5Nginx主负载均衡器
lb0210.0.0.6172.16.1.6Nginx辅负载均衡器
web0110.0.0.7172.16.1.7Web01服务器
web0210.0.0.8172.16.1.8Web02服务器

软件准备

  • 系统:CentOS 7
  • 软件:nginx/1.20.1

Web集群部署

注意:集群中每台服务器的配置一模一样

企业部署步骤:

  1. 先部署好一台LNMP服务器,上传代码信息;
  2. 访问测试;
  3. 批量部署多台Web服务器;
  4. 将Nginx配置文件进行分发;
  5. 将站点目录进行分发。

nginx负载均衡部署

部署过程

  1. 安装部署nginx软件

    [root@lb01 ~]# scp -rp 172.16.1.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
    [root@lb01 yum.repos.d]# yum install -y nginx
    
  2. 编写nginx负载服务配置文件

    [root@lb01 ~]# cd /etc/nginx/
    [root@lb01 nginx]# cp nginx.conf{,.bak}    # 备份配置文件
    [root@lb01 nginx]# grep -Ev '^$|#' nginx.conf.bak > nginx.conf    # 去除文件空行和注释行
    [root@lb01 nginx]# cd conf.d/
    [root@lb01 conf.d]# ls
    default.conf
    [root@lb01 conf.d]# grep -Ev '^$|#' default.conf > lb.conf    # 去除文件空行和注释行生成负载配置文件
    [root@lb01 conf.d]# ls
    default.conf  lb.conf
    
    [root@lb01 conf.d]# vim lb.conf
    upstream hello {    # 定义将请求分配给哪些Web服务器(集群)
        server 10.0.0.7:80;
        server 10.0.0.8:80;
    }
    
    server {
        listen       80;
        server_name  blog.hello.com;
        location / { 
            proxy_pass http://hello;    # 将请求分配给指定的集群(blog)
        }   
    }   
    
  3. 实现功能测试
    搭建集群测试环境

    [root@web01 ~]# for name in www bbs blog ; do echo "$name $(hostname -i)" > /usr/share/nginx/html/$name/test.html ; done
    

    Linux hosts解析文件

    10.0.0.7        www.hello.com blog.hello.com bbs.hello.com
    

    Windows hosts解析文件

    10.0.0.5	www.hello.com bbs.hello.com blog.hello.com
    

    Windows浏览器输入www.hello.com/test.html并刷新测试:客户端首先通过DNS解析访问10.0.0.5负载均衡服务器,而后负载均衡服务器作为客户端访问配置文件中的集群中的服务器10.0.0.7和10.0.0.8。

排错思路

  1. 负载均衡服务器上, 测试后端web节点服务器是否能够正常访问(负载均衡服务器到Web服务器访问阶段有无问题).

    [root@lb01 ~]# curl -H host:www.hello.com 10.0.0.7/test.html
    www 172.16.1.7
    [root@lb01 ~]# curl -H host:www.hello.com 10.0.0.8/test.html
    www 172.16.1.8
    
  2. 负载均衡服务器上, 利用curl命令访问负载均衡服务器.

    [root@lb01 ~]# curl -H host:www.hello.com 10.0.0.5/test.html
    www 172.16.1.7
    [root@lb01 ~]# curl -H host:www.hello.com 10.0.0.5/test.html
    www 172.16.1.8
    

    如果负载均衡服务器有问题,检查主配置文件/etc/nginx/nginx.conf和负载均衡文件/etc/nginx/conf.d/lb.conf。

  3. 打开xshell连接,ping www.moox.com.

  4. 配置文件编写不正确.

nginx负载均衡模块

ngx_http_upstream_module

实现不同调度功能

  1. 轮询分配请求(平均)

    [root@lb01 conf.d]# vim lb.conf
    upstream hello {    
        server 10.0.0.7:80;
    	server 10.0.0.8:80;
    }
    
  2. 权重分配请求(weight)

    [root@lb01 conf.d]# vim lb.conf
    upstream hello {    
        server 10.0.0.7:80 weight=2;    # 权重值越大,责任越大
    	server 10.0.0.8:80 weight=1;
    }
    
  3. 实现热备功能(backup)
    热备配置(RS节点的高可用),当前面激活的RS都失败后会自动启用热备RS,这表示该服务器作为备份服务器,若主服务器全部宕机,就会向它转发请求(注意:当负载均衡算法为ip_hash时,后端服务器再负载均衡调度中的状态不能是weight和backup)。

    [root@lb01 conf.d]# vim lb.conf
    upstream hello {    
        server 10.0.0.7:80;
    	server 10.0.0.8:80;
    	server 10.0.0.9:80 backup;    # 只有当7,8两台服务器都不能使用时,backup才能使用
    }
    
  4. 定义最大失败次数(max_fails)
    Nginx尝试连接后端主机失败的次数,该值配合proxy_next_upstream、fastcgi_next_upstream、memcached_next_upstream这三个参数来使用。当nginx接受后端服务器返回这三个参数定义的状态码时(如404、502、503等),会将这个请求转发给正常工作的后端服务器。max_fails的默认值为1.

    [root@lb01 conf.d]# vim lb.conf
    upstream hello {    
        server 10.0.0.7:80 max_fails=5;    # 最大失败次数,默认为1次
    	server 10.0.0.8:80;
    }
    
  5. 定义失败之后重发的间隔时间(fail_timeout)
    fail_timeout=10s 在间隔时间过去后,会再给连接失败的服务器一次机会。结合max_fails=5来看,在检测5次之后都失败后,根据fail_timeout的值,等待10s再检查,而且只检查一次(在不进行nginx配置的情况下,每隔10s都只检查一次)。

实现不同调度算法

  • rr 轮询调度算法;
  • wrr 权重调度算法;
  • ip_hash 算法(出现反复登录的情况,可通过缓存服务器解决;也可通过IP_HASH算法解决,但由于NAT转换,有可能造成负载不均的情况发生);
  • least_conn 根据服务器连接数分配资源(分配给连接少的服务器).

ngx_http_proxy_module

proxy_set_header Host

访问不同的网站地址,为何显示相同的网站页面?如何解决?proxy_set_header Host

例:访问测试www.hello.com、blog.hello.com、bbs.hello.com时,得到的都是同一结果。这是因为在负载均衡服务器访问Web服务器时,将集群名称hello当作请求host,因此请求的是满足hello的第一个server。在Web服务器的nginx.conf配置文件include顺序影响先访问哪个server,conf
.d目录中配置文件默认顺序也影响了先访问哪个server。

[root@lb01 ~]# curl -H host:blog.hello.com 10.0.0.5/test.html
bbs 172.16.1.7
[root@lb01 ~]# curl -H host:www.hello.com 10.0.0.5/test.html
bbs 172.16.1.8
[root@lb01 ~]# curl -H host:bbs.hello.com 10.0.0.5/test.html
bbs 172.16.1.7

可以通过proxy_set_header修改host信息,将负载均衡服务器的host信息替换成用户的host信息解决此问题。
在这里插入图片描述
再次测试即可实现访问不同的网站页面

[root@lb01 ~]# curl -H host:bbs.hello.com 10.0.0.5/test.html
bbs 172.16.1.7
[root@lb01 ~]# curl -H host:www.hello.com 10.0.0.5/test.html
www 172.16.1.8
[root@lb01 ~]# curl -H host:blog.hello.com 10.0.0.5/test.html
blog 172.16.1.7

proxy_set_header X-Forwarded-For

访问网站用户地址信息无法进行分析统计,如何解决? proxy_set_header X-Forwarded-For

在统计访问地址时, /var/log/nginx/access.log中第一列是web主机地址或负载均衡服务器主机地址,
最后一列是客户端主机地址,在/etc/nginx/nginx.conf的日志格式中,log_format中定义的最后一个字段"$http_x_forwarded_for"即用于记录真实的客户IP地址。
X_Forward_for
修改配置文件信息后再次测试

[root@web01 ~]# tail -f /var/log/nginx/access.log
10.0.0.5 - - [16/Aug/2021:23:32:48 +0800] "GET /test.html HTTP/1.0" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" "10.0.0.1"
10.0.0.5 - - [16/Aug/2021:23:32:50 +0800] "GET /test.html HTTP/1.0" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" "10.0.0.1"

proxy_next_upstream

访问负载均衡出现错误页面,影响用户体验,如何解决?proxy_next_upstream

server {
    listen       80;
    server_name  blog.hello.com;
    location / {
        proxy_pass http://hello;
        proxy_set_header Host $host;
        proxy_set_header X-Forward-For $remote_addr;
        proxy_next_upstream error timeout http_404 http_502 http_403;    # 只要出现问题,就跳过该节点,访问下一个节点
    }
}

nginx负载均衡应用

根据用户的访问URI进行负载均衡

在这里插入图片描述
根据URI的信息,将页面请求动静分离,分别部署不同的集群,提高网站服务安全性。

  1. 架构环境规划

    目录集群名称
    /usr/share/nginx/html/www/staticstatic 10.0.0.7:80static服务器集群
    /usr/share/nginx/html/www/uploadupload 10.0.0.8:80upload服务器集群
    /usr/share/nginx/html/www/default 10.0.0.9:80default服务器集群

    Web01环境部署

    [root@web01 ~]# mkdir /usr/share/nginx/html/www/static
    [root@web01 ~]# echo "static_colony_10.0.0.7" > /usr/share/nginx/html/www/static/test.html
    

    Web02环境部署

    [root@web02 ~]# mkdir /usr/share/nginx/html/www/upload
    [root@web02 ~]# echo "upload_colony_10.0.0.8" > /usr/share/nginx/html/www/upload/test.html
    

    Web03环境部署

    [root@web03 ~]# echo "default_colony_10.0.0.9" > /usr/share/nginx/html/www/test.html
    
  2. 编写负载均衡配置文件
    编辑负载均衡服务器配置文件/etc/nginx/conf.d/lb.conf

    [root@lb01 conf.d]# vim lb.conf
    # 集群部分 upstream
    upstream static {    # static集群
        server 10.0.0.7:80;
    }
    
    upstream upload {    # upload集群
        server 10.0.0.8:80;
    }
    
    upstream default {    # default集群
        server 10.0.0.9:80;
    }
    
    server {
        listen       80;
        server_name  www.hello.com;
        
        location / {
            proxy_pass http://default;    # 将默认请求分配给default集群
        	proxy_set_header Host $host;
        	proxy_set_header X-Forwarded-For $remote_addr;
    	    proxy_next_upstream error timeout http_404 http_502 http_403;
        }
        
        location /upload { 
            proxy_pass http://upload;    # 将对upload的请求分配给upload集群
    	    proxy_set_header Host $host;
    	    proxy_set_header X-Forwarded-For $remote_addr;
    	    proxy_next_upstream error timeout http_404 http_502 http_403;
        }
        
        location /static {
            proxy_pass http://static;    # 将对static的请求分配给static集群
    	    proxy_set_header Host $host;
        	proxy_set_header X-Forwarded-For $remote_addr;
        	proxy_next_upstream error timeout http_404 http_502 http_403;
        }
    }
    

根据用户的user-agent进行负载均衡

  1. 架构环境规划

    终端网站集群名称
    iphonewww.hello.comiphone_access 10.0.0.7:80mobile移动端集群
    谷歌www.hello.comgoogle_access 10.0.0.8:80web集群
    IEwww.hello.comdefault_access 10.0.0.8:80default端集群

    Web01环境部署

    [root@web01 ~]# echo "iphone_access 10.0.0.7" > /usr/share/nginx/html/www/test.html
    

    Web02环境部署

    [root@web02 ~]# echo "google_access 10.0.0.8" > /usr/share/nginx/html/www/test.html
    

    Web03环境部署

    [root@web03 ~]# echo "default_access 10.0.0.9" > /usr/share/nginx/html/www/test.html
    
  2. 编写负载均衡配置文件

    [root@lb01 conf.d]# vim lb.conf
    [root@lb01 conf.d]# cat lb.conf
    upstream mobile {
        server 10.0.0.7:80;
    }
    
    upstream web {
        server 10.0.0.8:80;
    }
    
    upstream default {
        server 10.0.0.9:80;
    }
    
    server {
        listen       80;
        server_name  www.hello.com;
        location / {
            if ($http_user_agent ~* iphone) {    # 正则匹配到iphone,则将请求分配到mobile集群
                proxy_pass http://mobile;
            }
            if ($http_user_agent ~* Chrome) {    # 正则匹配到Chrome,则将请求分配到web集群
                proxy_pass http://web;
            }
    	proxy_pass http://default;    # 其余请求分配到default集群          
    
    	proxy_set_header Host $host;
    	proxy_set_header X-Forwarded-For $remote_addr;
    	proxy_next_upstream error timeout http_404 http_502 http_403;
        }
    }
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值