HAProxy的安装及常用配置中文注释

2023-11-03

一、HAProxy的安装

1、Centos安装:
yum install haproxy
2、Ubuntu 安装:
apt-get install haproxy
3、编译安装
(1)#安装前准备
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate
(2)#下载及解压
tar xvf haproxy-1.8.16.tar.gz && cd haproxy-1.8.16 
(3)#编译安装
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy
(4)#编译安装
make install PREFIX=/usr/local/haproxy
(5)#将haproxy命令放至/usr/sbin/下
cp haproxy /usr/sbin/ 
(6)#创建启动脚本:
vim /usr/lib/systemd/system/haproxy.service
[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 /run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
(7)#创建目录和用户:
mkdir /etc/haproxy
useradd haproxy -s /sbin/nologin
mkdir /var/lib/haproxy
chown haproxy.haproxy /var/lib/haproxy/ -R 
(8)#编辑配置文件
vim /etc/haproxy/haproxy.cfg 
……
(9)#启动服务
 systemctl enable haproxy && systemctl restart haproxy

二、HAproxy常用配置选项中文注释

1、global配置:

官方网站:https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#3

chroot #锁定运行目录
• deamon #以守护进程运行#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #socket文件
• user, group, uid, gid #运行haproxy的用户身份
• nbproc #开启的haproxy进程数,与CPU保持一致
• nbthread #指定每个haproxy进程开启的线程数,默认为每个进程一个线程
• cpu-map 1 0 #绑定haproxy 进程至指定CPU
• maxconn #每个haproxy进程的最大并发连接数
• maxsslconn #SSL每个haproxy进程ssl最大连接数
• maxconnrate #每个进程每秒最大连接数
• spread-checks #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间
• pidfile #指定pid文件路径
• log 127.0.0.1 local3 info #定义全局的syslog服务器;最多可以定义两个
2、Proxies配置:

defaults 配置参数:

• option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器
• option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
• option http-keep-alive 60#开启会话保持
• option forwardfor #开启IP透传
• mode http #默认工作类型timeout connect 120s #转发客户端请求到后端server的最长连接时间(TCP之前) timeout server 600s #转发客户端请求到后端服务端的超时时长(TCP之后)timeout client 600s #与客户端的最长空闲时间timeout http-keep-alive 120s #session 会话保持超时时间,范围内会转发到相同的后端服务器#timeout check 5s #对后端服务器的检测超时时间

frontend配置参数:
backend配置参数:

#frontend/ backend 配置案例:
frontend WEB_PORT_80
	bind 192.168.7.248:80
	mode http
	use_backend web_prot_http_nodes
backend web_prot_http_nodes
	mode http
	option forwardfor
	server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
	server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5

listen配置参数:

#使用listen替换frontend和backend的配置方式:
listen WEB_PORT_80
	bind 192.168.7.102:80 #指定HAProxy的监听地址
	mode http #七层代理,可代理http协议,centos中实际的默认模式
	#mode tcp #四层代理,可代理mysql/pgsql/ssh/ssl等协议,https时使用,默认模式
	#health #回应ok后断开连接,较少使用
	option forwardfor
	server web1 192.168.7.101:8080 check inter 3000 fall 3 rise 5 #定义后端real server
	server web2 192.168.7.101:8080 check inter 3000 fall 3 rise 5 #check:对指定real server的8080端口进行健康状态检查,每3000ms检查一次,连续3次检测失败标记不可用,连续检测5次成功标记可用。
3、balance:

指明对后端服务器的调度算法,配置在listen或backend
(1)静态调度算法:
按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和相应速度等,且无法实时修改权重,只能重启后生效。

static-rr:
#基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量没有限制
first:
#根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置。

#取决于hash_type是否consistent:
	#mode http #不支持tcp,会切换到tcp的roundrobin负载模式(source支持tcp/http)
	#balance source/uri/url_param/hdr/rdp-cookie
	#hash-type consistent
source:
#后续同一个源地址请求将被转发至同一个后端web服务器
#源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。
uri:
#curl http://192.168.7.101/index.html或test.html
#基于对用户请求的uri做hash并将请求转发到后端指定服务器
url_param name: #基于参数name做hash
#http://www.magedu.com/foo/bar/index.php?k1=v1&k2=v2
#url_param = "k1=v1&k2=v2"
#对用户请求的url中的<params>部分中的参数name作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server
hdr(<name>)#不同的浏览器被调度到不同的web服务器,hdr( Cookie、 User-Agent、host)
#针对用户每个http头部(header)请求中的指定信息做hash,此处由<name>指定的http首部将会被取出并做hash计算,然后由服务器总权重相除以后派发至某挑出的服务器,假如无有效的值,则会被轮询调度
rdp-cookie(<name>)#对远程桌面的负载,使用cookie保持会话

(2)动态调度算法:
基于后端服务器状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启

roundrobin:
#基于权重的轮询动态调度算法,支持权重的运行时调整,不等于lvs的rr,支持慢启动即新加的服务器会逐渐增加转发数,每个后端backend中最多支持4095个server,此为默认调度算法,server 权重设置 weight
leastconn:
#加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度,比较适合长连接的场景使用,比如MySQL等场景。

(3)hash_type

map-based:取模法
#基于服务器权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因权重发生变化而导致调度结果整体改变,hash(o)mod n 。
consistent:一致性hash
#该hash是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动。
4、Cookie 配置
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]#为当前server指定cookie值,实现基于cookie的会话黏性
5、状态页stats配置
• stats enable #基于默认的参数启用stats page
• stats hide-version # 隐藏版本
• 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中的管理功能
6、报文首部修改配置
reqadd <string> [{if | unless} <cond>]#示例:rspadd X-Via:\ HAPorxy
reqdel <search> [{if | unless} <cond>]#示例: rspidel server.* #从相应报文删除server信息
7、日志配置
#在default配置项定义:
log 127.0.0.1 local{1-7} info #基于syslog记录日志到指定设备,级别有(err、warning、info、debug)
#配置rsyslog: 
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
#配置HAProxy:
log global
#验证:
tail /var/log/haproxy.log
#自定义日志的详细信息:
capture cookie <name> len <length> 
#捕获请求和响应报文中的 cookie并记录日志
capture request header <name> len <length> 
#捕获请求报文中指定的首部内容和长度并记录日志
capture response header <name> len <length> 
#捕获响应报文中指定的内容和长度首部并记录日志
8、压缩功能compression:
compression algo #启用http协议中的压缩机制,常用算法有gzip deflate
compression type #要压缩的类型
9、Web服务器状态监测:
#三种状态监测方式:
#基于四层的传输端口做状态监测
server 172.18.200.103 172.18.200.103:80 check inter 3s fall 3 rise 5 weight 1
#基于指定URI做状态监测
#option httpchk <method> <uri> <version>
option httpchk GET /wp-includes/js/jquery/jquery.js?ver=1.12.4 HTTP/1.0
#基于指定URI的request请求头部内容做状态监测
option httpchk HEAD /wp-includes/js/jquery/jquery.js?ver=1.12.4 HTTP/1.0\r\nHost:\ 192.168.7.102
10、ACL配置

