千家信息网

如何使用Haproxy搭建web群集

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,如何使用Haproxy搭建web群集?相信大部分人都还没学会这个技能,为了让大家学会,给大家总结了以下内容,话不多说,一起往下看吧。常见的Web集群调度器目前常见的Web集群调度器分为软件和硬件,软件
千家信息网最后更新 2025年12月02日如何使用Haproxy搭建web群集

如何使用Haproxy搭建web群集?相信大部分人都还没学会这个技能,为了让大家学会,给大家总结了以下内容,话不多说,一起往下看吧。

常见的Web集群调度器

目前常见的Web集群调度器分为软件和硬件,软件通常使用开源的LVS,Haproxy,Nginx,硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子,绿盟等

Haproxy应用分析

LVS在企业应用中负载能力很强,但存在不足

LVS不支持正则处理,不能实现动静分离对于大型网站,LVS的实施配置复杂,维护成本相对较高

Haproxy是一款可提供高可用性,负载均衡,及基于TCP和HTTP应用的代理软件

特别适用于负载特别大的Web站点运行在当前的硬件上可支持数以万计的并发连接连接请求

Haproxy的三种算法

RR (Round Robin)
RR算法是最简单最常用的一种算法,轮询调度
举例理解
有三个节点A,B,C第一个用户访问会被指派到节点A,第二个用户访问会被指派到节点B,第三个用户访问会被指派到节点
第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡

LC (Least Connections)
LC算法即最小连接算法,根据后端的节点连接数大小动态分配请求
举例理解
有三个节点A,B,C,各节点的连接数A:4,B:5,C:6,此时如果有第一个用户连接请求,会被指派到A上,连接数为A:5,B:5,C:6
第二个用户请求会继续分配到A上,连接数变为A:6,B:5,C:6,再有新的请求会分配到B,每次将新的请求指派给连接数最小的客户段
由于实际情况下A,B,C的连接数会动态释放,很难会出现一样连接数的情况,因此算法相比较rr算法有很大改进,是目前用到比较多的一种算法

SH(Source Hashing)
SH即基于来源访问调度算法,此算法用于一些有Session会话记录在服务器段的场景,可以基于来源的IP.Cookie等做集群调度
理解举例
有三个节点A,B,C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B
当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问都会被指派到A,第二个用户访问被指派到B,实现集群的调度
此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

Haproxy的配置文件的三个部分


global:全局配置
defaults:默认配置
listen:应用组件配置

global配置参数

log 127.0.0.1 local: 配置日志记录,配置日志记录,local0为日志设备,默认存放到系统日志log 127.0.0.1 local notice: notice为日志级别,通常有24给级别maxconn 4096 最连接数uid :99 用户uid  d99: 用户gid

defaults配置项配置默认参数,一般会被应用组件继承,如果在应用组件中没有特别声明,将安装默认配置参数设置

log global :定义日志为global配置中的日志定义mode http 模式为httpoption httplog 采用http日志格式记录日志retries 3 检查节点服务器失败连续达到三次则认为节点不可用maxconn 2000 最大连接数contimeout 5000 连接超时时间clitimeout 50000 客户端超时时间srvtimeout 50000 服务器超时时间

listen配置项目一般为配置应用模块参数

listen appli4-backup 0.0.0.0:10004 定义一个appli4-backup的应用option httpchk /index.html 检查服务器的index.html文件option persist 强制将请求发送到已经down掉的服务器balance roundrobin 负载均衡调度算法使用轮询算法server inst1 192.168.100.201:80 check inter 2000 fall 3 定义在线节点server inst2 192.168.100.202:80 check inter 2000 fall 3 定义备份节点

下面开始实验:

我们需要三台虚拟机

4 nginx服务器 192.168.100.201
5 nginx服务器 192.168.100.202
7 Haproxy 服务器 192.168.100.210

7Haproxy 服务器,仅主机模式配置网卡

yum install bzip2-devel pcre-devel gcc gcc-c++ make -y

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME=ens33UUID=849aa04e-1874-490f-8cb0-b2fde4b9a6f8DEVICE=ens33ONBOOT=yesIPADDR=192.168.100.210NETMASK=255.255.255.0GATEWAY=192.168.100.1[root@localhost ~]# systemctl restart network[root@localhost ~]# ifconfig

4nginx 服务器,仅主机模式配置网卡

[root@localhost ~]# yum install pcre-devel zlib-devel gcc gcc-c++ -y ##安装环境包BOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME=ens33UUID=849aa04e-1874-490f-8cb0-b2fde4b9a6f8DEVICE=ens33ONBOOT=yesIPADDR=192.168.100.201NETMASK=255.255.255.0GATEWAY=192.168.100.1[root@localhost ~]# systemctl restart network[root@localhost ~]# ifconfig

