且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Nginx实现反向代理负载均衡

更新时间:2022-09-22 12:26:18

网络模型中,nginx属于第7层,根据域名或目录配置负载均衡(代理),十分灵活;而lvs只能针对IP

环境:

DIR :   172.16.115.100(Nginx代理)

RS1:    172.16.115.157(Web服务器)

RS2:    172.16.115.202(Web服务器)


1. dir、rs1、rs2安装nginx(1台代理+2台Web服务器)

    命令 yum install -y nginx

 

2. 编辑dir上nginx的配置文件/etc/nginx/nginx.conf,开启子配置文件include /etc/nginx/conf.d/*.conf,并新建配置文件/etc/nginx/conf.d/lb.conf

    说明:用到uptream模块,定义负载均衡中服务器

    内容:


 upstream hzp {

        server 172.16.115.157:80;

        server 172.16.115.202:80;

        }

   server {

       listen 80;

       server_name www.huangzhenping.cn;

        location / {

        proxy_pass http://hzp/;

        proxy_set_header Host $host;

           }

        }


   注:需禁用掉/etc/nginx/conf.d/default.conf文件,如改名为default.conf.bak


3. 修改rs1和rs2服务器web首页,并启动三台服务器上的Nginx服务

    命令 /etc/init.d/nginx start

    rs1:echo "hello,rs1" > /usr/share/nginx/html/index.html

    rs2:echo "hello,rs2" > /usr/share/nginx/html/index.html


4. 客户机上用curl测试:curl -xlocalhost:80 www.huangzhenping.cn

    结果: 权重1:1交替访问

Nginx实现反向代理负载均衡

5. dir上,修改配置文件/usr/local/nginx/conf/vhosts/lb.conf,增加权重,重启测试

    内容:


upstream hzp {

        server 172.16.115.157:80 weight=3;

        server 172.16.115.202:80 weight=1;

        }

   server {

       listen 80;

       server_name www.huangzhenping.cn;

        location / {

        proxy_pass http://hzp/;

        proxy_set_header Host $host;

           }

        }

结果:3:1关系,交替访问

     Nginx实现反向代理负载均衡



6. 停止rs1上的nginx服务,再次测试

    结果:跳过rs1服务器,只访问rs2的Web;恢复rs1时,交替访问

Nginx实现反向代理负载均衡 Nginx实现反向代理负载均衡


 Nginx实现反向代理负载均衡

nginx负载均衡简单配置


准备三台虚拟机来做这个实验:


172.16.100.6        web服务器

172.16.100.7        web服务器

172.16.100.106    负载均衡服务器


首先三台电脑装好nginx软件:

向web服务器中放入测试文件:


<html>    

<head>    

<title>Welcome to nginx!</title>    

</head>    

<body bgcolor="white" text="black">    

<center><h1>Welcome to nginx! 172.16.100.6</h1></center>    

</body>    

</html>


配置负载均衡服务器:


vi /usr/local/nginx/conf/nginx.conf

 

user nginx nginx;worker_processes  1;

 

events {

    worker_connections  1024;

}

 

http {

    include       mime.types;

    default_type  application/octet-stream;    

    sendfile       on;

    keepalive_timeout  65;

    upstream webservs {

        server 172.16.100.6 weight=1;

        server 172.16.100.7 weight=1;

    }

     

    server {

        listen     8083;

        server_name  localhost;

        index index.html index.htm index.php; 

         location / {

             proxy_pass webservs;

           proxy_set_header X-Real-IP $remote_addr;

        }

                 

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

}


拓展:

要在server之外定义upstream ,upstream可以定义多个名称,但每一个upstream都要有自己独立的名称

upstream里有很多的子指定,其中server用来定义每一个后端服务器;


每一个后端还可以传递很多参数,weight权重,没有权重为0,不做负载均衡的,权重一样就轮调,权重不一样实现加权轮调,还可以实现端口映射;定义server时只能定义名称或是IP地址,不能使用协议http。



upstream backend {

    server backend1.example.com weight=5;

    server backend2.example.com:8080;

    server unik:/tmp/backend3;

}

server{

    location / {

        proxy_pass http://backend;    //反向代理不是某些主机,而是upstream定义的名称,,由upstream来实现负载均衡功能

    }

}





ngin的负载均衡得用到upstream模块,它用来定义一个后端服务器组,即把所有后端的服务器整合在一起,然后通过proxy代理到这个服务器组。就能实现简单的http负载均衡了,


upstream默认的调度方式是wrr(具体内容可参考lvs中的介绍),所以我们只用指定服务器的ip,如果端口不是默认80端口也可以单独指定,还有一些调度用到的参数,比如权重。



http{

    ...

    upstream backserver {                   #backserver是一个自定义的名字,后面会调用

            server 172.16.53.101;           #第一个后端server

            server 172.16.53.102 ;          #第二个后端server

        }

    ...

    server {                                

        listen 80;

        server_name xiaofengfeng.cn;

        location / {

                proxy_pass      #代理到服务器组,此处只支持http/https 

                index index.html;

        }

}

上面就是一个最简单的基于nginx的服务均衡配置了。upstream 的server后面还可以加许多参数,比如设置不同的权值weight=number,权值越大调用的次数越多。backup参数可以设置backup server,比如我们可以设置本机为backup server,当后端服务器都不能访问的时候,我们本机可以提供一个sorry 页面。


 http{

     ...

    upstream backserver {

            server 172.16.53.101;

            server 172.16.53.102 ;

            server 127.0.0.1 backup; 

               #指定本机回环地址为备用server,此处我们提供一个sorry server

        }

    server {

            listen 192.168.157.128:80;   #代理服务只监听前端服务的ip和端口

            server_name xiaofengfeng.cn;

            location / {

                    proxy_pass  http://backserver;

                    index index.html;

            }

    }

    server {

            listen 127.0.0.1:80;          #回环地址用来做sorry server

            server_name xiaofengfeng2.cn;

            location / {

                    root /var/nginx;

                    index index.html;

            }

    }

}

    注:因为我们改变了监听的ip所以得重启nginx服务,而不是用nginx -s reload。

    除了server配置选项还有其他一些常用的,比如我们可以改变其调用算法为wlc,即least_conn,就会根据后端服务器的连接数来调用。如果我们的一些用户信息,比如说session,cookie等保存在后端服务器本地,为了放置用户信息丢失,我们可以让一个用户的请求都发送到同一个后端服务器。ip_hash就可以实现这样的功能。来自同一个源IP地址的请求始终发往同一个upstream server。除了根据源地址hash,我们还可以指定特定的参数来作为hash的条件,比如,如果我们用uri作为hash条件,那么同一个uri的请求会发往同一台后端服务器。此时我们就要用到hash选项,比如:



hash $request_uri consistent

$request_uri是内置提供的变量,就是请求的uri咯,consistent是一致性哈希算法,这个倒是可以说道说道。我们知道哈希就是无论输入什么值,都会得到一个固定长度的散列值,我们对不同的uri求散列值,如果后端服务器有6台服务器,然后给他们进行编号0-6,然后用求的散列值对6做取余运算,就一定会得到0-6中的一个值,然后把这个分配给对应编号的服务器。不过,这个算法有个问题,如果某个服务器挂掉,我们就得重新以5来做取余运算,然后重新把所有过程从来一遍。所以就出现了上面的一致性哈希算法,我们现在先不关注后端有几台服务器,我们把0到2的32次方减一这个多个数字分布在一个圆环上,就上钟表上的0-12一样,0的地方就是12.然后我们对后端每个服务器的ip地址做哈希计算,得到的值在和2的32次方做取余运算,那么后端的这些服务器一定会分布在这个圆环上的某个点处,然后我们在对hash选项指定的内容,此处是uri做hash计算,得到的值在和2的32次方取余,所以这些uri也会分布在这个圆环上。然后我们规定,在这个圆环上分布的服务器,负责响应它到它下一个服务器的区间上分布的请求。此时当后端的某台服务器挂掉时,只会影响这台服务器后面的URI请求,而不会影响其他服务器,只用把属于这台服务器的请求,给它上一台就好,我们画个图说明下。


我们用方块表示后端服务器经过哈希计算的分布情况,用红色的线表示不同uri请求的分布情况,服务器1只用负责1到2之间的uri请求,以此类推,5只用负责5到1之间的uri请求,如右图所示,假如2号服务器挂掉了,我们就把所有属于2号服务器的请求分配给1号服务器~好啦~这就是一致性哈希算法~~~很重要哟,许多地方都有用到。

    除了支持web服务的负载均衡,nginx还支持其他服务的负载均衡,此时我们就得用到另外的模块stream和stream_proxy_module。不过这两个模块必须得是1.9.13以上的版本~并且默认stream并没有加载。得在编译时加入--with-stream选项,不过如果我们用的是预编译的rpm包安装的话,默认是有这个的~以下是/etc/nginx/nginx.conf


user  nginx;

worker_processes  1;

 

error_log  /var/log/nginx/error.log warn;

pid        /var/run/nginx.pid;

 

 

events {

    worker_connections  1024;

}

stream {

        upstream sshsrvs {

                server 192.168.10.130:22;

                server 192.168.10.131:22;

        }

 

        server {

                listen 172.16.100.6:22202;

                proxy_pass sshsrvs;

                proxy_timeout 60s;

                proxy_connect_timeout 10s;

        }

 

}

使用Nginx+Keepalived组建高可用负载平衡Web server集群

一,首先说明一下网络拓扑结构:

Nginx实现反向代理负载均衡

1,Nginx 反向代理Server(HA):

     ①Nginx master:192.168.1.157

     ②Nginx backup:192.168.1.158  

      虚拟IP统一为:192.168.1.110    

2,web服务器:

     192.168.1.160 ,192.168.1.161,192.168.1.162      即web服务器,已配置好 Tomcat(Jboss等皆可)和Java程序

3,MySQL 数据库Server

     mysql主从服务器


二,Nginx安装配置

1,安装

建议先用yum install yum-fastestmirror更新下源


下载并安装nginx1.0.9,下载文件均放到/usr/local/src目录下

cd /usr/local/src


①update yum

 yum -y update

 

②利用CentOS Linux系统自带的yum命令安装、升级所需的程序库

安装依赖包

#yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel


下载nginx

#cd /usr/local/src

#wget http://www.nginx.org/download/nginx-1.0.9.tar.gz

#tar zxvf nginx-1.0.9.tar.gz

#cd nginx-1.0.9


配置安装:

#./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/

#make

#make install


建立用户:

/usr/sbin/groupadd nginx

/usr/sbin/useradd -g nginx -M nginx

mkdir -p /var/tmp/nginx/client

启动nginx

#/usr/sbin/nginx



 ps:如果中途提示缺少库,直接yum install xxx即可。

 即:conf-path=/etc/nginx/nginx.conf,用户名为nginx,所属的组为nginx


       2,配置

Nginx负载均衡设置:


①修改配置文件:

vi /etc/nginx/nginx.conf

步骤1,添加负载均衡的http upstream模块

upstream  esbwebserver  {

  server   192.168.1.160:8888;

  server   192.168.1.161:8888;

}


步骤2,server指令

server

{

listen  80;

server_name  localhost;#注意此处为localhost


location / {

       proxy_pass        http://esbwebserver;# 添加的tomcat集群名称

       ......

}


②,重启Nginx,加载修改过的配置文件:

步骤1, 停止nginx引擎

killall -9 nginx

步骤2,启动nginx

/usr/sbin/nginx


到此为止,我们的负载均衡就实现了,下面实现Nginx的高可用,即双机热备。


三,Keepalived 安装配置

1,下载并安装keepalived-1.1.15.tar.gz,下载文件均放到/usr/local/src目录下

cd /usr/local/src

wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz


①解压缩

tar zxvf keepalived-1.1.15.tar.gz

 

②安装

cd keepalived-1.1.15

./configure --prefix=/usr/local/keepalived

make && make install

③安装成功后做成服务模式,方便启动和关闭

cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/

cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/



④ 分别设置主和备Nginx上的 安装Keepalived配置文件。

  

  配置文件位置:

 /usr/local/keepalived/etc/keepalived/keepalived.conf

 

 步骤一,先配置主Nginx server上的keepalived.conf文件,如下所示:

 ! Configuration File for keepalived

 

  global_defs {

  notification_email {

    644856452@qq.com

  }

  notification_email_from 644856452@qq.com

  smtp_server 127.0.0.1

  smtp_connect_timeout 30

  router_id LVS_DEVEL

}



vrrp_script check_run {

   script "/root/bin/nginx_check.sh"

   interval 5

}

vrrp_sync_group VG1 {

    group {

       VI_1

    }

}

vrrp_instance VI_1 {

   state MASTER

   interface eth0

   virtual_router_id 51

   mcast_src_ip 192.168.1.157

   priority 100

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 1111

   }

 track_script {

        check_run

    }


   virtual_ipaddress {

       192.168.1.110

   }

}


步骤二,配置backup 服务器的keepalived.conf文件,如下所示:

! Configuration File for keepalived


global_defs {

  notification_email {

    644856452@qq.com     

  }

  notification_email_from Alexandre.Cassen@firewall.loc

  smtp_server 127.0.0.1

  smtp_connect_timeout 30

  router_id LVS_DEVEL

}

vrrp_script check_run {

   script "/root/bin/nginx_check.sh"

   interval 5

}

vrrp_sync_group VG1 {

    group {

      VI_1 

    }

}



vrrp_instance VI_1 {

   state BACKUP

   interface eth0

   virtual_router_id 51

   priority 99

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 1111

   }

track_script {

        check_run

    }

   virtual_ipaddress {

       192.168.1.110

   }

}


参考下例配置:

-----------------------------------------------------带注释的示例----------------------------------------------------

在主服务器编写配置文件

vrrp_script check_run{

                script "/opt/nginx_pid.sh"         ###监控脚本

                interval 2                             ###监控时间

                weight 2                                ###如果检测返回值不为真weight 2 表示减2,权重值降低,backup server权重值>现Master的,切换

}

vrrp_instance VI_1 {

        state MASTER                           ### 设置为 主

        interface eth0                            ### 监控网卡    

        virtual_router_id 51                  ### 这个两台服务器必须一样

        priority 101                                 ### 权重值 MASTRE 一定要高于 BAUCKUP

        authentication {

                     auth_type PASS             ### 加密

                     auth_pass 1111          ###加密的密码,两台服务器一定要一样,不然会出错

}


       track_script {

                check_run     ### 执行监控的服务

        }


        virtual_ipaddress {

             192.168.1.110                          ###    VIP 地址

        }

}

6.在backup server  服务器 keepalived 配置

vrrp_script check_run{

                script "/opt/nginx_pid.sh"

                interval  2

                weight   2

}



vrrp_instance VI_1 {

       state BACKUP                                ### 设置为 辅机

        interface eth0

        virtual_router_id 51                      ### 与 MASTRE 设置 值一样

        priority 100                                     ### 比 MASTRE权重值 低


        authentication {

                     auth_type PASS

                     auth_pass eric                    ### 密码 与 MASTRE 一样

        }


        track_script {

                check_run

        }

virtual_ipaddress {

                 192.168.1.110

        }

}

----------------------------------------------over------------------------------------------------------------------- 


说明:  

1,绑定虚拟IP:

  ifconfig eth0:1 192.168.1.110 broadcast 192.168.1.255 netmask 255.255.255.0 up  

  route add -host 192.168.1.110 dev eth0:1


2,  启动,关闭keepalived :

 service keepalived start

 service keepalived stop

3,测试可用性:

①主Nginx停止Nginx或直接断网情况下(backup正常),访问虚拟IP:192.168.1.110的相关Web服务,正常,测试通过

②backup Nginx停止Nginx或直接断网情况下(Master正常),访问虚拟IP:192.168.1.110的相关Web服务,正常,测试通过










本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1903467,如需转载请自行联系原作者