概述

目前关于负载均衡高可用的架构方案能找到相当多且详尽的资料,此篇是自己学习相关内容的一个总结,防止将来遗忘再次重新查找资料,也避免踩相同的坑。

此次配置的负载均衡高可用架构Nginx + Keepalived(主备模式),Nginx 使用反向代理实现七层负载均衡

众所周知,Nginx 是一款自由的、开源的、高性能HTTP服务器和反向代理服务器,也是一个IMAP、POP3、SMTP代理服务器。

也就是说Nginx本身就可以托管网站(类似于Tomcat一样),进行HTTP服务处理,也可以作为反向代理服务器使用。

Keepalived 是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。

但是它一般不会单独出现,而是与其它负载均衡技术(如lvshaproxynginx)一起工作来达到集群的高可用。

相关原理对于理解整个架构的工作方式以及之后的troubleshooting都非常重要。

 

关于负载均衡,Nginx + Keepalived(主备模式)实现负载均衡高可用的架构方式,

关于虚拟路由冗余协议(VRRP),可参考:

http://network.51cto.com/art/201309/412163.htm

http://zhaoyuqiang.blog.51cto.com/6328846/1166840/

 

一.环境说明

系统环境:

4台 Red Hat Enterprise Linux Server release 7.0 (Maipo)

master节点:192.168.0.151/24

backup节点:192.168.0.152/24

虚拟IP(VIP):192.168.0.16

nginx web服务器:192.168.0.153/24

nginx web服务器:192.168.0.154/24

架构示意图:

nginx 灾备是不是就是主备模式 nginx负载均衡 主备_开机自启动

 

二.软件版本

Nginx stable version:nginx-1.12.2

Keepalived version:keepalived-1.3.9

 

三.环境安装部署

4个节点均进行以下操作:

1. 关闭firewalld防火墙,此处将使用iptables防火墙管理软件。 

[root@rhel7-vm1 ~]# systemctl stop firewalld    # 停止firewalld服务,关闭firewalld防火墙。
[root@rhel7-vm1 ~]# systemctl disable firewalld    # 取消firewalld开机自启动

2. 关闭selinux

[root@rhel7-vm1 ~]# vim /etc/selinux/config    # 配置selinux为permissive模式
...
SELINUX=permissive    # 第7行
...
[root@rhel7-vm1 ~]# setenforce 0    # 使selinux即时生效并使开机依然为permissive模式
[root@rhel7-vm1 ~]# getenforce      # 查看当前selinux模式
Permissive

3. 节点间时间同步并添加入周期性任务中(此处使用的是阿里的ntp时间同步服务器

[root@rhel7-vm1 ~]# crontab -u root -e
*/1 * * * *    root    /usr/sbin/ntpdate 120.25.108.11

4. 开启自定义iptables防火墙规则(此处为虚拟机上实验,只配置了一张网卡ens3;实际生产环境还要更加复杂,可以指定多个网卡接口)

[root@rhel7-vm1 ~]# vim iptables_cfg.sh
#!/bin/bash
# 
# Edited : 2017.11.12 08:05 by hualf.
# Usage  : Used to configure firewall by 'iptables'.
# 
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -I INPUT -i ens3 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -i ens3 -s 192.168.0.0/24 -p icmp -j ACCEPT    # 添加icmp协议,能够使用ping命令
iptables -A INPUT -i ens3 -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT    # 添加ssh服务端口,能够远程登陆

# web service    # 添加web服务端口
iptables -A INPUT -i ens3 -p tcp --dport 80 -j ACCEPT    # 80端口:master节点与backup节点用于监听nginx负载均衡服务
iptables -A INPUT -i ens3 -p tcp --dport 8080 -j ACCEPT    # 8080端口:2个nginx web服务器的监听端口

# dns service and keepalived(vrrp)
iptables -A INPUT -i ens3 -p udp --sport 53 -j ACCEPT    # 注意:允许来源为53端口(DNS服务)的数据包进入主机,避免yum安装rpm软件包时无法解析yum源地址!
iptables -A INPUT -i ens3 -p vrrp -j ACCEPT    # 注意:添加vrrp协议,确保能使用keepalived主备间的正常通信,否则会发生脑裂! nginx web服务器节点可取消该规则。 

service iptables save    # 保存防火墙规则使开机自启动

在运行 iptables_cfg.sh 时,出现报错如下:

The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status).
For other actions, please try to use systemctl.

解决方法:

如果之前没有停止firewalld服务的话,将其停止服务并取消开机自启动;安装iptables-services软件包及相关依赖;重启iptables服务,并实现开机自启动。