配置4nginx服务器

[root@localhost ~]# useradd -M -s /sbin/nologin nginx  ##创建程序性用户[root@localhost ~]# mkdir /chen  ##创建挂载点[root@localhost ~]# mount.cifs //192.168.100.23/LNMP /chen  ##挂载Password for root@//192.168.100.23/LNMP:  [root@localhost chen]# tar zxvf nginx-1.12.2.tar.gz -C /opt/  ##解压[root@localhost chen]# cd /opt/[root@localhost opt]# lsnginx-1.12.2  rh[root@localhost opt]# cd nginx-1.12.2/[root@localhost nginx-1.12.2]# lsauto     CHANGES.ru  configure  html     man     srcCHANGES  conf        contrib    LICENSE  README./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module[root@localhost nginx-1.12.2]# make && make install ##编译[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ ##做软链接让系统能识别nginx的所有人命令[root@localhost nginx-1.12.2]# nginx -t  ##检查语法错误nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

写nginx脚本放在系统启动脚本中方便service管理器管理

[root@localhost nginx-1.12.2]# cd /etc/init.d/ ##到系统启动脚本[root@localhost init.d]# vim nginx   ##写一个nginx脚本#!/bin/bash#chkconfig: - 99 20  #注释信息#description: Nginx Service Control ScriptPROG="/usr/local/nginx/sbin/nginx"  #这个变量,指向我的命令文件PIDF="/usr/local/nginx/logs/nginx.pid"  #这个变量,指向nginx的进程号case "$1" in    start)        $PROG                                                      ;;    stop)        kill -s QUIT $(cat $PIDF)         ;;    restart)                                                          $0 stop        $0 start        ;;    reload)                                                          kill -s HUP $(cat $PIDF)        ;;    *)                                                                           echo "Usage: $0 {start|stop|restart|reload}"                exit 1esacexit 0[root@localhost init.d]# chmod +x nginx  ##给Nginx提升权限[root@localhost init.d]# chkconfig --add nginx  ##添加nginx[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0[root@localhost ~]# cd /usr/local/nginx/html/[root@localhost html]# echo "this is kgc web" > chen.html[root@localhost ~]# systemctl restart nginx[root@localhost ~]# netstat -ntap | grep ngixn[root@localhost ~]# netstat -ntap | grep nginxtcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN 

5nginx 服务器,仅主机模式配置网卡

[root@localhost ~]# yum install pcre-devel zlib-devel gcc gcc-c++ -y ##安装环境包BOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME=ens33UUID=849aa04e-1874-490f-8cb0-b2fde4b9a6f8DEVICE=ens33ONBOOT=yesIPADDR=192.168.100.202NETMASK=255.255.255.0GATEWAY=192.168.100.1[root@localhost ~]# systemctl restart network[root@localhost ~]# ifconfig

配置5nginx服务器

[root@localhost ~]# useradd -M -s /sbin/nologin nginx  ##创建程序性用户[root@localhost ~]# mkdir /chen  ##创建挂载点[root@localhost ~]# mount.cifs //192.168.100.23/LNMP /chen  ##挂载Password for root@//192.168.100.23/LNMP:  [root@localhost chen]# tar zxvf nginx-1.12.2.tar.gz -C /opt/  ##解压[root@localhost chen]# cd /opt/[root@localhost opt]# lsnginx-1.12.2  rh[root@localhost opt]# cd nginx-1.12.2/[root@localhost nginx-1.12.2]# lsauto     CHANGES.ru  configure  html     man     srcCHANGES  conf        contrib    LICENSE  README./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module[root@localhost nginx-1.12.2]# make && make install ##编译[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ ##做软链接让系统能识别nginx的所有人命令[root@localhost nginx-1.12.2]# nginx -t  ##检查语法错误nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

写nginx脚本放在系统启动脚本中方便service管理器管理

[root@localhost nginx-1.12.2]# cd /etc/init.d/ ##到系统启动脚本[root@localhost init.d]# vim nginx   ##写一个nginx脚本#!/bin/bash#chkconfig: - 99 20  #注释信息#description: Nginx Service Control ScriptPROG="/usr/local/nginx/sbin/nginx"  #这个变量,指向我的命令文件PIDF="/usr/local/nginx/logs/nginx.pid"  #这个变量,指向nginx的进程号case "$1" in    start)        $PROG                                                      ;;    stop)        kill -s QUIT $(cat $PIDF)         ;;    restart)                                                          $0 stop        $0 start        ;;    reload)                                                          kill -s HUP $(cat $PIDF)        ;;    *)                                                                           echo "Usage: $0 {start|stop|restart|reload}"                exit 1esacexit 0[root@localhost init.d]# chmod +x nginx  ##给Nginx提升权限[root@localhost init.d]# chkconfig --add nginx  ##添加nginx[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0[root@localhost ~]# cd /usr/local/nginx/html/[root@localhost html]# echo "this is accp web" > chen.html[root@localhost ~]# systemctl restart nginx[root@localhost ~]# netstat -ntap | grep ngixn[root@localhost ~]# netstat -ntap | grep nginxtcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN 