对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作。

acl <aclname> <criterion> [flags] [operator] [<value>]
#acl 名称 条件 条件标记位 具体操作符 操作对象类型
#acl image_service hdr_dom(host) -i img.magedu.com
1<aclname>名称:
可以使用字母、数字0-9、冒号:、点.、中横线和下划线,并且严格区分大小写
2<criterion>:
• hdr([<name> [<occ>]]#完全匹配字符串
• hdr_beg([<name> [<occ>]]#前缀匹配
• hdr_dir([<name> [<occ>]]#路径匹配
• hdr_dom([<name> [<occ>]]#域匹配
• hdr_end([<name> [<occ>]]#后缀匹配
• hdr_len([<name> [<occ>]]#长度匹配
• hdr_reg([<name> [<occ>]]#正则表达式匹配
• hdr_sub([<name> [<occ>]]#子串匹配
3<criterion>:
• dst #目标IP
• dst_port #目标PORT
• src #源IP
• src_port #源PORT
• hdr <string>用于测试请求头部首部指定内容
• hdr_dom(host) #请求的host名称,如 www.magedu.com
• hdr_beg(host) #请求的host开头,如 www. img. video. download. ftp.
• hdr_end(host) #请求的host结尾,如 .com .net .cn
• path_beg #请求的URL开头,如/static、/images、/img、/css
• path_end #请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg
4<flags>-条件标记位:
• -i #不区分大小写
• -m #使用指定的pattern匹配方法
• -n #不做DNS解析
• -u #禁止acl重名,否则多个同名ACL匹配或关系
5[operator]具体操作符:
整数比较:eq、ge、gt、le、lt
字符比较:
• exact match (-m str) #字符串必须完全匹配模式
• substring match (-m sub) #在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配
• prefix match (-m beg) #在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配
• suffix match (-m end) #将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行匹配
• subdir match (-m dir) #查看提取出来的用斜线分隔(“/”)的字符串,如果其中任何一个匹配,则ACL进行匹配
• domain match (-m dom) #查找提取的用点(“.”)分隔字符串,如果其中任何一个匹配,则ACL进行匹配
6<value>操作对象类型:
• Boolean #布尔值
• integer or integer range #整数或整数范围,比如用于匹配端口范围
• IP address / network #IP地址或IP范围, 192.168.0.1 ,192.168.0.1/24
• string 
exact #精确比较
substring#子串 www.magedu.com
suffix#后缀比较
prefix#前缀比较
subdir#路径, /wp-includes/js/jquery/jquery.js
domain#域名,www.magedu.com
• regular expression #正则表达式
• hex block #16进制
11、自定义错误页面errorfile,errorloc
errorfile 500 /usr/local/haproxy/html/500.html #自定义错误页面
errorloc 503 http://192.168.7.103/error_page/503.html #自定义错误跳转
12、HAProxy-https协议
#把80端口的请求重向定443
bind *:80
redirect scheme https if !{ ssl_fc }
#支持ssl会话
bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
#向后端传递用户请求的协议和端口(frontend或backend)
http_request set-header X-Forwarded-Port %[dst_port]
http_request add-header X-Forwared-Proto https if { ssl_fc }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HAProxy的安装及常用配置中文注释 的相关文章

  • 无法为 Python 3.4 创建工作虚拟环境

    I 安装Python 3 4 2 https docs python org 3 using unix html building python和我的 Linux Mint 17 1 中的 Virtualenv 12 0 5 然后我尝试创建
  • 如何使用 bash 脚本关闭所有终端,在每个终端中有效地按 Ctrl+Shift+Q

    我经常打开许多终端 其中一些正在运行重要的进程 例如服务器 而另一些则没有运行任何东西并且可以关闭 如果您按 重要 则会弹出确认提示Cntrl Shift Q在其中 如下所示 我想要一个 bash 脚本 它可以关闭所有终端 但将 重要 终端
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插
  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 错误:NVIDIA-SMI 失败,因为无法与 NVIDIA 驱动程序通信

    NVIDIA SMI 抛出此错误 NVIDIA SMI 失败 因为无法与 NVIDIA 通信 司机 确保安装了最新的 NVIDIA 驱动程序并且 跑步 我清除了 NVIDIA 并按照提到的步骤重新安装了它here https askubun
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 如何确保 numpy BLAS 库可用作动态加载库?

    The theano安装文档 http www deeplearning net software theano install html troubleshooting make sure you have a blas library指
  • 确保 config.h 包含一次

    我有一个库项目 正在使用 Linux 中的 autotools 套件移植到该项目 我对自动工具很陌生 本周 我已经了解了其操作的基础知识 我有一个关于如何保留内容的问题config h免遭重新定义 我惊讶地发现生成的config h文件也没
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC

随机推荐