搭建两台web服务器基于HAProxy实现负载均衡

  • 搭建两台web服务器基于HAProxy实现负载均衡已关闭评论
  • 161 次浏览
  • A+
所属分类:linux技术
摘要

环境:状态页也可以看出来web1下线了

搭建两台web服务器基于HAProxy实现负载均衡

环境:

  • DNS服务器:192.168.10.200 仅主机模式
  • internet服务器:192.168.10.123 仅主机模式
  • web1:10.0.0.100 (安装apache2)NAT模式
  • web2:10.0.0.18 (安装httpd) NAT模式
  • HAProxy服务器:10.0.0.8(配备两块网卡,eth0NAT模式,属于内网;eth1 仅主机模式192.168.10.129,外网)
  1. 搭建DNS服务器
[root@dns ~]$ cat install_dns.sh  #!/bin/bash # #*********************************************************** #Author:            yanli #Date:              2022-10-25 #FileName:          install_dns.sh #Description:         #*********************************************************** DOMAIN=yanlinux.org HOST=www HOST_IP=192.168.10.129  CPUS=`lscpu |awk '/^CPU(s)/{print $2}'` . /etc/os-release  color () {     RES_COL=60     MOVE_TO_COL="echo -en \033[${RES_COL}G"     SETCOLOR_SUCCESS="echo -en \033[1;32m"     SETCOLOR_FAILURE="echo -en \033[1;31m"     SETCOLOR_WARNING="echo -en \033[1;33m"     SETCOLOR_NORMAL="echo -en E[0m"     echo -n "$1" && $MOVE_TO_COL     echo -n "["     if [ $2 = "success" -o $2 = "0" ] ;then         ${SETCOLOR_SUCCESS}         echo -n $"  OK  "         elif [ $2 = "failure" -o $2 = "1"  ] ;then          ${SETCOLOR_FAILURE}         echo -n $"FAILED"     else         ${SETCOLOR_WARNING}         echo -n $"WARNING"     fi     ${SETCOLOR_NORMAL}     echo -n "]"     echo  }   install_dns () {     if [ $ID = 'centos' -o $ID = 'rocky' ];then 	    yum install -y  bind bind-utils 	elif [ $ID = 'ubuntu' ];then         color "不支持Ubuntu操作系统,退出!" 1         exit 	    #apt update 	    #apt install -y  bind9 bind9-utils 	else 	    color "不支持此操作系统,退出!" 1 	    exit 	fi      }  config_dns () {     sed -i -e '/listen-on/s/127.0.0.1/localhost/' -e '/allow-query/s/localhost/any/' /etc/named.conf     cat >> 	/etc/named.rfc1912.zones <<EOF zone "$DOMAIN" IN {     type master;     file  "$DOMAIN.zone"; }; EOF    cat > /var/named/$DOMAIN.zone <<EOF $TTL 1D @	IN SOA	master admin ( 					1	; serial 					1D	; refresh 					1H	; retry 					1W	; expire 					3H )	; minimum 	        NS	 master master      A    `hostname -I`          $HOST     	A    $HOST_IP EOF    chmod 640 /var/named/$DOMAIN.zone    chgrp named /var/named/$DOMAIN.zone }  start_service () {     systemctl enable --now named 	systemctl is-active named.service 	if [ $? -eq 0 ] ;then          color "DNS 服务安装成功!" 0       else          color "DNS 服务安装失败!" 1         exit 1     fi    }  install_dns config_dns start_service  #安装 [root@dns ~]$ sh install_dns.sh  #在internet服务器上测试 [root@internet ~]$ ping www.yanlinux.org PING www.yanlinux.org (192.168.10.129) 56(84) bytes of data. 64 bytes from 192.168.10.129 (192.168.10.129): icmp_seq=1 ttl=64 time=0.358 ms 64 bytes from 192.168.10.129 (192.168.10.129): icmp_seq=2 ttl=64 time=0.475 ms ^C --- www.yanlinux.org ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1008ms rtt min/avg/max/mdev = 0.358/0.416/0.475/0.061 ms 
  1. 搭建两台web服务器
