l13Nginx创建负载均衡

在CenterOS6.5上安装方法
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum -y install nginx
chkconfig nginx on
service nginx start

一、系统物理结构

 

  本系统网络分为:内部局域网和互联网。服务器位于内部局域网,通过反向代理服务器对互联网公布系统,用户通过互联网访问系统。从网络层面安全进行隔离。用户访问系统基于http协议,系统内部之间服务器通信基于tcp/ip协议。根据部署应用的划分,将服务器分为负载均衡服务器、Web服务器、应用服务器、数据服务器四大类。

  (1)负载均衡服务器

    基于Linux之CentOS平台搭建Nginx服务,作Load Balance。

  (2)Web服务器

    基于window平台下IIS web服务器。部署基于asp.net mvc、web api技术实现的程序。

  (3)应用服务器

    部署基于.net平台通信框架之WCF技术实现的服务接口,提供与展现层调用,其中部分公用组件,如MQ则根据组件的要求部署。

  (4)数据服务器

  本系统数据存储选用:mssql数据库、MongoDB、Redis缓存和文件存储。根据项目情况数据库可做读写分离,同时结合redis做缓存策略提高系统性能。

二、nginx配置负载

cd /etc/nginx/ #定位到nginx安装目录
vim nginx.conf #通过vim打开nginx.conf配置文件进行配置
主要配置节点,192.168.119.1:8081 和 192.168.119.1:8082 分别部署在 IIS7的两个ASP.NET MVC 开发的站点
upstream 192.168.119.128{
    server 192.168.119.1:8081;
    server 192.168.119.1:8082;
server{
    listen   80;
    server_name  192.168.119.128;
    location /{
        proxy_pass   http://192.168.119.128;
    }
}
 
   
 
   
 
   
 
   
 
   
Nginx没有httpnetwork的访问权限,需要设置
 
   
 
   
 
   
 
   
另外一种方式是ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
ip_hash设置
 
   
 
   
轮询方式还可以在server后指定权重 
 
   

在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:   

down,表示当前的server暂时不参与负载均衡。

backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

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

fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

注,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。


三、Keepalived+LVS+Nginx负载均衡之高可用
k

 32383-20160419110112507-1910188894.png

 
服务器IP地址
虚拟IP192.168.1.120:80
主机192.168.1.104:80
备机192.168.1.103:80
Web站点A192.168.1.101:8081
Web站点B192.168.1.101:8082

 

 

  

 

 


1、安装ipvsadm,CentOS7自带安装包,通过yum进行安装。实现系统支持LVS 
yum install ipvsadm
2、安装Keepalived软件,并将keepalived设置开机启动1
yum install keepalived
systemctl enable keepalived 

可能需要开启路由转发(一下是CenterOS6.5的 7的是否是这样有待考证)

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

3、进行Keepalived.conf配置,如果是MASTER机,将state BACKUP改为state MASTER。

vim /etc/keepalived/keepalived.conf
#配置的内容
! Configuration File for keepalived 
global_defs {
   notification_email {
     xxx@126.com #收到通知的邮件地址
   }
   notification_email_from XX@126.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
vrrp_script monitor_nginx{
   script "/usr/local/etc/keepalived/script/monitor_nginx.sh"
   interval 1
   weight -15
}
vrrp_instance VI_1 {
    state BACKUP            #指定Keepalived的角色,MASTER为主,BACKUP为备
    interface eno16777736
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 80                   #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1                #检查间隔,默认为1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.120       #定义虚拟IP(VIP), 可多设,每行一个
    }
    track_script {
        monitor_nginx
    }
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.1.120 80 {
    delay_loop 6            # 设置健康检查时间,单位是秒
    lb_algo wrr                 # 设置负载调度的算法为wlc
    lb_kind DR                  # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    persistence_timeout 50
    protocol TCP 
real_server 192.168.1.103 80 {  # 指定real server1的IP地址
        weight 1                                # 配置节点权值,数字越大权重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    } 
real_server 192.168.1.104 80 {   # 指定real server2的IP地址
        weight 5                                  # 配置节点权值,数字越大权重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

从负载服务器与主负载服务器大致相同,只是在keepalived的配置文件中需要改以下两处:

  (1)将state由MASTER改为BACKUP

  (2)将priority由100改为99


4、配置监控shell脚本
创建:vim /usr/local/etc/keepalived/script/monitor_nginx.sh
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
    systemclt start nginx.service
    sleep 5  
  if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
  then 
    killall keepalived
  fi
fi
5、 将 MASTER(192.168.1.104)关机前后,查看相关VLS情况
关机前:
关机后:

我们看到将104服务器从 LVS移除掉。此时则将后续请求转发到103服务器。

关机后,BACKUP服务器 keepalived日志显示无法连接104,并移除掉

tail -f /var/log/messages32383-20160419110114054-499525947.png

开机后,将自动检测到服务器正常,并加入LVS中。

32383-20160419110114616-2058413656.png、MVC5测试环境

新建一个MVC5工程,新建一个Controller,在Index方法实现将当前时间保存到Session["mysession"],并写Cookies["mycookies"]存储主机名和当前时间。

       public  ActionResult Index()        {
             if  ( this .HttpContext.Session[ "mysession" ] ==  null )     {
                 this .HttpContext.Session[ "mysession" ] = DateTime.Now.ToString( "yyyy-MM-dd hh:mm:ss" );
             }  
             this .HttpContext.Response.Cookies.Add( new  HttpCookie( "mycookies" )     {
                     Expires = DateTime.Now.AddDays(1),
                     Value = HttpContext.Server.MachineName +  "||"  + DateTime.Now.ToString()
                 });  
             return  View();
         }
在Controller中新增第二个方法GetSession,显示Session和Cookies的值。

         public  ActionResult GetSession()         {
             if  ( this .HttpContext.Session[ "mysession" ] !=  null )        {
                 ViewBag.DD =  this .HttpContext.Session[ "mysession" ].ToString();
                 ViewBag.SCode =  this .HttpContext.Session[ "mysession" ].GetHashCode().ToString();
                 ViewBag.SID =  this .HttpContext.Session.SessionID;
             }  
             ViewBag.CVAL = System.Web.HttpContext.Current.Request.Cookies[ "mycookies" ].Value;
             ViewBag.CID = System.Web.HttpContext.Current.Request.Cookies[ "mycookies" ].Name;
             ViewBag.CDO = System.Web.HttpContext.Current.Request.Cookies[ "mycookies" ].Domain;  
             return  View();
         }
将session和cookies信息在页面显示,GetSession视图代码如下:
@{    ViewBag.Title = "GetSession";} 
<h2>站点:A -- GetSession</h2> 
<span>站点:A</span><br />
<span>Session Value: @ViewBag.DD</span><br/>
<span>Session SCode: @ViewBag.SCode</span><br />
<span>Session ID: @ViewBag.SID</span><br />
<span>Cookies ID: @ViewBag.CID</span><br />
<span>Cookies Values: @ViewBag.CVAL</span><br />
<span>Cookies Values: @ViewBag.CDO</span>
.Net平台对支持几种session存储模式: 
(1)InProc 模式  session存储于当前站点在同一个进程内,修改web.config或者bin中文件更新,会导致session丢失。此模式为默认模式。
(2)aspnet state 模式  
 aspnet state是将session存储在状态服务中,需要启动ASP.NET State Service,能看到进程aspnet_state.exe。还需要在web.config配置此模式。
(3)SQLServer 模式 此模式需要SQL Server配置相关信息,启动代理服务、数据库账号及表,并将web.config指向数据库。
(4)第三方扩展 模式 本框架采用此模式,将session存储到其他存储,比如:Memcached、redis缓存中,达到共享session的目的。可以通过实现ASP.NET中的SessionStateStoreProviderBase这个抽象类扩展。本系统采用将session存储在redis缓存中,通过引入  RedisSessionStateProvider组件。 
Install-Package Microsoft.Web.RedisSessionStateProvider
通过以上验证,获取到的session和cookies都是一致。






转载于:https://www.cnblogs.com/guominggigi/p/5395310.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值