配置7haproxy服务器

[root@localhost ~]# mount.cifs //192.168.100.25/LNMP chen/Password for root@//192.168.100.25/LNMP:  [root@localhost ~]# cd chen/[root@localhost chen]# lsDiscuz_X3.4_SC_UTF8.zip  mysql-boost-5.7.20.tar.gz  php-7.1.10.tar.bz2fang.png                 nginx-1.12.0.tar.gz        php-7.1.20.tar.gz[root@localhost chen]# tar zxvf haproxy-1.5.19.tar.gz -C /opt/[root@localhost ~]# cd /opt/[root@localhost opt]# cd haproxy-1.5.19/make TARGET=linux26 #编译[root@localhost haproxy-1.5.19]# make install[root@localhost haproxy-1.5.19]# mkdir /etc/haproxy[root@localhost haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/[root@localhost haproxy-1.5.19]# vim /etc/haproxy/haproxy.cfg  21         redispatch #把这一行删掉,把请求给荡掉的服务器 8         chroot /usr/share/haproxy #把这行删掉 #先把25 行        srvtimeout      50000 后面的删掉100dd listen  webcluster 0.0.0.0:80            option httpchk GET /chen.html    balance roundrobin    server inst1 192.168.100.201:80 check inter 2000 fall 3        server inst2 192.168.100.202:80 check inter 2000 fall 3

把启动脚本放到系统的脚本中

[root@localhost haproxy-1.5.19]# cp examples/haproxy.init /etc/init.d/haproxy[root@localhost haproxy-1.5.19]# chmod +x /etc/init.d/haproxy [root@localhost haproxy-1.5.19]# chkconfig --add haproxy[root@localhost haproxy-1.5.19]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy[root@localhost haproxy-1.5.19]# service haproxy startStarting haproxy (via systemctl):                          [  确定  ][root@localhost haproxy-1.5.19]# systemctl stop firewalld.service [root@localhost haproxy-1.5.19]# setenforce 0

客户端测试



把日志和系统日志分离出来

把原来的2dd4         log /dev/log    local0 info  5         log /dev/log    local0 notice#创建一个空文件方便管理日志文件[root@localhost haproxy]# cd /etc/rsyslog.d/[root@localhost rsyslog.d]# vim haproxy.conf if ($programname == 'haproxy' and $syslogseverity-text == 'info')then -/var/log/haproxy/haproxy-info.log&~if ($programname == 'haproxy' and $syslogseverity-text == 'notice')then -/var/log/haproxy/haproxy-notice.log&~[root@localhost rsyslog.d]# systemctl restart rsyslog.service

再去客户端去刷新一下网页

去7服务器查看日志有没有被分离出来



[root@localhost rsyslog.d]# cd /var/log/
[root@localhost log]# cd haproxy/[root@localhost haproxy]# lshaproxy-info.log[root@localhost haproxy]# cat haproxy-info.log Nov 29 16:23:01 localhost haproxy[18770]: 192.168.100.50:49418 [29/Nov/2019:16:23:01.526] webcluster webcluster/inst1 1/0/1/1/3 200 252 - - ---- 1/1/0/1/0 0/0 "GET /chen.html HTTP/1.1"

看完上述内容,你们掌握使用Haproxy搭建web群集的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!


配置 服务器 用户 服务 节点 日志 算法 脚本 系统 调度 应用 文件 均衡 三个 管理 参数 变量 命令 客户 指向 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 dede 数据库导入 软件开发公司常见组织结构 服务器系统不激活会影响使用吗 游戏提示服务器获取失败 株洲软件开发工程师速成班 计算机软件开发辛苦吗 发动机应用层软件开发 网络安全与执法人民警察 大一数据库管理系统 软件开发需要32g内存 成为企业微信服务器需要本钱吗 网络技术与服务哪个更重要 升腾服务器厂家 奉化敏捷软件开发企业 数据库主要功能有建立 网络技术迅速发展的原因 硚口靠谱的软件开发团队 时遇网络技术上海有限公司 单位网络安全监测和预警方案 华夏天工网络技术有限公司 软件开发标准化考核 达达软件开发工程师 4路服务器是什么意思 迅雷用什么软件开发的 go实现bitmap数据库 杭州西奥服务器运行次数设置 软件开发用装备 计算机网络技术女孩子学怎么样 浪潮服务器风扇怎么改静音 组态王历史记录与数据库有区别吗
0