#web1搭建 [root@web1 ~]$ apt -y install apache2 [root@web1 ~]$ cat /var/www/html/index.html <h1>10.0.0.100 www.yanlinux.org</h1>  #web2搭建 [root@web2 ~]$ yum -y install httpd [root@web2 ~]$ cat > /var/www/html/index.html <h1>10.0.0.18 www.yanlinux.org</h1> 
  1. 搭建HAProxy服务器
[root@haproxy ~]$ cat install_haproxy.sh  #!/bin/bash  HAPROXY_VERSION=2.6.9 HAPROXY_FILE=haproxy-${HAPROXY_VERSION}.tar.gz LUA_VERSION=5.4.4 LUA_FILE=lua-${LUA_VERSION}.tar.gz HAPROXY_INSTALL_DIR=/apps/haproxy  SRC_DIR=/usr/local/src CWD=`pwd` CPUS=`lscpu|awk '/^CPU(s)/{print $2}'` LOCAL_IP=$(hostname -I|awk '{print $1}')  STATS_AUTH_USER=admin STATS_AUTH_PASSWD=123456  . /etc/os-release  color () {     RES_COL=60     MOVE_TO_COL="echo -en \033[${RES_COL}G"     SETCOLOR_SUCCESS="echo -en \033[1;32m"     SETCOLOR_FAILURE="echo -en \033[1;31m"     SETCOLOR_WARNING="echo -en \033[1;33m"     SETCOLOR_NORMAL="echo -en E[0m"     echo -n "$1" && $MOVE_TO_COL     echo -n "["     if [ $2 = "success" -o $2 = "0" ] ;then         ${SETCOLOR_SUCCESS}         echo -n $"  OK  "     elif [ $2 = "failure" -o $2 = "1"  ] ;then         ${SETCOLOR_FAILURE}         echo -n $"FAILED"     else         ${SETCOLOR_WARNING}         echo -n $"WARNING"     fi     ${SETCOLOR_NORMAL}     echo -n "]"     echo }  check_file (){     if [ ! -e ${HAPROXY_FILE} ];then         color "请下载${HAPROXY_FILE}文件!" 1         exit     elif [ ! -e ${LUA_FILE} ];then         color "请先下载${LUA_FILE}文件!" 1         exit     else         color "相关文件已准备" 0     fi }  install_haproxy (){     #安装依赖环境     if [ $ID = "centos" -o $ID = "rocky" ];then         yum -y install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel libtermcap-devel ncurses-devel libevent-devel readline-devel     elif [ $ID = "ubuntu" ];then         apt update         apt -y install gcc make openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev  libreadline-dev libsystemd-dev     else         color "不支持此操作系统!" 1         exit     fi          #安装lua环境     tar xf ${LUA_FILE} -C ${SRC_DIR}     LUA_DIR=${LUA_FILE%.tar*}  #变量高级用法,直接返回去掉.tar*的后缀     cd ${SRC_DIR}/${LUA_DIR}     make all test          #编译安装haproxy     cd ${CWD}     tar xf ${HAPROXY_FILE} -C ${SRC_DIR}     HAPROXY_DIR=${HAPROXY_FILE%.tar*}     cd ${SRC_DIR}/${HAPROXY_DIR}     make -j ${CPUS} ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=${SRC_DIR}/${LUA_DIR}/src/ LUA_LIB=${SRC_DIR}/${LUA_DIR}/src/ PREFIX=${HAPROXY_INSTALL_DIR}     make install PREFIX=${HAPROXY_INSTALL_DIR}     [ $? -eq 0 ] && color "HAProxy编译安装成功" 0 || { color "HAProxy编译安装失败,退出" 1;exit; }      [ -L /usr/sbin/haproxy ] || ln -s ${HAPROXY_INSTALL_DIR}/sbin/haproxy /usr/sbin/ &> /dev/null     [ -d /etc/haproxy ] || mkdir /etc/haproxy &> /dev/null     [ -d /var/lib/haproxy/ ] || mkdir -p /var/lib/haproxy &> /dev/null      #准备配置文件     cat > /etc/haproxy/haproxy.cfg <<EOF global     maxconn 100000     stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin     uid 99     gid 99     daemon      pidfile /var/lib/haproxy/haproxy.pid     log 127.0.0.1 local3 info  defaults     option http-keep-alive     option forwardfor     maxconn 100000     mode http     timeout connect 300000ms     timeout client 300000ms     timeout server 300000ms  listen stats     mode http     bind 0.0.0.0:9999     stats enable     log global     stats uri /haproxy-status     stats auth ${STATS_AUTH_USER}:${STATS_AUTH_PASSWD} EOF      #创建用户     groupadd -g 99 haproxy     useradd -u 99 -g haproxy -d /var/lib/haproxy -M -r -s /sbin/nologin haproxy      #创建service文件     cat > /lib/systemd/system/haproxy.service <<EOF [Unit] Description=HAProxy Load Balancer After=syslog.target network.target  [Service] ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID  [Install] WantedBy=multi-user.target EOF      systemctl daemon-reload     systemctl enable --now haproxy     systemctl is-active haproxy &> /dev/null && color "HAProxy安装完成" 0 || { color "HAProxy安装失败" 1;exit; }      echo "-------------------------------------------------------------------"     echo -e "请访问链接: E[32;1mhttp://${LOCAL_IP}:9999/haproxy-statusE[0m"     echo -e "用户和密码: E[32;1m${STATS_AUTH_USER}/${STATS_AUTH_PASSWD}E[0m" }  main (){     check_file     install_haproxy }  main  #安装haproxy [root@haproxy ~]$ sh install_haproxy.sh  #配置proxies [root@haproxy ~]$ vi /etc/haproxy/haproxy.cfg #在文件最后加上下面几行信息 listen yanlinux_http_80     bind 192.168.10.129:80     mode http     option forwardfor     server web1 10.0.0.100:80 check inter 3000 fall 3 rise 5     server web2 10.0.0.18:80 check inter 3000 fall 3 rise 5  #检查语法 [root@haproxy ~]$ haproxy -c -f /etc/haproxy/haproxy.cfg  Configuration file is valid  #重启服务 [root@haproxy ~]$ systemctl restart haproxy.service  #端口打开 [root@haproxy ~]$ ss -ntl  State      Recv-Q     Send-Q            Local Address:Port           Peer Address:Port     Process      LISTEN     0          128                     0.0.0.0:22                  0.0.0.0:*                     LISTEN     0          128                     0.0.0.0:9999                0.0.0.0:*                     LISTEN     0          128              192.168.10.129:80                  0.0.0.0:*                     LISTEN     0          128                        [::]:22                     [::]:* 
  1. internet服务器测试连接
[root@internet ~]$ curl www.yanlinux.org <h1>10.0.0.100 www.yanlinux.org</h1> [root@internet ~]$ curl www.yanlinux.org <h1>10.0.0.18 www.yanlinux.org</h1> 
  1. 健康性检测
#停掉web1的服务 [root@web1 ~]$ systemctl stop apache2.service   #internet测试,不会轮询到web1服务上了 [root@internet ~]$ curl www.yanlinux.org <h1>10.0.0.18 www.yanlinux.org</h1> [root@internet ~]$ curl www.yanlinux.org <h1>10.0.0.18 www.yanlinux.org</h1> [root@internet ~]$ curl www.yanlinux.org <h1>10.0.0.18 www.yanlinux.org</h1> 

状态页也可以看出来web1下线了

搭建两台web服务器基于HAProxy实现负载均衡