[root@rhel7-vm1 ~]# systemctl stop firewalld
[root@rhel7-vm1 ~]# systemctl disable firewalld
[root@rhel7-vm1 ~]# yum install -y iptables-services
[root@rhel7-vm1 ~]# systemctl restart iptables
[root@rhel7-vm1 ~]# systemctl enable iptables

再次运行 iptables_cfg.sh 时,防火墙规则被重新定义。

**************************************************************************

 

master节点:

1. 安装及配置nginx

1)安装 nginx 相关的依赖包

[root@rhel7-vm1 ~]# yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel acpid

依赖包相关说明:

gcc / gcc-c++:gcc编译器,编译nginx需要。

pcre / pcre-devel:Perl 语言兼容正则表达式(Perl Compatible Regular Expressions,用C语言编写的正则表达式函数库),nginx的rewrite模块正则表达式使用。

openssl / openssl-devel:nginx的ssl模块使用。

zlib / zlib-devel:nginx的gzip模块使用。

acpid:电源管理软件包

注意:以上软件包在编译安装nginx时必须安装,否则报错。

2)下载nginx-1.12.2,解压及源码安装

[root@rhel7-vm1 ~]# tar zxvf nginx-1.12.2.tar.gz -C /usr/local    # 解压nginx源码包至/usr/local目录中  
[root@rhel7-vm1 ~]# cd /usr/local/nginx-1.12.2
[root@rhel7-vm1 nginx-1.12.2]# ./configure --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module    # nginx安装检查配置
... skipping ...
  Configuration summary    # 列出nginx所需的系统库及配置的相关信息
      + using system PCRE library
      + using system OpenSSL library
      + using system zlib library

      nginx path prefix: "/usr/local/nginx"
      nginx binary file: "/usr/local/nginx/sbin/nginx"
      nginx modules path: "/usr/local/nginx/modules"
      nginx configuration prefix: "/usr/local/nginx/conf"
      nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
      nginx pid file: "/usr/local/nginx/logs/nginx.pid"
      nginx error log file: "/usr/local/nginx/logs/error.log"
      nginx http access log file: "/usr/local/nginx/logs/access.log"
      nginx http client request body temporary files: "client_body_temp"
      nginx http proxy temporary files: "proxy_temp"
      nginx http fastcgi temporary files: "fastcgi_temp"
      nginx http uwsgi temporary files: "uwsgi_temp"
      nginx http scgi temporary files: "scgi_temp"

  [root@rhel7-vm1 nginx-1.12.2]# make && make install    # 编译安装

检查配置完毕,即可编译安装。安装过中一般不会出现报错。

3)配置nginx实现开机自启动

方法一:直接编辑自定义开机启动脚本 /etc/rc.d/rc.local

[root@rhel7-vm1 ~]# cp /usr/local/nginx/sbin/nginx /usr/sbin/
[root@rhel7-vm1 ~]# vim /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
/usr/local/nginx/sbin/nginx    # 将nginx的可执行文件写入开机自定义启动脚本中
[root@rhel7-vm1 ~]# chmod 755 /etc/rc.d/rc.local    # 添加可执行权限,实现开机自启动
[root@rhel7-vm1 ~]# ls -lh /etc/rc.d/rc.local 
-rwxr-xr-x. 1 root root 473 Nov 17 23:51 /etc/rc.d/rc.local

方法二:编辑 /etc/init.d/nginx 脚本(该脚本由nginx官方提供,根据配置进行相应更改),使用chkconfig命令来实现开机自启动。

      该方法可以使用 /etc/init.d/nginx {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest} 或 service 命令集中式管理。

[root@rhel7-vm1 ~]# vim /etc/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac
[root@rhel7-vm1 ~]# chmod 755 /etc/init.d/nginx
[root@rhel7-vm1 ~]# chkconfig --level 35 nginx on    # chkconfig命令更改nginx运行级别,设置开机自启动
[root@rhel7-vm1 ~]# service nginx restart    # 重启nginx服务
Restarting nginx (via systemctl):                          [  OK  ]
[root@rhel7-vm1 ~]# /etc/init.d/nginx status    # 查看nginx服务状态

4)添加nginx系统用户与系统用户组

从安全角度考虑,如果nginx遭受攻击并被获取权限,使用nginx系统用户将降低主机被入侵的风险。也可以使用除root外的其他系统用户与系统用户组。

