
- 外文名
- HAProxy
- 特 点
- 免费、快速并且可靠
- 类 型
- 代理
- 模 型
- 单一进程
- 支 持
- 虚拟主机
-
2021-06-15 18:26:09
haproxy
haproxy简介
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。
HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql的均衡负载。
负载均衡
HAProxy主要为基于 HTTP和 TCP访问的应用服务提供负载均衡,如基于 Internet的连接服务和基于 web的应用服务。通过负载均衡算法, HAproxy能够接受数以万计的访问请求并将其转发到后端服务器池中进行处理,而后端服务器池就如一个强大的虚拟服务器接受 HAProxy转发的请求并进行处理。 HAproxy的请求调度器(Scheduler)决定了后端服务器中每个服务器接受和处理的请求量,在没有权重的调度算法下,调度器为每台服务器分配相同数量的请求,而在加权调度算法下,调度器根据每台服务器的权重为每个后端服务器分配不同数量的请求。 HAProxy允许用户自定义多个代理,并为每个代理提供负载均衡服务,代理由一个前端和一个或多个后端构成,前端定义了代理监听的IP地址(Virtual IP )和端口,同时还需在前端定义中关联与其相关的后端,而在HAProxy中,后端主要用于定义服务器池和负载均衡算法。HAProxy的负载均衡服务在7层,即应用层,在很多情况下,由于商业应用连续性的要求,管理员通常需要部署HAProxy,从而为基于HTTP的应用提供负载均衡和高可用性。haproxy的特点 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作 支持url检测后端的服务器出问题的检测会有很好的帮助。
更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source
Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
不能做Web服务器即Cache。haproxy支持5种连接模式: keep
alive:分析并处理所有的request和response(默认),后端为静态或缓存服务器建议使用此模式。
tunnel:仅分析处理第一个request和response,剩余所有内容不进行任何分析直接转发。1.5版本之前此为默认,现在不建议设置为此模式。
passive
close:在请求和响应首部加上"connection:close"标记的tunnel,在处理完第一个request和response后尝试关闭两端连接。
server
close:处理完第一个response后关闭和server端的连接,但和客户端的连接仍然保持,后端为动态应用程序服务器组建议使用此模式。
forced close:传输完一个response后客户端和服务端都关闭连接HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,
同时可以保护你的web服务器不被暴露到网络上。 HAProxy实现了一种事件驱动,
单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制
、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)
实现所有这负载均衡类型 四层负载均衡
将网络流量负载均衡到多个服务器的最简单方法是使用第4层(传输层)负载均衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量。
用户访问负载均衡器,调度器将用户的请求转发给后端服务器的Web后端组。无论选择哪个后端服务器,都将直接响应用户的请求。通常,Web后端中的所有服务器应该提供相同的内容- 否则用户可能会收到不一致的内容。
七层负载均衡
7层负载均衡是更复杂的负载均衡网络流量的方法是使用第7层(应用层)负载均衡。使用第7层允许调度器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。haproxy的特点 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作 支持url检测后端的服务器出问题的检测会有很好的帮助。
更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source
Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
不能做Web服务器即Cache。 haproxy配置文件 HAProxy 配置文件根据功能和用途,主要有 5
个部分组成,但有些部分并不是必须的, 可以根据需要选择相应的部分进行配置。global 部分 用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
defaults 部分 默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的 frontend、 backend 和
listen 部分中,因此,如果某些参数属于公用的配置,只需在 defaults 部分添加一次即可。而如果在
frontend、backend 和 listen 部分中也配置了与 defaults 部分一样的参数,那么defaults
部分参数对应的值自动被覆盖。frontend 部分 此部分用于设置接收用户请求的前端虚拟节点。frontend 是在 HAProxy1.3
版本之后才引入的一个组件,同时引入的还有 backend 组件。通过引入这些组件,在很大程度上简化了 HAProxy
配置文件的复杂性。frontend 可以根据 ACL 规则直接指定要使用的后端backend 部分 此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。添加的真实服务器类似于
LVS 中的real server 节点。listen 部分 此部分是 frontend 部分和 backend 部分的结合体。在 HAProxy1.3 版本之前, HAProxy
的所有配置选项都在这个部分中设置。为了保持兼容性,HAProxy 新的版本仍然保留了 listen 组件的配置方式。目前在 HAProxy
中,两种配置方式任选其一即可。配置实例
安装haproxy[root@lb ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel [root@lb ~]# useradd -r -M -s /sbin/nologin haproxy [root@lb ~]# tar xf haproxy-2.4.0.tar.gz [root@lb ~]# cd haproxy-2.4.0 [root@lb haproxy-2.4.0]# make clean [root@lb haproxy-2.4.0]# make -j $(grep 'processor' /proc/cpuinfo |wc -l) \ > TARGET=linux-glibc \ > USE_OPENSSL=1 \ > USE_ZLIB=1 \ > USE_PCRE=1 \ > USE_SYSTEMD=1 make install PREFIX=/usr/local/haproxy [root@lb haproxy-2.4.0]# echo "export PATH=/usr/local/haproxy/sbin:$PATH">/etc/profile.d/haproxy.sh [root@lb haproxy-2.4.0]# . /etc/profile.d/haproxy.sh [root@lb haproxy-2.4.0]# which haproxy /usr/local/haproxy/sbin/haproxy
配置各个负载的内核参数
[root@lb haproxy-2.4.0]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf [root@lb haproxy-2.4.0]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf[root@lb haproxy-2.4.0]# sysctl -p net.ipv4.ip_nonlocal_bind = 1 net.ipv4.ip_forward = 1
编写配置文件
[root@lb haproxy-2.4.0]# cat > /etc/haproxy/haproxy.cfg <<EOF > #--------------全局配置---------------- > global > log 127.0.0.1 local0 info > #log loghost local0 info > maxconn 20480 > #chroot /usr/local/haproxy > pidfile /var/run/haproxy.pid > #maxconn 4000 > user haproxy > group haproxy > daemon > #--------------------------------------------------------------------- > #common defaults that all the 'listen' and 'backend' sections will > #use if not designated in their block > #--------------------------------------------------------------------- > defaults > mode http > log global > option dontlognull > option httpclose > option httplog > #option forwardfor > option redispatch > balance roundrobin > timeout connect 10s > timeout client 10s > timeout server 10s > timeout check 10s > maxconn 60000 > retries 3 > #--------------统计页面配置------------------ > listen admin_stats > bind 0.0.0.0:8189 > stats enable > mode http > log global > stats uri /haproxy_stats > stats realm Haproxy\ Statistics > stats auth admin:admin > #stats hide-version > stats admin if TRUE > stats refresh 30s > #---------------web设置----------------------- > listen webcluster > bind 0.0.0.0:80 > mode http > #option httpchk GET /index.html > log global > maxconn 3000 > balance roundrobin > cookie SESSION_COOKIE insert indirect nocache > server web01 192.168.136.133:80 check inter 2000 fall 5 > server web02 192.168.136.134:80 check inter 2000 fall 5 > EOF
启用日志
[root@lb haproxy-2.4.0]# vim /etc/rsyslog.conf local0.* /tmp/haproxy.log [root@lb haproxy-2.4.0]# systemctl restart rsyslog 1 2 3 编写.service文件 [root@lb haproxy-2.4.0]# cat > /usr/lib/systemd/system/haproxy.service <<EOF > [Unit] > Description=HAProxy Load Balancer > After=syslog.target network.target > > [Service] > ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q > ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid > ExecReload=/bin/kill -USR2 $MAINPID > > [Install] > WantedBy=multi-user.target > EOF [root@lb haproxy-2.4.0]# systemctl daemon-reload
重启服务
[root@lb haproxy-2.4.0]# systemctl enable --now haproxy [root@lb haproxy-2.4.0]# ss -anlt State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 0.0.0.0:8189 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 80 *:3306 *:*
更多相关内容 -
haproxy:HAProxy 的 Docker 官方镜像打包
2021-07-24 06:42:47这是的的 Git (不要与haproxy上游提供的任何官方haproxy镜像混淆)。 有关如何使用此 Docker 映像的完整自述文件以及有关贡献和问题的信息,请参阅。 的 生成/维护,特别是。 看到此处合并的更改尚未显示在 Docker... -
haproxy-lua-cors:Lua库,用于在HAProxy中启用CORS
2021-05-04 13:10:52HAProxy CORS Lua库 Lua库,用于在HAProxy中启用CORS。 背景 跨域请求共享使您可以允许在不同域中运行的客户端代码调用服务。 该模块扩展了HAProxy,以便: 设置一个Access-Control-Allow-Methods标头以响应预检... -
zabbix_haproxy:用于监控 haproxy 的 Zabbix 脚本
2021-06-28 01:24:52zabbix_haproxy 用于监控 haproxy 的 Zabbix 脚本 用法: zhaproxy.py -d :发现前端/后端配置 zhaproxy.py -c : 检查所有前端/后端配置 zhaproxy.py -p <proxy> -s <server> -v <attribute> : 获取指定值 用户... -
kube2haproxy:Kubernetes的高可用性HAProxy自动配置和自动服务发现
2021-02-03 16:09:06kube2haproxy kube2haproxy是一个守护进程,可为Kubernetes上部署的服务自动配置Keepalived&HAProxy。 它具有以下特点: 高可用性HAProxy,支持ip故障转移。 根据您的模板自动配置Keepalived&HAProxy配置文件... -
k8s-ingress-haproxy:用于HAProxy的Kubernetes入口控制器
2021-02-20 07:35:19Kubernetes入口控制器-HAProxy 维护者:尼克·舒赫 用于HAPRoxy的Kubernetes入口控制器。 发展 入门 要进行此项目,您首先需要在计算机上安装Go。 手动设定 首先,请确保正确安装Go,并且已设置GOPATH。 您还需要将... -
haproxy-1.8.23-1.el7.x86_64.rpm haproxy 1.8.23 rpm包
2020-01-20 22:51:20haproxy-1.8.23 RPM包 for Centos7 rpm -ivh 安装即可,软件目录:/usr/local/haproxy-1.8.23 配置文件: /etc/haproxy/haproxy.cfg 可通过 systemctl 来进行 start 、stop 、restart 可通过 systemctl enable... -
一个典型的Haproxy_exporter的监控metric例子.txt
2020-07-17 18:21:09一个典型的Haproxy_exporter的监控metric例子 包含指标 haproxy_backend_bytes_in_total haproxy_backend_bytes_out_total haproxy_backend_client_aborts_total haproxy_backend_compressor_bytes_bypassed_total ... -
HAProxy
2022-01-01 14:25:12编译安装haproxy,haproxy的调度算法,haproxy的搭建监控页面,基于haproxy,实现网页动静分离以及实现https。一、编译安装haproxy
解决lua环境(Centos7)
由于CentOS7 之前版本自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy。参考链接:http://www.lua.org/start.html
##查看当前系统自带的lua版本 [root@node5 ~]# lua -v Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio ##安装基础命令及编译依赖环境 [root@node5 ~]# yum install gcc readline-devel -y [root@node5 ~]# wget http://www.lua.org/ftp/lua-5.3.5.tar.gz [root@node5 ~]# tar xvf lua-5.3.5.tar.gz -C /usr/local/src [root@node5 ~]# cd /usr/local/src/lua-5.3.5 [root@node5 ~]# make linux test ##查看编译安装的版本 [root@node5 lua-5.3.5]# src/lua -v Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
编译安装HAProxy
haproxy官方网址:http://www.haproxy.org/
[root@node5 ~]# yum -y install gcc openssl-devel pcre-devel systemd-devel gcc-c++ [root@node5 ~]# wget http://www.haproxy.org/download/2.2/src/haproxy-2.2.19.tar.gz [root@node5 ~]# tar xf haproxy-2.2.19.tar.gz -C /usr/local/src/ [root@node5 ~]# cd /usr/local/src/haproxy-2.2.19/ ##可参考INSTALL文件进行编译安装 [root@node5 haproxy-2.2.19]# make -j 4 ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ [root@node5 haproxy-2.2.19]# make install PREFIX=/usr/local/haproxy ##查看生成的文件 [root@node5 haproxy-2.2.19]# tree /usr/local/haproxy/ /usr/local/haproxy/ ├── doc │ └── haproxy │ ├── 51Degrees-device-detection.txt │ ├── architecture.txt │ ├── close-options.txt │ ├── configuration.txt │ ├── cookie-options.txt │ ├── DeviceAtlas-device-detection.txt │ ├── intro.txt │ ├── linux-syn-cookies.txt │ ├── lua.txt │ ├── management.txt │ ├── netscaler-client-ip-insertion-protocol.txt │ ├── network-namespaces.txt │ ├── peers.txt │ ├── peers-v2.0.txt │ ├── proxy-protocol.txt │ ├── regression-testing.txt │ ├── seamless_reload.txt │ ├── SOCKS4.protocol.txt │ ├── SPOE.txt │ └── WURFL-device-detection.txt ├── sbin │ └── haproxy └── share └── man └── man1 └── haproxy.1 ##验证编译安装的HAProxy版本 [root@node5 haproxy-2.2.19]# cp /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy [root@node5 haproxy-2.2.19]# which haproxy /usr/sbin/haproxy [root@node5 haproxy-2.2.19]# haproxy -v HA-Proxy version 2.2.19-7ea3822 2021/11/29 - https://haproxy.org/ Status: long-term supported branch - will stop receiving fixes around Q2 2025. Known bugs: http://www.haproxy.org/bugs/bugs-2.2.19.html Running on: Linux 5.4.148-1.el7.elrepo.x86_64 #1 SMP Tue Sep 21 10:51:21 EDT 2021 x86_64 ##创建haproxy.service文件 [root@node5 ~]# cat /usr/lib/systemd/system/haproxy.service [Unit] Description=HAProxy Load Balancer After=syslog.target network.target [Service] ExecStartPre=/usr/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -c -q ExecStart=/usr/sbin/haproxy -Ws -f /usr/local/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target [root@node5 haproxy-2.2.19]# systemctl daemon-reload ##创建自定义的配置文件,要与haproxy.service中写的路径相对应不然启动会报错 [root@node5 ~]# cat /usr/local/haproxy/haproxy.cfg global maxconn 100000 chroot /usr/local/haproxy stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin user haproxy group haproxy daemon pidfile /var/lib/haproxy/haproxy.pid log 127.0.0.1 local2 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 *:9999 stats enable log global stats uri /haproxy-status stats auth admin:123456 listen web_port bind *:80 mode http log global server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 ##172.20.21.70后端服务器准备一个测试页面,关闭selinux [root@node1 ~]# setenforce 0 [root@node1 ~]# yum install -y nginx [root@node1 ~]# vim /etc/nginx/nginx.conf server { ... listen 80; root /data/nginx/html; #修改对应的网页文件路径 } ... [root@node1 ~]# mkdir /data/nginx/html -p [root@node1 ~]# echo 172.20.21.70 web page > /data/nginx/html/index.html [root@node1 ~]# chown -R nginx. /data/nginx/ [root@node1 ~]# systemctl start nginx ##访问测试 [root@node1 ~]# curl 172.20.21.70 172.20.21.70 web page [root@node5 haproxy-2.2.19]# mkdir /var/lib/haproxy [root@node5 haproxy-2.2.19]# useradd -s /sbin/nologin haproxy [root@node5 haproxy-2.2.19]# chown haproxy. /var/lib/haproxy [root@node5 haproxy-2.2.19]# systemctl start haproxy [root@node5 haproxy-2.2.19]# systemctl status haproxy ● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled) Active: active (running) since 六 2022-01-01 14:58:47 CST; 3min 15s ago Process: 2454 ExecStartPre=/usr/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -c -q (code=exited, status=0/SUCCESS) Main PID: 2457 (haproxy) CGroup: /system.slice/haproxy.service ├─2457 /usr/sbin/haproxy -Ws -f /usr/local/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid └─2460 /usr/sbin/haproxy -Ws -f /usr/local/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid 1月 01 14:58:47 node5 systemd[1]: Starting HAProxy Load Balancer... 1月 01 14:58:47 node5 systemd[1]: Started HAProxy Load Balancer. 1月 01 14:58:47 node5 haproxy[2457]: [NOTICE] 000/145847 (2457) : New worker #1 (2460) forked ##访问haproxy主机测试,显示的是后端nginx的自定义的页面 [root@node5 ~]# curl 172.20.21.131 172.20.21.70 web page
global:全局配置段参数详解
官方文档: HAProxy version 2.0.22 - Starter Guide
chroot #锁定运行目录 deamon #以守护进程运行 stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1 #socket文件 user, group, uid, gid #运行haproxy的用户身份 nbproc n #开启的haproxy work 进程数,默认进程数是一个 #nbthread 1 #指定每个haproxy进程开启的线程数,默认为每个进程一个线程,和nbproc互斥(版本有关) #如果同时启用nbproc和nbthread 会出现以下日志的错误,无法启动服务 Apr 7 14:46:23 haproxy haproxy: [ALERT] 097/144623 (1454) : config : cannot enable multiple processes if multiple threads are configured. Please use either nbproc or nbthread but not both. cpu-map 1 0 #绑定haproxy 进程至指定CPU,将第一个work进程绑定至0号CPU maxconn n #每个haproxy进程的最大并发连接数 maxsslconn n #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下 maxconnrate n #每个进程每秒创建的最大连接数量 spread-checks n #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0 pidfile #指定pid文件路径 log 127.0.0.1 local2 info #定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个
二 haproxy作为代理服务器,将web服务代理至后端两台nginx
haproxy代理服务器:172.20.21.131
nginx后端服务器1: 172.20.21.70
nginx后端服务器2: 172.20.21.70
配置后端nginx服务器
##172.20.21.70后端服务器准备一个测试页面,关闭selinux [root@node1 ~]# setenforce 0 [root@node1 ~]# yum install -y nginx [root@node1 ~]# vim /etc/nginx/nginx.conf server { ... listen 80; root /data/nginx/html; #修改对应的网页文件路径 } ... [root@node1 ~]# mkdir /data/nginx/html -p [root@node1 ~]# echo 172.20.21.70 web1 page > /data/nginx/html/index.html [root@node1 ~]# chown -R nginx. /data/nginx/ [root@node1 ~]# systemctl start nginx ##访问测试 [root@node1 ~]# curl 172.20.21.70 172.20.21.70 web1 page ##172.20.21.80后端服务器准备一个测试页面,关闭selinux [root@node2 ~]# setenforce 0 [root@node2 ~]# yum install -y nginx [root@node2 ~]# vim /etc/nginx/nginx.conf server { ... listen 80; root /data/nginx/html; #修改对应的网页文件路径 } ... [root@node2 ~]# mkdir /data/nginx/html -p [root@node2 ~]# echo 172.20.21.80 web2 page > /data/nginx/html/index.html [root@node2 ~]# chown -R nginx. /data/nginx/ [root@node2 ~]# systemctl start nginx ##访问测试 [root@node2 ~]# curl 172.20.21.80 172.20.21.80 web2 page
修改haproxy服务器配置文件对应的后端服务器
[root@node5 haproxy-2.2.19]# vim /usr/local/haproxy/haproxy.cfg ##修改对应的后端服务器 listen web_port bind *:80 mode http log global server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5 [root@node5 haproxy-2.2.19]# systemctl restart haproxy
访问测试
访问haproxy的web服务,将由后端两台nginx服务器轮询响应
##访问测试 [root@node5 ~]# while true;do curl http://172.20.21.131;sleep 1;done 172.20.21.70 web1 page 172.20.21.80 web2 page 172.20.21.70 web1 page 172.20.21.80 web2 page 172.20.21.70 web1 page 172.20.21.80 web2 page
三 haproxy调度算法
HAProxy通过固定参数
balance
指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。
官方文档:http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4-balance
静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启HAProxy生效。静态算法有两种:static-rr和first
注:静态算法无法利用工具socat对服务器动态权重调整
static-rr
static-rr:基于权重的轮询调度,不支持权重的运行时利用socat进行动态调整及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的wrr
[root@node5 ~]# vim /usr/local/haproxy/haproxy.cfg listen websrc_80 bind *:80 mode http log global balance static-rr server web1 172.20.22.70:80 weight 1 check inter 3000 fall 2 rise 5 server web2 172.20.22.80:80 weight 2 check inter 3000 fall 2 rise 5 #重启haproxy,访问测试 [root@node5 ~]# systemctl restart haproxy #如果静态算法,如:static-rr,可以更改weight为0或1,但不支持动态更改weight为其它值,否则会提示下面信息 [root@node5 ~]# echo "set weight websrc_80/web1 0" | socat stdio /var/lib/haproxy/haproxy.sock [root@node5 ~]# echo "set weight websrc_80/web1 1" | socat stdio /var/lib/haproxy/haproxy.sock [root@node5 ~]# echo "set weight websrc_80/web1 2" | socat stdio /var/lib/haproxy/haproxy.sock Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.
first
[root@node5 ~]# vim /usr/local/haproxy/haproxy.cfg listen websrc_80 bind 172.20.22.22:80,:8801-8810,172.20.22.22:9001-9010 mode http log global balance first ##指定调度算法 server web1 172.20.22.11:80 maxconn 2 weight 1 check inter 3000 fall 2 rise 5 server web2 172.20.22.12:80 weight 1 check inter 3000 fall 2 rise 5 [root@node5 ~]# systemctl restart haproxy ##分别在两台测试机器同时运行下面命令,观察结果 # while true;do curl http://172.20.21.131/index.html ; sleep 0.1;done
动态算法
动态算法:基于后端服务器状态进行调度适当调整,优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。 动态算法可利用工具socat对服务器动态权重调整
roundrobin
roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的rr轮询模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整,roundrobin为默认调度算法。
listen web_port bind *:80 mode http log global balance roundrobin server web1 172.20.21.70:80 weight 1 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 weight 2 check inter 3000 fall 2 rise 5 ##支持动态调整权重 [root@node5 ~]# echo "get weight web_port/web1" | socat stdio /var/lib/haproxy/haproxy.sock 1 (initial 1) [root@node5 ~]# echo "set weight web_port/web1 3" | socat stdio /var/lib/haproxy/haproxy.sock [root@node5 ~]# echo "get weight web_port/web1" | socat stdio /var/lib/haproxy/haproxy.sock 3 (initial 1)
leastconn
leastconn加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最好的优先调度(新客户端连接),比较适合长连接的场景使用,比如:MySQL等场景。
listen web_port bind *:80 mode http log global balance leastconn server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5
其他算法
其它算法即可作为静态算法,又可以通过选项成为动态算法
source
源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session会话保持但不支持cookie和缓存的场景。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景。
源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
hash-type:哈希算法
map-based:除权取余法,哈希数据结构是静态的数组;静态;
consistent:一致性哈希,哈希数据结构是一个树;动态;
map-based取模法
map-based:取模法,基于服务器总权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因为权重发生变化而导致调度结果整体改变,hash-type 指定的默认值为此算法
listen web_port bind *:80 mode http log global balance source hash-type map-based #指定的默认算法,可不写 server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5 # echo "get weight web_port/web2" | socat stdio /var/lib/haproxy/haproxy.sock 1 (initial 1) # echo "set weight web_port/web2 10" | socat stdio /var/lib/haproxy/haproxy.sock Backend is using a static LB algorithm and only accepts weights '0%' and '100%'. # echo "set weight web_port/web2 0" | socat stdio /var/lib/haproxy/haproxy.sock # echo "get weight web_port/web2" | socat stdio /var/lib/haproxy/haproxy.sock 0 (initial 1)
一致性hash
consistent:一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n ,该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动
算法: 1、key1=hash(source_ip)%(2^32) [0---4294967295] 2、keyA=hash(后端服务器虚拟ip)%(2^32) 3、将key1和keyA都放在hash环上,将用户请求调度到离key1最近的keyA对应的后端服务器 hash环偏斜问题: 增加虚拟服务器IP数量,比如:一个后端服务器根据权重为1生成1000个虚拟IP,再hash。而后端服务器权重为2则生成2000的虚拟IP,再bash,最终在hash环上生成3000个节点,从而解决hash环偏斜问题
hash对象:Hash对象到后端服务器的映射关系
一致性hash示意图:后端服务器在线与离线的调度方式
一致性hash配置示例
listen web_port bind *:80 mode http log global balance source hash-type consistent server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5 # echo "get weight web_port/web2" | socat stdio /var/lib/haproxy/haproxy.sock 1 (initial 1) # echo "set weight web_port/web2 5" | socat stdio /var/lib/haproxy/haproxy.sock # echo "get weight web_port/web2" | socat stdio /var/lib/haproxy/haproxy.sock 5 (initial 1)
uri
基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后,根据最终结果将请求转发到后端指定服务器,适用于后端是缓存服务器场景,默认是静态,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash。注意:此算法是应用层,所有只支持 mode http ,不支持 mode tcp
listen web_port bind *:80 mode http log global balance uri hash-type consistent server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5
url_param
url_param对用户请求的url中的params部分中的一个参数key对应的value值做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server,如果没有key,将按roundrobin算法。
假设: url = http://www.magedu.com/foo/bar/index.php?key=value 则: host = "www.magedu.com" url_param = "key=value" listen web_port bind *:80 mode http log global balance url_param name hash-type consistent server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5 ##访问测试 # while true;do curl http://172.20.21.131/index.html?name=jack;sleep 1;done # while true;do curl http://172.20.22.131/index.html?name=tom;sleep 1;done
hdr
针对用户每个http头部(header)请求中的指定信息做hash,此处由name指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如无有效的值则会使用默认的轮询调度。
listen web_port bind *:80 mode http log global balance hdr(User-Agent) hash-type consistent server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5 ##访问测试 #curl -v http://172.20.21.131/index.html #curl -vA 'firefox' http://172.20.21.131/index.html #curl -vA 'chrome' http://172.20.21.131/index.html
rdb-cookie
rdp-cookie对远windows远程桌面的负载,使用cookie保持会话,默认是静态,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash。
listen RDB bind *:3389 mode tcp balance rdp-cookie hash-type consistent persist rdp-cookie #启用基于RDB cookie的持久连接,同一个cookie就转发给对应的服务器 tcp-request inspect-delay 5s #设置内容检查期间等待数据的最大允许时间 tcp-request content accept if RDP_COOKIE #匹配RDP_COOKIE存在就就收请求 server rdp0 172.20.21.171:3389 weight 1 check inter 3000 fall 3 rise 5
random
在1.9版本开始增加一个叫做random的负载平衡算法,其基于随机数作为一致性hash的key,随机负载平衡对于大型服务器场或经常添加或删除服务器非常有用,支持weight的动态调整,weight较大的主机有更大概率获取新请求
listen web_port bind *:80 mode http log global balance random server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5
算法总结
static-rr--------->tcp/http 静态
first------------->tcp/http 静态roundrobin-------->tcp/http 动态
leastconn--------->tcp/http 动态
random------------>tcp/http 动态以下静态和动态取决于hash_type是否consistent
source------------>tcp/http
Uri--------------->http
url_param--------->http
hdr--------------->http
rdp-cookie-------->tcpfirst #使用较少
static-rr #做了session共享的web集群
roundrobin
randomleastconn #数据库
source #基于客户端公网IP的会话保持Uri--------------->http #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯
url_param--------->httphdr #基于客户端请求报文头部做下一步处理
rdp-cookie #很少使用
haproxy监控界面
通过web界面,显示当前HAProxy的运行状态
官方文档HAProxy version 2.1.12 - Configuration Manual
状态页配置项
stats enable #基于默认的参数启用stats page stats hide-version #将状态页中haproxy版本隐藏 stats refresh <delay> #设定自动刷新时间间隔,默认不自动刷新 stats uri <prefix> #自定义stats page uri,默认值:/haproxy?stats stats realm <realm> #账户认证时的提示信息,示例:stats realm HAProxy\ Statistics stats auth <user>:<passwd> #认证时的账号和密码,可使用多次,默认:no authentication,可有多行用户 stats admin { if | unless } <cond> #启用stats page中的管理功能
启用状态页
[root@node5 ~]# vim /usr/local/haproxy/haproxy.cfg listen stats bind :9999 stats enable stats hide-version stats uri /haproxy-status stats realm HAProxy\ Stats\ Page stats auth admin:123456 stats refresh 30s #stats admin if TRUE #启用管理接口功能,安全原因,不建议打开 [root@node5 ~]# systemctl restart haproxy
登录状态页
浏览器访问管理界面:http://172.20.21.131:9999/haproxy-status
四 基于haproxy,实现网页动静分离
访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。
官方文档:
http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#7
http://cbonte.github.io/haproxy-dconv/2.0/configuration.html#7ACL示例-基于文件后缀名实现动静分离
frontend websrc_80 bind *:80 mode http log global option httplog balance roundrobin ###############ACL settings################## acl acl_static path_end -i .jpg .jpeg .png .gif .css .js acl acl_php path_end -i .php ##############host######################### use_backend static_server if acl_static use_backend php_server if acl_php backend static_server mode http server web1 172.20.21.80:80 check weight 1 inter 3000 fall 3 rise 5 backend php_server mode http server web2 172.20.21.70:80 check weight 1 inter 3000 fall 3 rise 5 #172.20.21.80上传图片 [root@node2 ~]# ls -lrt /data/nginx/html/1.png -rw-r--r--. 1 root root 588707 11月 8 2020 /data/nginx/html/1.png #172.20.21.70准备php测试页面 [root@node1 ~]# yum install -y php-fpm php-mysql [root@node1 ~]# systemctl start php-fpm [root@node1 ~]# vim /etc/nginx/nginx.conf server { listen 80; server_name localhost; root /data/nginx/html; location ~ \.php$ { index index.php; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } [root@node1 ~]# nginx -t [root@node1 ~]# vim /data/nginx/html/index.php <?php phpinfo(); ?> [root@node1 ~]# systemctl restart nginx
访问测试
访问php动态资源由定义的后端nginx 172.20.21.70服务器响应,静态资源则由172.20.21.80服务器响应
浏览器访问http://172.20.21.131/index.php测试
浏览器访问http://172.20.21.131/1.png测试
五 HAProxy实现https
相关配置
#配置HAProxy支持https协议,支持ssl会话; bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE #crt 后证书文件为PEM格式,且同时包含证书和所有私钥 cat demo.crt demo.key > demo.pem #把80端口的请求重向定443 bind *:80 redirect scheme https if !{ ssl_fc } #向后端传递用户请求的协议和端口(frontend或backend) http_request set-header X-Forwarded-Port %[dst_port] http_request add-header X-Forwared-Proto https if { ssl_fc }
https配置示例
##证书制作 [root@node5 ~]# cd /usr/local/haproxy/ [root@node5 haproxy]# ls -lrt [root@node5 haproxy]# mkdir certs [root@node5 haproxy]# cd certs/ [root@node5 certs]# openssl genrsa -out haproxy.key 2048 Generating RSA private key, 2048 bit long modulus ...........+++ ....................+++ e is 65537 (0x10001) [root@node5 certs]# openssl req -new -x509 -key haproxy.key -out haproxy.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:ShangHai Locality Name (eg, city) [Default City]:ShangHai Organization Name (eg, company) [Default Company Ltd]:magedu.net Organizational Unit Name (eg, section) []:magedu Common Name (eg, your name or your server's hostname) []:www.magedu.net Email Address []: [root@node5 certs]# ll 总用量 8 -rw-r--r-- 1 root root 1350 1月 1 19:28 haproxy.crt -rw-r--r-- 1 root root 1679 1月 1 19:25 haproxy.key [root@node5 certs]# cat haproxy.crt haproxy.key > haproxy.pem [root@node5 certs]# openssl x509 -in haproxy.pem -noout -text Certificate: Data: Version: 3 (0x2) Serial Number: 99:9b:c5:0f:df:70:a7:8e Signature Algorithm: sha256WithRSAEncryption Issuer: C=CN, ST=ShangHai, L=ShangHai, O=magedu.net, OU=magedu, CN=www.magedu.net Validity Not Before: Jan 1 11:28:19 2022 GMT Not After : Jan 31 11:28:19 2022 GMT Subject: C=CN, ST=ShangHai, L=ShangHai, O=magedu.net, OU=magedu, CN=www.magedu.net Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) ##https配置 [root@node5 ~]# vim /usr/local/haproxy/haproxy.cfg frontend websrc_80 bind *:80 bind *:443 ssl crt /usr/local/haproxy/certs/haproxy.pem redirect scheme https if !{ ssl_fc } http-request set-header X-forwarded-Port %[dst_port] http-request add-header X-forwarded-Proto https if { ssl_fc } mode http log global option httplog default_backend ngxsrv-hosts backend ngxsrv-hosts mode http balance roundrobin server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5 server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5 [root@node5 ~]# systemctl restart haproxy [root@node5 ~]# ss -tnlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 32768 *:9999 *:* users:(("haproxy",pid=2811,fd=7)) LISTEN 0 32768 *:80 *:* users:(("haproxy",pid=2811,fd=8)) LISTEN 0 128 *:22 *:* users:(("sshd",pid=1007,fd=3)) LISTEN 0 32768 *:443 *:* users:(("haproxy",pid=2811,fd=9)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1007,fd=4))
访问测试
添加hosts访问测试,http://www.magedu.net
-
haproxy-inress:HAProxy入口
2021-02-03 15:50:41HAProxy入口控制器 负载控制器实现。 HAProxy Ingress是Kubernetes入口控制器:它配置HAProxy实例,以将传入请求从外部网络路由到集群内应用程序。 路由配置是从Kubernetes集群读取规范而构建的。 对群集所做的更新... -
Windows Haproxy-2.0.2.zip
2020-05-15 16:17:18HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, ... -
Haproxy详解以及基于Haproxy的高可用实战
2021-01-09 10:52:311.Haproxy与Keepalived VRRP 介绍 软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。 负载均衡是通过OSI协议对应的 7层负载均衡:用的7层... -
haproxy-2.3.5(windows版).rar
2021-06-18 17:33:55windows版本已编译Haproxy-2.3.5稳定版 -
Haproxy
2021-10-17 14:29:55一、haproxy概述 haproxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。 haproxy的特点 支持tcp / http 两种协议层的负载均衡,使得其负载...一、Haproxy概述
haproxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
haproxy的特点
- 支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
- 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
- 性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
- 拥有一个功能出色的监控页面,实时了解系统的当前状况。
- 功能强大的ACL支持,给用户极大的方便。
haproxy算法:
-
1.roundrobin
基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整. -
2.static-rr
基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制 -
3.leastconn
新的连接请求被派发至具有最少连接数目的后端服务器.
二、Haproxy负载均衡http
环境说明:
主机名 ip 职责 item 192.168.91.134 Haprosy task1 192.168.91.135 web界面 task2 192.168.91.137 web界面 item 准备工作 // 关闭防火墙和selinux [root@item ~]# systemctl disable --now firewalld Removed /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@item ~]# setenforce 0
task1 准备工作 // 关闭防火墙和selinux [root@task1 ~]# systemctl disable --now firewalld Removed /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@task1 ~]# setenforce 0 // 启动httpd,添加web内容 [root@task1 ~]# yum -y install httpd [root@task1 ~]# systemctl enable --now httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service. [root@task1 ~]# echo "amu" > /var/www/html/index.html [root@task1 ~]# curl 127.0.0.1 amu
task2准备工作 // 关闭防火墙和selinux [root@task2 ~]# systemctl disable --now firewalld Removed /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@task2 ~]# setenforce 0 // 启动httpd,添加web内容 [root@task2 ~]# yum -y install httpd [root@task2 ~]# systemctl enable --now httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service. [root@task2 ~]# echo "gf" > /var/www/html/index.html [root@task2 ~]# curl 127.0.0.1 gf
安装haproxy // 安装编译工具以及依赖包 [root@item ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel vim // 创建一个服务用户 [root@item ~]# useradd -r -M -s /sbin/nologin haproxy [root@item ~]# id haproxy uid=994(haproxy) gid=991(haproxy) groups=991(haproxy) // 把之前下好的haproxy包传上去 [root@item ~]# ls anaconda-ks.cfg haproxy-2.4.0.tar.gz // 解压编译 [root@item ~]# tar xf haproxy-2.4.0.tar.gz [root@item ~]# ls anaconda-ks.cfg haproxy-2.4.0 haproxy-2.4.0.tar.gz [root@item ~]# cd haproxy-2.4.0 [root@item haproxy-2.4.0]# make clean [root@item haproxy-2.4.0]# make -j $(grep 'processor' /proc/cpuinfo |wc -l) \ TARGET=linux-glibc \ USE_OPENSSL=1 \ USE_ZLIB=1 \ USE_PCRE=1 \ USE_SYSTEMD=1 [root@item haproxy-2.4.0]# make install PREFIX=/usr/local/haproxy // copy启动文件 [root@item haproxy-2.4.0]# cd /usr/local/haproxy/sbin/ [root@item sbin]# ls haproxy [root@item sbin]# cp haproxy /usr/sbin/ [root@item sbin]# which haproxy /usr/sbin/haproxy
配置各个内核的负载参数 [root@item sbin]# cd [root@item ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf [root@item ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf [root@item ~]# sysctl -p net.ipv4.ip_nonlocal_bind = 1 net.ipv4.ip_forward = 1
提供配置文件 [root@item ~]# mkdir /etc/haproxy [root@item ~]# vim /etc/haproxy/haproxy.cfg [root@item ~]# cat /etc/haproxy/haproxy.cfg #--------------全局配置---------------- global log 127.0.0.1 local0 info #log loghost local0 info maxconn 20480 #chroot /usr/local/haproxy pidfile /var/run/haproxy.pid #maxconn 4000 user haproxy group haproxy daemon #--------------------------------------------------------------------- #common defaults that all the 'listen' and 'backend' sections will #use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option dontlognull option httpclose option httplogZZZZ #option forwardfor option redispatch balance roundrobin timeout connect 10s timeout client 10s timeout server 10s timeout check 10s maxconn 60000 retries 3 #--------------统计页面配置------------------ listen admin_stats bind 0.0.0.0:8189 stats enable mode http log global stats uri /haproxy_stats stats realm Haproxy\ Statistics stats auth admin:admin #stats hide-version stats admin if TRUE stats refresh 30s #---------------web设置----------------------- listen webcluster bind 0.0.0.0:80 mode http #option httpchk GET /index.html log global maxconn 3000 balance roundrobin cookie SESSION_COOKIE insert indirect nocache server task1 192.168.91.135:80 check inter 2000 fall 5 //task1 服务器ip server task2 192.168.91.137:80 check inter 2000 fall 5 //task2 服务器ip
haproxy.service文件编写 [root@item ~]# vim /usr/lib/systemd/system/haproxy.service [root@item ~]# cat /usr/lib/systemd/system/haproxy.service [Unit] Description=HAProxy Load Balancer After=syslog.target network.target [Service] ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target // 重新加载进程 [root@item ~]# systemctl daemon-reload
x 启动日志// 修改日志文件[root@item ~]# vim /etc/rsyslog.conf # Save boot messages also to boot.loglocal0.* /var/log/boot.log// 重启日志[root@item ~]# systemctl restart rsyslog
启动haproxy服务 [root@item ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 0.0.0.0:8189 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:*
web 页面访问
三、Haproxy配置负载均衡(https)
还是以上面这些主机为例
task1上安装mod_ssl [root@task1 ~]# yum -y install mod_ssl // 这里就不做证书,使用默认的证书,重启服务查看443是否启动 [root@task1 ~]# systemctl restart httpd [root@task1 ~]# ss -antl 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 *:80 *:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 128 *:443 *:* task2上安装mod_ssl [root@task2 ~]# yum -y install mod_ssl // 这里就不做证书,使用默认的证书,重启服务查看443是否启动 [root@task2 ~]# systemctl restart httpd [root@task2 ~]# ss -atnl 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 *:80 *:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 128 *:443 *:*
修改配置文件 [root@item ~]# vim /etc/haproxy/haproxy.cfg [root@item ~]# cat /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 info maxconn 20480 chroot /usr/local/haproxy pidfile /var/run/haproxy.pid stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin user haproxy group haproxy daemon nbproc 1 nbthread 4 spread-checks 5 defaults mode http log global option dontlognull option httpclose option http-keep-alive option redispatch balance roundrobin timeout connect 60s timeout client 30s timeout server 30s timeout check 10s maxconn 60000 retries 3 listen https bind 0.0.0.0:443 log global mode tcp balance roundrobin server task1 192.168.91.135:443 check inter 2s fall 3 rise 5 // 修改端口为443 server task2 192.168.91.137:443 check inter 2s fall 3 rise 5 // 修改端口为443 [root@item ~]# mkdir /var/lib/haproxy [root@item ~]# systemctl restart haproxy [root@localhost ~]# ss -ant State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 *:443 *:* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
-
高可用HAProxy——yum安装部署配置使用
2021-01-09 09:15:58HAProxy介绍 HAProxy是高性能TCP(第四层)/HTTP(第七层)反向代理负载均衡服务器。(The Reliable, High Performance TCP/HTTP Load Balancer) HAProxy安装部署 查看列表 $ yum list | grep haproxy yum安装... -
haproxy-2.1.3 for windows
2020-02-25 09:34:21haproxy-2.1.3 提供 高可用性 、负载均衡 以及基于TCP和HTTP应用的代理,它是免费、快速 并且可靠的一种解决方案 -
haproxy-2.3.2-win64
2021-01-03 15:27:28Cygwin64编译的 -
CentOS7—HAProxy安装与配置详解
2020-09-15 12:20:47主要介绍了CentOS7—HAProxy安装与配置详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 -
haproxy镜像
2018-11-25 09:24:18haproxy镜像 -
haproxy-wi:用于管理Haproxy,Nginx和Keepalived服务器的Web界面
2021-02-05 08:11:59Web界面(用户友好的Web GUI,警报,监视和安全),用于管理HAProxy,Nginx和Keepalived服务器。 留下您的 参与其中 ,订阅! 关于HAProxy-WI的,欢迎进行讨论和提问 示范现场 登录名/密码:admin / admin。 ... -
haproxy-sdk:用于 HAProxy 管理的基于 Promise 的 Javascript SDK
2021-05-29 17:08:30haproxy-sdk haproxy-sdk为 HAProxy 的“stats”套接字提供了一个 Javascript 原生的、基于 Promise 的开发库。 从这个库中,用户可以启用/禁用服务器和前端、管理后端、查询统计信息等等。 HAProxy 是一个多进程... -
haproxy-dconv:HAProxy文档转换器
2021-05-13 21:48:27HAProxy文档转换器 在当前状态下,HAProxy正在将HAProxy文档.txt文件转换为HTML。 该项目的目的是最终将HAProxy文档转换为更通用的格式(例如:ReStructuredText),从而可以更轻松地传播各种输出文件(.pdf,.html... -
Windows Haproxy-2.0.2--20190725.rar(Windows Haproxy 最新版
2019-07-25 17:02:33根据百度的上文档将目前最新版的Haproxy2.0.2打包成Windows下可执行的Haproxy.exe 最新版支持动态的ssl证书,经过测试以该Windows 下的版本已经可以支持。如果你觉得好用,劳烦给个好评。谢谢 -
Keepalived+HAProxy实现MySQL高可用负载均衡的配置
2020-12-15 19:27:56由于在生产环境使用了mysqlcluster,需要实现高可用负载均衡,这里提供了keepalived+haproxy来实现. keepalived主要功能是实现真实机器的故障隔离及负载均衡器间的失败切换.可在第3,4,5层交换.它通过VRRPv2(Virtual ... -
rh-haproxy18-haproxy-syspaths-1.8.4-1.el7.x86_64.rpm
2021-12-12 00:20:33官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装 -
ansible-haproxy:Ansible haproxy 模块
2021-07-09 00:38:51Ansible 模块 HAProxy 一个 Ansible 模块,用于使用套接字处理来自 haproxy 的状态启用/禁用服务器。 显示后端服务器的当前和当前权重是两种状态的默认值,如果在启用后端服务器时提供,它也会为服务器设置权重。 ... -
prometheus监控HAProxy
2021-01-07 19:12:40从Prometheus官方网站可以看到,官方网站已经有支持对HAProxy软件的exporter,我们从官方网站下载下来进行使用,也可以通过下载HAProxy的项目地址,通过编译进行部署。 github项目地址 ... -
node-haproxy:通过热重载从节点控制haproxy
2021-05-14 16:44:27node-haproxy --ipc )并使用ipc var ipcClient = require ('node-haproxy/src/ipc-client'通信( var ipcClient = require ('node-haproxy/src/ipc-client' )或使用api直接( var haproxy = require('node-...