Linux Nginx 负载均衡

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

  • 软/硬件负载均衡

软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。

软件解决方案缺点也较多,因为每台服务器上安装额外的软件运行会消耗系统不定量的资源,越是功能强大的模块,消耗得越多,所以当连接请求特别大的时候,软件本身会成为服务器工作成败的一个关键;软件可扩展性并不是很好,受到操作系统的限制;由于操作系统本身的Bug,往往会引起安全问题。

硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。

负载均衡器有多种多样的形式,除了作为独立意义上的负载均衡器外,有些负载均衡器集成在交换设备中,置于服务器与Internet链接之间,有些则以两块网络适配器将这一功能集成到PC中,一块连接到Internet上,一块连接到后端服务器群的内部网络上。一般而言,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵。

  • 本地/全局负载均衡

负载均衡从其应用的地理结构上分为本地负载均衡(Local Load Balance)和全局负载均衡(Global Load Balance,也叫地域负载均衡),本地负载均衡针对本地范围的服务器群做负载均衡,全局负载均衡针对不同地理位置、不同网络结构的服务器群做负载均衡。

本地负载均衡不需要花费高额成本购置高性能服务器,只需利用现有设备资源,就可有效避免服务器单点故障造成数据流量的损失,通常用来解决数据流量过大、网络负荷过重的问题。同时它拥有形式多样的均衡策略把数据流量合理均衡的分配到各台服务器。如果需要在现在服务器上升级扩充,不需改变现有网络结构、停止现有服务,仅需要在服务群中简单地添加一台新服务器。

全局负载均衡主要解决全球用户只需一个域名或IP地址就能访问到离自己距离最近的服务器获得最快的访问速度,它在多区域都拥有自己的服务器站点,同时也适用于那些子公司站点分布广的大型公司通过企业内部网(Intranet)达到资源合理分配的需求。

全局负载均衡具备的特点:

  1. 提高服务器响应速度,解决网络拥塞问题,达到高质量的网络访问效果。

  2. 能够远距离为用户提供完全的透明服务,真正实现与地理位置无关性

  3. 能够避免各种单点失效,既包括数据中心、服务器等的单点失效,也包括专线故障引起的单点失效

负载均衡部署方式

负载均衡有三种部署方式:路由模式、桥接模式、服务直接返回模式。路由模式部署灵活,约60%的用户采用这种方式部署;桥接模式不改变现有的网络架构;服务直接返回(DSR)比较适合吞吐量大特别是内容分发的网络应用。约30%的用户采用这种模式。

  • 路由模式(推荐)

路由模式的部署方式,服务器的网关必须设置成负载均衡机的LAN口地址,且与WAN口分署不同的逻辑网络。因此所有返回的流量也都经过负载均衡。这种方式对网络的改动小,能均衡任何下行流量。

  • 桥接模式

桥接模式配置简单,不改变现有网络。负载均衡的WAN口和LAN口分别连接上行设备和下行服务器。LAN口不需要配置IP(WAN口与LAN口是桥连接),所有的服务器与负载均衡均在同一逻辑网络中。

由于这种安装方式容错性差,网络架构缺乏弹性,对广播风暴及其他生成树协议循环相关联的错误敏感,因此一般不推荐这种安装架构。

  • 服务直接返回模式

这种安装方式负载均衡的LAN口不使用,WAN口与服务器在同一个网络中,互联网的客户端访问负载均衡的虚IP(VIP),虚IP对应负载均衡机的WAN口,负载均衡根据策略将流量分发到服务器上,服务器直接响应客户端的请求。因此对于客户端而言,响应他的IP不是负载均衡机的虚IP(VIP),而是服务器自身的IP地址。也就是说返回的流量是不经过负载均衡的。因此这种方式适用大流量高带宽要求的服务。


Nginx 是一款高性能的HTTP和反向代理服务工具,现在很多大型网站都使用 Nginx 做负载均衡,由于支持高并发和资源占用低,越来越受到欢迎,下面介绍 Nginx 几种常用的负载均衡策略

u=1389434123,735908471&fm=26&gp=0.jpg

  • Nginx常用的几种负载均衡配置

  • 轮询模式:这种方式是nginx.conf配置文件的默认配置方式,当客户端访问服务的时候,请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
  • weight权重模式:这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大
  • ip_hash:配置很简单,在upstream中采用ip_hash指令,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。此种策略,可以实现同一个用户访问同一台服务器,会话不会丢失,但是可能会分配不均
  • fair(第三方插件):这种方式根据后端服务器的响应时间进行分配,响应快的优先分配请求
  • url  hash(第三方插件):此种方式和ip_hash比较类似,根据url的hash值进行分配,将url分配到同一个后端服务器,当服务器存在缓存时比较有效
  • nginx.conf 中命令说明

    down 表示单前的server暂时不参与负载 

    weight 默认为1.weight越大,负载的权重就越大。 

    max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误 

    fail_timeout:max_fails次失败后,暂停的时间。 

    backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻


  • 实验环境
  • Server 192.168.1.2 CentOS 7.5 Nginx+负载均衡
  • Web 1 192.168.1.3 CentOS 7.5 Nginx+PHP
  • Web 2 192.168.1.4 CentOS 7.5 Nginx+PHP
  • Web 3 192.168.1.5 CentOS 7.5 Nginx+PHP

  • 分别在 Server 和 Web 端安装 Nginx,使用 Nginx 官网提供的 Yum 方式安装
  • Nginx  Yum 官方源   http://nginx.org/packages/    
    CentOS 7.X :

    rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

    CentOS 6.X :

    rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

  • yum -y install nginx PS:确保 /etc/yum.repo.d/nginx.repo 为 enabled = 1 开启状态

  • Nginx+PHP 安装详细设置请参照拙作:Linux Nginx + PHP 安装及调优https://blog.csdn.net/gaofei0428/article/details/104058580


  • 安装完成后,首先在 Server 192.168.1.2 端配置 Nginx 负载均衡
  • vim /etc/nginx/nginx.conf
  • 在 http {......} 字段添加以下信息
  • http {

..........

    upstream myweb{    #开启负载均衡及定义名称
        ip_hash;     #采用 ip_hash 方式的负载均衡配置
        server 192.168.1.3 max_fails=10 fail_timeout=60s;
        server 192.168.1.4 max_fails=10 fail_timeout=60s;
        server 192.168.1.5 max_fails=10 fail_timeout=60s;
        }

#连接探测设置,如果发现后端异常,在单位周期为fail_timeout设置的时间,中达到max_fails次数,这个周期次数内,如果后端同一个节点不可用,那么接将把节点标记为不可用,并等待下一个周期(同样时常为fail_timeout)再一次去请求,判断是否连接是否成功
    include /etc/nginx/conf.d/*.conf;
}

  • 确认无误保存退出,接下来编辑 /etc/nginx/conf.d/default.conf 
  • vim /etc/nginx/conf.d/default.conf
  • server {
        listen      *:80;
        server_name  www.myweb.com;
        location / {
            proxy_pass  http://myweb;     #使用前面定义的负载均衡配置
            proxy_set_header Host $host;    #允许重新定义或者添加发往后端服务器的请求头。$host变量值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名
            proxy_set_header X-Forwarded-For $remote_addr;    #增加节点服务器记录的IP字段
        }
    }
  • 确认无误保存退出,启动 Nginx


  • 下面开始测试,这里为了测试效果,暂时把 #ip_hash; 设置注释掉
  • 更改物理机的 HOSTS 文件 添加 192.168.1.2 www.myweb.com
  • 打开浏览器输入 www.myweb.com 按住 F5 可以看到变化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章