[root@rhel7-vm1 ~]# groupadd -r nginx    # 添加系统用户组nginx
[root@rhel7-vm1 ~]# useradd -r -g nginx -M nginx -s /sbin/nologin  # -r:添加系统用户nginx;-g:添加到系统用户组nginx;-M:不创建用户家目录;-s:指定登陆的shell为/sbin/nologin(不允许登陆)

5)配置nginx反向代理与负载均衡

此次的配置文件使用基本的反向代理与负载均衡,较为详细的配置文件说明可参考:

http://www.nginx.cn/76.html

[root@rhel7-vm1 ~]# vim /usr/local/nginx/conf/nginx.conf

user  nginx nginx;    # 使用nginx系统用户与nginx系统用户组
worker_processes  4;    # nginx对外提供web服务时的worker进程数,通常设置成与cpu的核心数相等  

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    use epoll;    # 使用epoll事件模型;epoll是多路复用IO(I/O Multiplexing)的一种方式,仅用于linux2.6以上内核,可以大大提高nginx的性能。
    worker_connections  1024;    # 每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。
}


http {    # http全局块
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on; 
    #tcp_nopush     on; 

    #keepalive_timeout  0;  
    keepalive_timeout  65; 

    #gzip  on; 
    
    upstream nginx-static.com {    # 加载负载均衡模块;域名指向后端web服务器集群
        # ip_hash;    # 默认情况下使用轮询(round-robin)模式,也可配置为ip_hash模式 
        server  192.168.0.153:8080  max_fails=3 fail_timeout=30s;    # max_fails: 允许失败的次数,默认值为1
        server  192.168.0.154:8080  max_fails=3 fail_timeout=30s;    # fail_timeout: 当max_fails次失败后,暂停将请求分发到后端web服务器的时间
    }

    server {
        listen       80;    # 监听master负载均衡节点80端口
        server_name  lb-ngx.com;    # master负载均衡节点的域名

        charset utf-8;    # 使用utf-8字符串编码格式
        root    /var/www;    # 定义nginx服务的根目录: /var/www


        #access_log  logs/host.access.log  main;

        location / {
            # index  index.html index.htm;    # 定义首页索引文件的名称,即/var/www下的索引文件。

            proxy_pass  http://nginx-static.com;    # 加载反向代理模块: 将访问http://lb-ngx.com根目录文件的请求,全部代理分发到后端服务器。
            proxy_redirect  off;
            proxy_set_header    Host    $host;
            proxy_set_header    REMOTE-HOST $remote_addr;
            proxy_set_header    X-Real-IP   $remote_addr;
            proxy_set_header    X-Forwarder-For $proxy_add_x_forwarded_for;
            proxy_connect_timeout   300;
            proxy_send_timeout  300;
            proxy_read_timeout  600;
            proxy_buffer_size   256k;
            proxy_buffers   4   256k;
            proxy_busy_buffers_size 256k;
            proxy_temp_file_write_size  256k;
            proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
            proxy_max_temp_file_size    128m;
        }

        location /test {
            proxy_pass  http://nginx-static.com/test;    # 加载反向代理模块: 将访问http://lb-ngx.com/test的请求,全部代理分发到后端服务器。
            proxy_redirect  off;
            proxy_set_header    Host    $host;
            proxy_set_header    REMOTE-HOST $remote_addr;
            proxy_set_header    X-Real-IP   $remote_addr;
            proxy_set_header    X-Forwarder-For $proxy_add_x_forwarded_for;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;    # 错误页面
        location = /50x.html {
            root   html;
        }
}

6)重启nginx服务使配置生效,查看nginx运行状态及端口使用。

[root@rhel7-vm1 ~]# /etc/init.d/nginx restart
Restarting nginx (via systemctl):                          [  OK  ]
[root@rhel7-vm1 ~]# /etc/init.d/nginx status
[root@rhel7-vm1 ~]# netstat -tunlp | grep 80

2. 安装及配置keepalived

1)下载并解压keepalived-1.3.9

[root@rhel7-vm1 ~]# tar zxvf keepalived-1.3.9.tar.gz

2)编译安装keepalived及安装排错

[root@rhel7-vm1 ~]# cd keepalived-1.3.9
[root@rhel7-vm1 keepalived-1.3.9]# ./configure

检查配置过程中报错如下:

*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

解决方法:

[root@rhel7-vm1 ~]# yum install -y libnl libnl-devel    # 安装libnl及libnl-deve依赖包

再次检查配置./configure,报错如下:

configure: error: libnfnetlink headers missing

解决方法:

[root@rhel7-vm1 ~]# yum install -y libnfnetlink-devel

编译安装:

[root@rhel7-vm1 keepalived-1.3.9]# ./configure
[root@rhel7-vm1 keepalived-1.3.9]# make && make install
[root@rhel7-vm1 ~]# cp /usr/local/keepalived-1.3.9/keepalived/keepalived /usr/sbin    # 拷贝keepalived可执行文件
[root@rhel7-vm1 ~]# cp /usr/local/keepalived-1.3.9/keepalived/etc/sysconfig/keepalived /etc/sysconfig    # 拷贝keepalived的systemctl配置文件,可由systemctl命令控制
[root@rhel7-vm1 ~]# cp -r /usr/local/keepalived-1.3.9/keepalived/etc/keepalived /etc    # 拷贝keepalived的全部配置文件,否则配置完keepalived并启动将报错

3)keepalived高可用基本配置

keepalived的高可用通过vrrp的虚拟IP(VIP)来实现。

keepalived可以通过自定义脚本来跟踪nginx负载均衡服务的状态。当master节点的nginx负载均衡服务down掉后,可通过脚本结束keepalived进程。

此时backup节点的keepalived侦测到原master节点的keepalived进程已停止,master节点的VIP漂移到backup节点上,即backup节点的keepalived由BACKUP状态转换为MASTER状态。

[root@rhel7-vm1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     # acassen@firewall.loc
     # failover@firewall.loc
     # sysadmin@firewall.loc
   }   
   notification_email_from Alexandre.Cassen@firewall.loc
   # smtp_server 192.168.200.1
   # smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_http_port {    # vrrp_script定义脚本检测nginx服务是否在运行
    script "/opt/chk_ngx.sh"    # 自定义脚本所在的路径,并将脚本添加可执行权限。
    interval 2    # 脚本执行的时间间隔;此处为2s检查一次
    weight -5    # 脚本结果导致的优先级变更
    fall 2    # 检测2次失败才算是真的失败
    rise 1    # 检测1次成功就算是真的成功
}

vrrp_instance VI_1 {    # vrrp实例;keepalived的virtual_router_id中priority(0-255)最大的成为MASTER,也就是接管虚拟IP(VIP)
    state MASTER    # 指定keepalived的状态为MASTER,但决定MASTER状态的为priority参数,该参数的权限值需要比BACKUP节点的设的要高,才能成为真正的MASTER,否则会被BACKUP抢占。
    interface ens3    # 侦听HA的网卡接口,防火墙规则需对该网卡指定vrrp协议。
    virtual_router_id 51  # 虚拟路由标志,该标志是一个数字;在同一个vrrp实例中使用同一个标志,即同一个vrrp实例中的MASTER和BACKUP使用相同的virtual_router_id。 
    priority 100    # 配置优先级;在同一个vrrp实例中,MASTER的优先级必须大于BACKUP的优先级,否则即使state定义为MASTER,也会被优先级定义更高的BACKUP所抢占。
    advert_int 1    # 配置MASTER与BACKUP节点间互相检查的时间间隔,单位是秒。
    authentication {    # 配置MASTER和BACKUP的验证类型和密码,两者必须一样。
        auth_type PASS    # 配置vrrp验证类型,主要有PASS和AH两种。
        auth_pass 1111    # 配置vrrp验证密码,在同一个vrrp_instance下,MASTER和BACKUP必须使用相同的密码才能正常通信。
    }
    virtual_ipaddress {    # vrrp虚拟IP(VIP),如果有多个VIP的话,可以写成多行。
        192.168.0.16/24
    }
    track_script {
        chk_http_port    # 引用vrrp_script中定义的脚本,定时运行,可实现MASTER和BACKUP间的切换。
    }
}
[root@rhel7-vm1 ~]# vim /opt/chk_ngx.sh    # 监测nginx负载均衡服务的脚本,可根据nginx进程状态来切换keepalived的状态。
#!/bin/bash
#
# Edited : 2017.11.12 16:16 by hualf.
# Usage  : checking status of nginx. If nginx has been down,
#   master node will restart nginx again. When nginx has started
#   failedly, keepalived will be killed, and backup node will 
#   replace the master node.
#
status=$(ps -C nginx --no-headers | wc -l)
if [ $status -eq 0 ]; then    # nginx服务停止后,再次启动nginx。
    /usr/local/nginx/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-headers | wc -l)
    if [ "${counter}" -eq 0 ]; then    # nginx再次启动失败后,停止master节点的keepalived,切换并启用backup节点。
        systemctl stop keepalived
    fi  
fi

4)查看nginx及keepalived进程运行状态

