概述
文章目录
- 简介
- 安装配置HAProxy
- 配置文件
- 配置文件格式
- 详解配置文件
- 配置案例
- 统计页面的输出机制
- 定义独立日志文件
- 动静分离示例
- 读写分离案例
- 结合keepalived实现高可用
- haproxy + pacemaker
简介
- HAProxy 是一款提供高可用性、负载均衡以及基于**TCP(第四层)和HTTP(第七层)**应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
- HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
安装配置HAProxy
- 安装haproxy(在server1haproxy调度器上)
[root@server1 ~]# yum install -y haproxy##安装
[root@server1 ~]# rpm -qi haproxy##查看详情信息
Name : haproxy
Version : 1.5.18##版本号
Release : 8.el7
Architecture: x86_64
Install Date: Sun 09 Aug 2020 09:37:17 AM CST
Group : System Environment/Daemons
Size : 2690238
License : GPLv2+
Signature : RSA/SHA256, Thu 26 Jul 2018 10:00:42 AM CST, Key ID 199e2f91fd431d51
Source RPM : haproxy-1.5.18-8.el7.src.rpm
Build Date : Wed 25 Jul 2018 11:16:41 PM CST
Build Host : x86-040.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Vendor : Red Hat, Inc.
URL : http://www.haproxy.org/
Summary : TCP/HTTP proxy and load balancer for high availability environments
- 配置文件
[root@server1 ~]# rpm -ql haproxy
/etc/haproxy
/etc/haproxy/haproxy.cfg ##配置文件
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/lib/systemd/system/haproxy.service
/usr/sbin/haproxy
配置文件
- haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen。
配置文件格式
- global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
- defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
- frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择)。
- backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
- listen:Frontend和Backend的组合体。
- 其中一些关于时间的格式:
us | 微秒(microseconds),即1/1000000秒 |
---|---|
ms | 毫秒(milliseconds),即1/10000 秒 |
s: | 秒(seconds) |
m | 分钟(minutes) |
h | 小时(hours) |
d | 天(days) |
详解配置文件
- haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen。
- global
global
log 127.0.0.1 local2 ##定义全局的syslog服务器,最多可以定义两个;
chroot /var/lib/haproxy ##修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限
pidfile /var/run/haproxy.pid ##当前进程id文件
maxconn 4000 #最大连接数
user haproxy#所属用户
group haproxy#所属组
daemon ##让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
# turn on stats unix socket
stats socket /var/lib/haproxy/stats#基于本地的文件传输
defaults
mode http##默认的模式mode{ tcp|http|health} ,tcp是4层,http是7层,health返回ok
log global##应用全局的日志配置
option httplog
##启用日志HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
option dontlognull
#启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
option http-server-close ##每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8#如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要配置此选项,这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP
option redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
retries 3##定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
timeout http-request 10s ##在客户端建立连接但不请求数据时,关闭客户端连接
timeout queue 1m##等待最大时长
timeout connect 10s##定义haproxy将客户端请求转发至后端服务器所等待的超时时长
timeout client 1m ##客户端非活动状态的超时时长
timeout server 1m##客户端与服务器端建立连接后,等待服务器端的超长时长
timeout http-keep-alive 10s ##定义保持连接的超长时长
timeout check 10s##健康状态监测的超时时间,过短会误判,过长资源消耗
maxconn 3000 ##设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;
- fronted
frontend main *:80 ##监听端口为80
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app##默认访问的是app
- backend static
backend static
#使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则访问此后端)
balance roundrobin
server static 127.0.0.1:4331 check
##静态文件部署在本机(也可以部署在其他机器)
- backend app
backend app
#定义一个名为app后端部分。PS:此处app只是一个自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
- balance关键字:
- 定义负载均衡算法,可用于“defaults”、“listen”和“backend”。用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或需要将一个连接重新派发至另一个服务器时。支持的算法有:
roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;并支持慢启动。
static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;不支持慢启动,在高负荷的情况下,服务器重新上线时会立即被分配大量连接。
leastconn(WLC):适用于长连接的会话,新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;
source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;
1)对原地址hash,第一次调度时使用WLC source:IP层,位于同一个NAT服务器背后的多个请求都会定向至同一个upstream
server,不利于负载均衡,一般只有不支持使用cookie插入又需要保持会话时使用 cookie:应用层,有更好的负载均衡效果;2)hash/weight%ip :除以权重取模
uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;
url_param:通过为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
hdr():对于每个HTTP请求,通过指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.feiyu.com来说,仅计算feiyu字符串的hash值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
rdp-cookie(name) 表示根据据cookie(name)来锁定并哈希每一次TCP请求。
配置案例
- 实验环境:
- 利用四台虚拟机实现简单的前端轮询调度。一台客户端,一台haproxy调度器,两台RS
server1 192.168.43.10(haproxy调度器)
server2 192.168.43.2(客户端)
server3 192.168.43.3(RS)
server4 192.168.43.4(RS)
统计页面的输出机制
- 删去了原配置文件多余的部分。(global部分没有改动,default加了几行,删去了backend static部分,将app1和app2改成自己后端服务器的ip)
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
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 3000
stats uri /status ## 自定义统计页面的url
stats auth admin:123456##统计页面用户名和密码的设定
stats hide-version##隐藏统计页面上的HAproxy的版本信息
stats refresh 5s## 统计页面自动刷新时间
frontend main *:80
default_backend app
backend app
balance roundrobin
server app1 192.168.43.3:80 check
server app2 192.168.43.4:80 check
- 实验结果:在浏览器访问192.168.43.10/status
定义独立日志文件
vim /etc/rsyslog.conf
systemctl restart rsyslog
重启日志服务- 实验结果:日志文件独立出来了,并且显示正常内容
动静分离示例
vim /etc/haproxy.haproxy.cfg
- 前面global和default与上面保持一致
rontend main *:80
acl url_static path_beg -i /static /images /javascript /stylesheets##后面的允许格式可以自己进行增删
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
backend static
balance roundrobin
server static 192.168.43.3:80 check
backend app
balance roundrobin
server app2 192.168.43.4:80 check
server backup 192.168.43.2:80 backup
- 实验结果测试
- 在server3中/var/www/html/放一张照片,用于测试静态页面的访问
- 在server4中,安装php,在/var/www/html,创建index.php文件
[root@server4 html]# cat index.php
<?php
phpinfo()
?>
- 测试页面:测试192.168.43.10/images就会出现一张图片
读写分离案例
vim /etc/haproxy.haproxy.cfg
- 前面global和default与上面保持一致
frontend main *:80
acl read_request method GET ##请求方法
acl read_request method POST
acl write_request method PUT
acl write_request method POST
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if read_request##如果是读请求用 static
use_backend app if write_request ##如果是写请求用 app
default_backend app
backend static
balance roundrobin
server static 192.168.43.3:80 check
backend app
balance roundrobin
server app2 192.168.43.4:80 check
server backup 192.168.43.2:80 backup
- 实验结果测试
- 在server3和server4的/var/www/html/下写入两个文件用于测试
- [root@server3 html]# cat index.php
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
[root@server3 html]# cat upload_file.php
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
-
在server4中/var/www/html创建一个upload目录并开满权限,用于图片的写入
-
chmod 777 /var/ww/html/upload
-
实验结果测试
-
server4中upload下成功写入上传图片
结合keepalived实现高可用
- 安装
- 在server1和server2上安装keepalived
- 并配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
bal_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER ##根据主备选择
interface eth0
virtual_router_id 51
priority 100 ##主必须比备大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.43.100
}
}
}
- 设置脚本检查haproxy状态
vim check_haproxy.sh
#!/bin/bash
systemctl status haproxy &> /dev/null || systemctl start haproxy &> /dev/null ## 先尝试重启
systemctl status haproxy &> /dev/null&&{ ## 如果重启成功返回0 否则返回1
exit 0
}||{
exit 1
}
- 编辑/etc/keepalived/keepalived.conf
1 ! Configuration File for keepalived
2
3 global_defs {
4 notification_email {
5 root@localhost.com
6 }
7 notification_email_from keepalived@localhost
8 smtp_server 127.0.0.1
9 smtp_connect_timeout 30
10 router_id LVS_DEVEL
11 vrrp_skip_check_adv_addr
12 #vrrp_strict
13 vrrp_garp_interval 0
14 vrrp_gna_interval 0
15 }
16 vrrp_script check_haproxy {
17 script "/opt/check_haproxy" ##检测haproxy是否存在 并尝试重启
18 interval 2
19 weight -60
20 }
21 vrrp_instance VI_1 {
22 state MASTER
23 interface eth0
24 virtual_router_id 51
25 priority 100
26 advert_int 1
27 authentication {
28 auth_type PASS
29 auth_pass 1111
30 }
31 track_script {
32 check_haproxy
33 }
34 virtual_ipaddress {
35 192.168.43.100
- 开启server2 并执行上述操作
- 除了状态设定为BACKUP 初始权重设为50其他相同
- 实验效果:
- 把server1 haproxy服务停掉以后 vip转交给了server2。
- 注意只有在状态为master的主机上有VIP
- 如果haproxy设置成只监听VIP的话 backup主机上的hapoxy不能启动
haproxy + pacemaker
PCS配置
server1 192.168.43.10
server2 192.168.43.2
- 安装
yum install -y pacemaker pcs psmisc policycoreutils-python
- 启用 并认证用户
systemctl enable --now pcsd.service
echo redhat1 | passwd --stdin hacluster
pcs cluster auth server1 server2 #输入用户名密码
pcs cluster setup --name mycluster server1 server2
- 启动集群并并禁用stonith
pcs cluster start --all
pcs property set stonith-enabled=false
- 部署haproxy和vip并绑定
pcs resource create VIP ocf:heartbeat:IPaddr2 ip=192.168.43.100 op monitor interval=30s
pcs resource create haproxy systemd:haproxy op monitor interval=1min
pcs resource group add webgroup VIP haproxy
最后
以上就是贪玩心情为你收集整理的HAproxy的安装配置及示例的全部内容,希望文章能够帮你解决HAproxy的安装配置及示例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复