Nginx高可用集群构建(Keepalived+Haproxy+Nginx)
发布日期:2025-04-20 23:40:23 浏览次数:8 分类:精选文章

本文共 8084 字,大约阅读时间需要 26 分钟。

Nginx高可用集群构建(Keepalived+Haproxy+Nginx)

1. 组件及实现功能

Keepalived、Haproxy 和 Nginx 分别承担了不同的角色,形成了一套高可用架构。具体实现如下:

  • Keepalived:通过双主模型(Master/Backup)实现服务的高可用性,确保任意一主节点故障时,另一主节点能够自动接管服务。
  • Haproxy:作为反向代理服务器,负责负载均衡和读写分离,有效提升应用的性能和并发处理能力。
  • Nginx:专注于处理 HTTP 请求,实现高性能的网络应用服务器功能。

2. 架构设计图

以下为系统架构的设计图(图示内容已移除,仅保留文字描述):

  • 服务器架构:采用双节点部署,节点间通过集群方式实现服务冗余。
  • 反向代理层:由 Haproxy 统管,负责请求分发和负载均衡。
  • 应用服务器:通过 Nginx 提供高性能的 HTTP 处理能力。

3. Keepalived 部署

配置步骤

  • 安装 Keepalived:在两个节点上执行以下命令安装:
  • yum -y install keepalived
    1. 配置 Keepalived:分别在 172.16.25.109172.16.25.110 上修改 keepalived.conf 文件,配置如下:
    2. vim /etc/keepalived/keepalived.conf

      配置示例

      global_defs {
      notification_email {
      root@localhost
      }
      notification_email_from admin@lnmmp.com
      smtp_connect_timeout 3
      smtp_server 127.0.0.1
      router_id LVS_DEVEL
      }
      vrrp_script chk_maintaince_down {
      script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
      interval 1
      weight 2
      }
      vrrp_script chk_haproxy {
      script "killall -0 haproxy"
      interval 1
      weight 2
      }
      vrrp_instance VI_1 {
      interface eth0
      state MASTER
      priority 100
      virtual_router_id 125
      garp_master_delay 1
      authentication {
      auth_type PASS
      auth_pass 1e3459f77aba4ded
      }
      track_interface {
      eth0
      }
      virtual_ipaddress {
      172.16.25.10/16 dev eth0 label eth0:0
      }
      track_script {
      chk_haproxy
      }
      notify_master "/etc/keepalived/notify.sh master 172.16.25.10"
      notify_backup "/etc/keepalived/notify.sh backup 172.16.25.10"
      notify_fault "/etc/keepalived/notify.sh fault 172.16.25.10"
      }
      vrrp_instance VI_2 {
      interface eth0
      state BACKUP
      priority 99
      virtual_router_id 126
      garp_master_delay 1
      authentication {
      auth_type PASS
      auth_pass 7615c4b7f518cede
      }
      track_interface {
      eth0
      }
      virtual_ipaddress {
      172.16.25.11/16 dev eth0 label eth0:1
      }
      track_script {
      chk_haproxychk_maintaince_down
      }
      notify_master "/etc/keepalived/notify.sh master 172.16.25.11"
      notify_backup "/etc/keepalived/notify.sh backup 172.16.25.11"
      notify_fault "/etc/keepalived/notify.sh fault 172.16.25.11"
      }
      1. 创建通知脚本:在 /etc/keepalived/notify.sh 上执行以下命令创建通知脚本:
      2. #!/bin/bash
        # 作者:Jason.Yu
        # contact='root@localhost'
        notify() {
        mailsubject="`hostname`到被$1:$2故障"
        mailbody="`date '+%F %H:%M:%S'`: vrrp转换,`hostname`变为$1"
        echo $mailbody | mail -s "$mailsubject" $contact
        }
        case "$1" in
        master)
        notify master $2
        /etc/rc.d/init.d/haproxy restart
        exit 0
        ;;
        backup)
        notify backup $2
        exit 0
        ;;
        fault)
        notify fault $2
        exit 0
        ;;
        *)
        echo '使用:`basename $0` {master|backup|fault}'
        exit 1
        ;;
        esac
        1. 启动服务:在两个节点上执行以下命令启动 Keepalived 服务:
        2. service keepalived start

          4. Haproxy 部署

          配置步骤

        3. 安装 Haproxy:在两个节点上执行以下命令安装:
        4. yum -y install haproxy
          1. 配置 Haproxy:分别在 172.16.25.109172.16.25.110 上修改 haproxy.cfg 文件,配置如下:
          2. vim /etc/haproxy/haproxy.cfg

            配置示例

            global
            log 127.0.0.1 local2
            chroot /var/lib/haproxy
            pidfile /var/run/haproxy.pid
            maxconn 4000
            user haproxy
            group haproxy
            daemon
            defaults
            mode http
            log global
            option httplog
            option dontlognull
            option http-server-close
            option forwardfor except 127.0.0.0/8
            option redispatch
            retries 3
            timeout http-request 10s
            timeout queue 1m
            timeout connect 10s
            timeout client 1m
            timeout server 1m
            timeout http-keep-alive 10s
            timeout check 10s
            maxconn 30000
            listen stats
            mode http
            bind 0.0.0.0:1080
            stats enable
            stats hide-version
            stats uri /haproxyadmin?stats
            stats realm Haproxy Statistics
            stats auth admin:admin
            stats admin if TRUE
            frontend http-in
            bind *
            mode http
            log global
            option httpclose
            option logasap
            option dontlognull
            capture request header Host len 20
            capture request header Referer len 60
            acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets
            acl url_static path_end -i .jpg .jpeg .gif .png .css .js .html
            use_backend static_servers if url_static
            default_backend dynamic_servers
            backend static_servers
            balance roundrobin
            server imgsrv1 192.168.0.25:80 check maxconn 6000
            backend dynamic_servers
            balance source
            server websrv1 192.168.0.35:80 check maxconn 1000
            1. 启动服务:在两个节点上执行以下命令启动 Haproxy 服务:
            2. service haproxy start

              5. Nginx 部署

              安装与配置

            3. 安装依赖项:安装必要的软件包:
            4. yum -y groupinstall "Development tools"
              yum -y groupinstall "Server Platform Development"
              yum install gcc openssl-devel pcre-devel zlib-devel
              1. 安装 Nginx:解压并配置 Nginx:
              2. tar xf nginx-1.4.7.tar.gz
                cd nginx-1.4.7
                mkdir -pv /var/tmp/nginx
                ./configure \
                --prefix=/usr \
                --sbin-path=/usr/sbin/nginx \
                --conf-path=/etc/nginx/nginx.conf \
                --error-log-path=/var/log/nginx/error.log \
                --http-log-path=/var/log/nginx/access.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_stub_status_module \
                --with-http_gzip_static_module \
                --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/ \
                --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
                --http-scgi-temp-path=/var/tmp/nginx/scgi \
                --with-pcremake
                make install
                1. 配置服务脚本:创建 Nginx 的服务脚本:
                2. vi /etc/init.d/nginx

                  服务脚本内容

                  #!/bin/sh
                  ## nginx - 这个脚本用于启动和停止 Nginx 服务
                  ## chkconfig: - 85 15
                  ## 描述: Nginx 是一个 HTTP(S) 服务器,HTTP(S) 反向代理和 IMAP/POP3 代理服务器
                  ## 进程名称: nginx
                  ## 配置文件: /etc/nginx/nginx.conf
                  ## pidfile: /var/run/nginx.pid
                  ## 来源函数库: .. /etc/rc.d/init.d/functions
                  ## 来源网络配置: .. /etc/sysconfig/network
                  [ "$NETWORKING" = "no" ] && exit 0
                  nginx="/usr/sbin/nginx"
                  prog=$(basename $nginx)
                  NGINX_CONF_FILE="/etc/nginx/nginx.conf"
                  [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
                  lockfile=/var/lock/subsys/nginx
                  make_dirs() {
                  user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
                  options=`$nginx -V 2>&1 | grep 'configure arguments:'`
                  for opt in $options; do
                  if [[ `echo $opt | grep '.*-temp-path'` ]]; then
                  value=`echo $opt | cut -d "=" -f 2`
                  if [[ ! -d "$value" ]]; then
                  mkdir -p $value && chown -R $user $value
                  fi
                  fi
                  done
                  }
                  start() {
                  [ -x $nginx ] || exit 5
                  [ -f $NGINX_CONF_FILE ] || exit 6
                  make_dirs
                  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
                  sleep 1
                  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
                  chmod +x /etc/init.d/nginx
                  1. 启动服务:执行以下命令启动 Nginx 服务,并验证配置:
                  2. service nginx configtest
                    service nginx start
                    ps -ef | grep nginx
                    # 检查 worker进程数是否与 worker_processes值一致
                    ss -antupl | grep 80

                    6. 访问验证

                    Haproxy 统计页面测试

                    通过 Haproxy 的统计页面验证集群状态,测试 URL 访问是否正常,确保服务负载均衡。

                    动静分离测试

                    验证 Nginx 对动态和静态资源的处理能力,确保动态请求和静态文件请求能够正确分离处理。

                    高可用测试

                    验证 Keepalived 和 Haproxy 的高可用机制,确保在节点故障时,服务能够自动切换到备用节点,保证系统的稳定性和可用性。

                    通过以上步骤,可以完成 Nginx 高可用集群的部署和配置,确保系统在高负载和故障情况下的稳定性和可靠性。

    上一篇:Nginx(1):Nginx基础配置详解
    下一篇:Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月16日 05时36分12秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章