在master节点上均已开启nginx及keepalived服务,keepalived此时为MASTER状态并与backup节点保持通信。

master节点的虚拟IP(VIP)只能通过ip addr命令查看,无法使用ifconfig命令查看。

nginx 灾备是不是就是主备模式 nginx负载均衡 主备_开机自启动_02

 

nginx 灾备是不是就是主备模式 nginx负载均衡 主备_开机自启动_03

 

********************************************************************************

 

backup节点:

1. 安装及配置nginx

与master节点方法类似,参照master节点配置。

2. keepalived高可用基本配置

配置文件中只列出与master节点的差异项

! Configuration File for keepalived

global_defs {
   notification_email {
     # acassen@firewall.loc
     # failover@firewall.loc
     # sysadmin@firewall.loc
   }   
   notification_email_from Alexandre.Cassen@firewall.loc
   # smtp_server 192.168.200.1
   # smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_http_port {
    script "/opt/chk_ngx.sh"
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP    # backup节点的keepalived状态必须配置为BACKUP
    interface ens3
    virtual_router_id 51    # 在同一个vrrp实例中,master节点与backup节点的virtual_router_id必须相同。 
    priority 50    # backup节点的优先级必须小于master节点的优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.0.16/24
    }   
    track_script {
        chk_http_port
    }
}

3. 重启nginx及keepalived服务

********************************************************************************

 

2个节点nginx web服务器:

1. 安装及配置nginx(以192.168.0.153/24为例)

安装与master节点方法相似,具体配置如下:

[root@rhel7-vm3 ~]# vim /usr/local/nginx/conf/nginx.conf

user  nginx nginx;
worker_processes  2;

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    use epoll;
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on; 

    server {
        listen       8080;    # nginx web服务器监听8080端口
        server_name  192.168.0.153;

        charset utf-8;
        root   /var/www;    # 配置虚拟主机的根目录: /var/www

        #access_log  logs/host.access.log  main;

        location / {    # 根目录中首页的索引文件
            index  index.html index.htm;
        }

        location /test {    # 根目录中test子目录首页的索引文件
            index  index.html;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
[root@rhel7-vm3 ~]# vim /var/www/index.html
<html>    
    <head>    
        <title>Welcome to nginx!</title>    
    </head>    
    <body bgcolor="white" text="black">    
        <center>
            <h1>Welcome to nginx! 192.168.0.153</h1>
        </center>    
    </body>    
</html>
[root@rhel7-vm3 ~]# vim /var/www/test/index.html
<html>    
    <head>    
        <title>Welcome to nginx!</title>    
    </head>    
    <body bgcolor="white" text="black">    
        <center>
            <h1>Welcome to <A style="color:red;">test</A> nginx! 192.168.0.153</h1>
        </center>    
    </body>    
</html>

2. 重启nginx服务

2个nginx web服务器配置完成并重启后,进行负载均衡与高可用测试。

********************************************************************************

 

负载均衡和高可用测试:

1. 当master节点的nginx及keepalived均正常提供服务时,在此次配置中nginx负载均衡使用轮询模式,即192.168.0.153/24192.168.0.154/24能够以相似的几率被访问。

master节点的keepalived为MASTER状态,虚拟IP(VIP)在master节点上。

通过浏览器访问http://lb-ngx.com与http://lb-ngx.com/test,分别能够访问位于153站点及154站点上的主页,并且通过刷新能够轮询访问两个站点。

nginx 灾备是不是就是主备模式 nginx负载均衡 主备_nginx_04

nginx 灾备是不是就是主备模式 nginx负载均衡 主备_开机自启动_05

nginx 灾备是不是就是主备模式 nginx负载均衡 主备_负载均衡_06

nginx 灾备是不是就是主备模式 nginx负载均衡 主备_负载均衡_07

2. 当master节点的nginx负载均衡服务停止,并且再次尝试重启失败后,keepalived进程也被停止,此时由backup节点来接管master节点的nginx负载均衡服务,backup节点keepalived

状态转变为MASTER,虚拟IP(VIP)漂移到了backup节点上。通过浏览器访问上述网站依然能够访问,在这里不再展示。可以通过查看日志/var/log/messages来确定master节点与backup节点

keepalived的状态。

nginx 灾备是不是就是主备模式 nginx负载均衡 主备_开机自启动_08

至此,Nginx + Keepalived(主备模式)的负载均衡高可用架构的基本配置已完成,该架构属于轻量级负载均衡高可用架构。之后还会学习haproxy/pacemaker的原理及配置方法。