HaP 免流模式语法帮助文档
- 1. 1. 配置参数
- 2. 2. 请求处理语法
- 2.1. 2.1 中文语法
- 2.1.1. 2.1.1 添加一行
- 2.1.2. 2.1.2 设置行值
- 2.1.3. 2.1.3 设置行值2
- 2.1.4. 2.1.4 删除一行
- 2.1.5. 2.1.5 删除一行2
- 2.1.6. 2.1.6 替换字符串
- 2.1.7. 2.1.7 之前添加
- 2.1.8. 2.1.8 之后添加
- 2.1.9. 2.1.9 行前添加
- 2.1.10. 2.1.10 行后添加
- 2.1.11. 2.1.11 行值前添加
- 2.1.12. 2.1.12 行值后添加
- 2.1.13. 2.1.13 URL前添加
- 2.1.14. 2.1.14 URL后添加
- 2.1.15. 2.1.15 删除网址http://host
- 2.1.16. 2.1.16 删除s_e
- 2.1.17. 2.1.17 删除s_e2
- 2.1.18. 2.1.18 atob a b
- 2.1.19. 2.1.19 设置第一行 str
- 2.1.20. 2.1.20 设置行名 hdrA hdrB
- 2.2. 2.2 英语语法
- 2.2.1. 2.2.1 add-header
- 2.2.2. 2.2.2 set-header
- 2.2.3. 2.2.3 set-header2
- 2.2.4. 2.2.6 add-replace(str_repalce)
- 2.2.5. 2.2.7 add-before
- 2.2.6. 2.2.8 add-after
- 2.2.7. 2.2.9 add-lbefore
- 2.2.8. 2.2.10 add-lafter
- 2.2.9. 2.2.11 add-vbefore
- 2.2.10. 2.2.12 add-vafter
- 2.2.11. 2.2.13 add-ubfore
- 2.2.12. 2.2.14 add-uafter
- 2.2.13. 2.2.15 atob a b
- 2.2.14. 2.2.17 mov-fhttp
- 2.2.15. 2.2.18 mov-se s e
- 2.2.16. 2.2.19 mov-nse s e
- 2.2.17. 2.2.20 set-req-fline str
- 2.2.18. 2.2.21 rn-header hdrA hdrB
- 2.2.19. 2.2.22 xhostTot
- 2.1. 2.1 中文语法
- 3. 3.特殊用法
1. 配置参数
本文是HaP核心的配置文件详解,比如global
,defaults
之类的能看到的配置语法,都可以在这里找到注释
1.1 global
global
在配置文件中,主要设置一些全局性的参数,起重要作用
一般建议不要修改,特别是pid文件地址,如果修改了可能会导致无法正常停止HaP核心
1.1.1 daemon
HaP核心运行方式为:后台运行
1.1.2 user group
user - group
设置HAP核心工作所属的用户和组
- 示例
1 | #设置HAP核心工作的用户和组为:inet |
1.1.3 maxconn
设置每个进程可用的最大连接数
- 示例
1 | #设置每个进程可用的最大连接数20480 |
1.1.4 chroot
改变当前工作目录
一般不需要添加,所以在配置语法中这句是注释掉的,也不推荐使用,因为 pidfile 文件的路径是相对路径,这个会干扰 pidfile 文件的存放地址
- 示例
1 | #设置工作目录为HaP的私有目录 |
1.1.5 pidfile
haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
不推荐修改这个地址,修改以后会干扰自带的HAP停止脚本
- 示例
1 | #设置pidfile文件地址 |
1.2 defaults
默认的一个模块,一些超时和一些缺省值需要要设置的参数在这个模块设置
1.2.1 timeout connect
超时参数:连接超时
如果一个连接超过了超时参数设置的值没有进行响应操作,就会自动断开连接,返回一个错误的报文
- 示例
1 | #设置连接超时为:30000ms |
1.2.2 timeout client
超时参数:客户端超时
如果客户端超过了超时参数设置的值没有进行响应操作,就会自动断开连接,返回一个错误的报文
- 示例
1 | #设置客户端超时为:300000ms |
1.2.3 timeout server
超时参数:服务器端超时
如果服务器端超过了超时参数设置的值没有进行响应操作,就会自动断开连接,返回一个错误的报文
- 示例
1 | #设服务器端超时为:3000000ms |
1.2.4 stats
设置HaProxy的状态网页
由于有些模式修改过的请求,会干扰HAP核心的识别状态页面,所以推荐用默认透明模式进行访问状态页面
- 示例
1 | #设置HaP核心的状态页面为/hap |
在默认透明模式下访问http://127.0.0.1:监听端口/hap
就可以进入状态网页
1.2.5 option redispatch
serverId对应的服务器挂掉后,强制定向到其他健康的服务器
1.2.6 option abortonclose
当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
1.2.7 option httpclose
每次请求完毕后主动关闭HTTP通道
老版本的HAProxy不支持keep-alive
模式 ,HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略此cookie值会影响处理结果。
要避免这种情况可配置此选项,防止产生多余的cookie信息。
1.3 frontend
前端配置,可以在里面进行请求方法过滤和拦截请求操作
1.3.1 mode http
mode { tcp|http|health }
设定启动的实例的协议类型
非对HAP核心了解的用户禁止修改,修改后可能导致无法上网
- 示例
1 | #设置协议类型为http协议 |
1.3.2 option accept-invalid-http-request
允许接受错误的HTTP请求
有些模式修改后,会使得核心识别为错误的请求,导致直接返回一个错误请求,无法上网。要避免,加上此选项就行。
1.3.3 acl http_g/p/s method GET/POST/HTTPS
acl
操作
上面的http_g/p/s
会在后面用的,相当于if
语句的条件
- 示例
1 | #判断请求模式是否为GET |
1.3.4 use_backend http-get/post/https if http_g/p/s
如果acl
操作的值为true
,
- 示例
1 | #如果http_g为true就使用http-get模块 |
1.3.5 default_backend https
默认使用的模块,当请求方法非get/post/https
时,就会启用
- 示例
1 | #设置默认模块为:https |
2. 请求处理语法
2.1 中文语法
添加中文语法的主要原因,是英文语法多多少少有些繁琐,不易写模式,而且很多友友都不懂英文语法,甚至看到英文就头疼。
添加中文语法对HaP的效率没有影响,最终的处理的都和英文语法一样。中文语法中的语句,都可以在英文语法里找到相同的作用的语法。
HaP是一款免费的软件,希望大家能尽量分享一些,多帮助些新人,这样才能发展HaP。
2.1.1 添加一行
在请求中添加一行请求
-
原型
请求 添加一行 hanme value
-
参数
- 参数1:
hname
必填,一行的行头名称 - 参数2:
value
必填,一行的值,支持%[xxx]
操作
- 参数1:
-
示例
1 | #在请求中添加一行:test: abc\r\n |
2.1.2 设置行值
设置一行的值
-
原型
请求 设置行值 sanme value
-
参数
- 参数1:
sname
必填,需要设置的值得行名称 - 参数2:
value
必填,一行的值 ,支持%[xxx]
操作
- 参数1:
在请求中,寻找sname
行,如果存在就修改sname
行的值,如果不存在就在请求结尾添加sname
行,值为value
- 示例
1 | #设置Host行的值为:10.0.0.172 |
2.1.3 设置行值2
设置一行的值(与设置行值
一致)
-
原型
请求 设置行值2 sanme value
-
参数
- 参数1:
sname
必填,需要设置的值得行名称 - 参数2:
value
必填,一行的值 ,支持%[xxx]
操作
- 参数1:
在请求中,寻找sname
行,如果存在就修改sname
行的值,如果不存在就在请求结尾添加sname
行,值为value
- 示例
1 | #设置Host行的值为:10.0.0.172 |
2.1.4 删除一行
删除请求中的一行
-
原型
请求 删除一行 danme
-
参数
- 参数1:
dname
必填,需要删除的行名称
- 参数1:
会删除请求中的dname
行
- 示例
1 | #删除请求中的Host行 |
2.1.5 删除一行2
删除请求中的一行(与删除一行
一致)
-
原型
请求 删除一行2 danme
-
参数
- 参数1:
dname
必填,需要删除的行名称
- 参数1:
会删除请求中的dname
行
- 示例
1 | #删除请求中的Host行 |
2.1.6 替换字符串
替换请求中指定的字符串
-
原型
请求 替换字符串 str1 str2
-
参数
- 参数1:
str1
必填,需要被替换的字符串,支持%[xxx]
操作 - 参数2:
str2
必填 ,需要替换的字符串
- 参数1:
在请求中,把str1
字符串替换为str2
字符串
- 示例
1 | #修改HTTP协议版本为:1.0 |
2.1.7 之前添加
在请求中某一个字符串前面添加字符串
-
原型
请求 之前添加 name str
-
参数
- 参数1:
name
必填,确定在哪一个字符串前面添加字符串 - 参数2:
str
必填,需要添加的字符串,支持%[xxx]
操作
- 参数1:
在请求中的的name
字符串前添加str
字符串
- 示例
1 | #在Host行前面添加一行:test,值为abc |
2.1.8 之后添加
在请求中指定字符串后面添加字符串
-
原型
请求 之后添加 name str
-
参数
- 参数1:
name
必填,确定在哪个字符串后面添加字符串 - 参数2:
str
必填,需要添加的字符串,支持%[xxx]
操作
- 参数1:
在请求中的name
行后面添加str
字符串
- 示例
1 | #在首行下面添新的一行test 值为abc |
2.1.9 行前添加
在请求中某一行前面添加字符串
-
原型
请求 行前添加 name str
-
参数
- 参数1:
name
必填,确定在哪一行前面添加字符串 - 参数2:
str
必填,需要添加的字符串,支持%[xxx]
操作
- 参数1:
在请求中的的name
行前添加str
字符串
- 示例
1 | #在Host行前面添加一行:test,值为abc |
2.1.10 行后添加
在请求中某一行后面添加字符串
-
原型
请求 行后添加 name str
-
参数
- 参数1:
name
必填,确定在哪一行后面添加字符串 - 参数2:
str
必填,需要添加的字符串,支持%[xxx]
操作
- 参数1:
在请求中的的name
行后面添加str
字符串
- 示例
1 | #在Host行后面添加一行:test,值为abc |
2.1.11 行值前添加
在一行值的前面添加字符串
-
原型
请求 行值前添加 name str
-
参数
- 参数1:
name
必填,确定在哪一行值的前面添加字符串 - 参数2:
str
必填,需要添加的字符串,支持%[xxx]
操作
- 参数1:
在请求中的的name
的值前面添加添加str
字符串
- 示例
1 | #在Host行值前面添加字符串:abc |
2.1.12 行值后添加
-
原型
请求 行值后添加 name str
-
参数
- 参数1:
name
必填,确定在哪一行值的后面 - 参数2:
str
必填,需要添加的字符串,支持%[xxx]
操作
- 参数1:
-
示例
1 | #在Host行值后面添加abc |
2.1.13 URL前添加
-
原型
请求 URL前添加 str
-
参数
- 参数1:
str
必填,需要添加的字符串,支持%[xxx]
操作
- 参数1:
-
示例
1 | #在请求URL之前添加字符串str |
2.1.14 URL后添加
-
原型
请求 URL后添加 str
-
参数
- 参数1:
str
必填,需要添加的字符串,支持%[xxx]
操作
- 参数1:
-
示例
1 | ##在请求URL之后添加字符串str |
2.1.15 删除网址http://host
-
原型
请求 删除网址http://host null null
-
参数
- 参数1: 可选,默认
null
即可 - 参数2: 可选,默认
null
即可
- 参数1: 可选,默认
在请求的第一行通常是这样的
GET(method) http://wap.baidu.com/?from=xxx
由于某些特殊修改请求的方法,需要去掉请求中的http://wap.baidu.com
所以出现了上面的语法,语法跟mov-fhttp null null
作用一样
- 示例
1 | #删除网址http://host |
2.1.16 删除s_e
-
原型
请求 删除s_e start end
-
参数
- 参数1:
start
必填,开始字符 - 参数2:
end
必填,结束字,支持%[xxx]
操作符
- 参数1:
删除start
到end
之间的字符,保留end
- 示例
1 | #删除网址http://host |
2.1.17 删除s_e2
-
原型
请求 删除s_e2 start end
-
参数
- 参数1:
start
必填,开始的字符 - 参数2:
end
结束的字符串,支持%[xxx]
操作
- 参数1:
删除start
到end
的字符,删除end
,跟删除s_e
的区别就是s_e
保留了end
,这个语法删除了end
- 示例
1 | #删除Host行 |
2.1.18 atob a b
主要用于转换行头(行头就是一行的名字,通常有host行
的叫法,就是因为行头为Host
)
如果a行存在,那么行头就替换成b行,b行不管存不存在都会被删除
如果a行的值为空,那么a行将会被删除,b行保留
-
原型
请求 atob a b
-
参数
- 参数1:
a
必填,A行 - 参数2:
b
必填,B行
- 参数1:
-
示例
1 | #X-Online-Host转Host |
2.1.19 设置第一行 str
自定义请求的第一行
-
原型
请求 设置第一行 str
-
参数
- 参数1:
str
必填,支持%[xxx]
操作
- 参数1:
-
示例
1 | #具体事例 http://host转http://proxy_host |
2.1.20 设置行名 hdrA hdrB
设置一行请求的行名
-
原型
请求 设置行名 hdrA hdrB
-
参数
- 参数1:`hdrA 需要被改名的请求行必填
- 参数1: 将要改为的行名
-
示例
1 | #Host行改为T_Host行 |
2.2 英语语法
这里语法的作用都是同上面中文语法的
英文语法在后来的版本中对原来的语法进行优化和修复
在1.5版本后,set-header/2,del-header/2全部为自定义语法
这样做的目的是为了稳定性和安全性考虑
2.2.1 add-header
添加一行
-
原型
http-request add-header h v
-
参数
h
: 必填,需要添加的行v
: 必填,需要添加行的值,支持%[xxx]
操作
添加新的一行,行头为h
,值为v
- 示例
1 | #添加test行,值为abc |
2.2.2 set-header
设置一行的值
-
原型
http-request set-header h v
-
参数
h
: 必填,需要修改值的行v
: 必填,需要修改的值,支持%[xxx]
操作
设置h
行的值为v
,不会修改位置
2.2.3 set-header2
设置一行的值
-
原型
http-request set-header2 h v
-
参数
h
: 必填,需要修改值的行v
: 必填,需要修改的值,支持%[xxx]
操作
-
示例
1 | #设置Host行的值为10.0.0.172 |
2.2.4 del-header
删除请求中的一行
-
原型
http-request del-header h
-
参数
h
: 必填,被删除的行头
删除请求中的h
行
- 示例
1 | #删除请求中的Host行 |
2.2.5 del-header2
删除请求中的一行,与del-heder
语法的区别就是此语法更稳当,del-header
语法为开发语法
-
原型
http-request del-header2 h
-
参数
h
: 必填,被删除的行头
-
示例
1 | #删除请求中Host行 |
2.2.6 add-replace(str_repalce)
替换请求中的字符串
-
原型
http-request add-replace(str_replace) str1 str2
-
参数
str1
: 必填,被替换的字符串,支持%[xxx]
操作str2
: 必填,替换的字符串
把请求中的str1
字符串替换成str2
字符串
示例
1 | #更改http协议版本为1.0 |
2.2.7 add-before
在指定字符串前面添加字符串
-
原型
http-request add-before name str
-
参数
name
: 必填,定位在哪个字符串前面添加字符串str
: 必填,需要添加的字符串 ,支持%[xxx]
操作
-
示例
1 | #Host行前添加一行test,值为abc |
2.2.8 add-after
在指定字符串后面添加字符串
-
原型
http-request add-after name str
-
参数
name
: 必填,定位在哪个字符后面添加字符str
: 必填,要添加的字符,支持%[xxx]
操作
-
示例
1 | #在首行下面添加一个Host 值为test |
2.2.9 add-lbefore
在指定行之前添加字符串
-
原型
http-request add-lbefore h str
-
参数
h
: 必填,在指定的行前str
: 必填, 添加的字符串,支持%[xxx]
操作
-
示例
1 | #在Host行前添加新的一行test值为abc |
2.2.10 add-lafter
在指定行后添加字符串
-
原型
http-request add-lafter h str
-
参数
h
: 必填,在指定的行后str
: 必填, 添加的字符串,支持%[xxx]
操作
-
示例
1 | #在Host行后添加新的一行:test行值为:abv |
2.2.11 add-vbefore
在指定行后的值前面添加字符串
-
原型
http-request add-vbefore h v
-
参数
h
: 必填,确定在哪一行值的前面添加字符串v
: 必填,添加的字符串 ,支持%[xxx]
操作
在h
行的值后面添加字符串v
- 示例
1 | #在Host行值前面添加字符串:abc |
2.2.12 add-vafter
在指定行的值后面添加
-
原型
http-request add-vafter h v
-
参数
h
: 指定哪个行值后面添加字符串v
: 需要添加的字符串,支持%[xxx]
操作
-
示例
1 | #在Host行值后面添加abc |
2.2.13 add-ubfore
在请求URL前面添加字符串
-
原型
http-request add-ubefore str
-
参数
str
: 添加的字符串,支持%[xxx]
操作
-
示例
1 | #在请求url前添加'http://bml.net' |
2.2.14 add-uafter
在请求URL之后添加字符串
-
原型
http-request add-uafter str
-
参数
str
: 添加的字符串,支持%[xxx]
操作
-
示例
1 | #在请求URL后面添加字符串?abc |
2.2.15 atob a b
a行转b行
-
原型
http-request atob a b
-
参数
a
: a行b
: b行
如果a行存在,b行存在,则会把b行删除,把a行的行头改成b
如果a行的值为空,则会删除a行,保留b行
如果a行不存在,则不会做任何处理
- 示例
1 | #X-Online-Host转Host |
####2.2.16 rep-hvalue
修改一行的值,如果不存在行就不添加
-
原型
http-request rep-hvalue h v
-
参数
h
: 修改值的行v
: 需要修改成的值,支持%[xxx]
操作
-
示例
1 | #修改host行的值为byml.net,如果不存在则不做任何处理 |
2.2.17 mov-fhttp
删除请求网址开头:http://host
-
原型
http-request mov-fhttp null null
-
参数
null
: 默认即可null
: 默认即可,支持%[xxx]
操作
-
示例
1 | #使用例子 |
2.2.18 mov-se s e
删除以s
开头到e
结尾的字符串,保留e
-
原型
http-request mov-se s e
-
参数
s
: 开始的字符串e
: 结束的字符串,支持%[xxx]
操作
-
示例
1 | #删除请求地址中的http://host |
2.2.19 mov-nse s e
删除以s
开头到e
结尾的字符串,删除e
-
原型
http-request mov-nse s e
-
参数
s
: 开始的字符串e
: 结束的字符串,支持%[xxx]
操作
-
示例
1 | #删除Host行 |
2.2.20 set-req-fline str
自定义请求的第一行
-
原型
http-request set-req-fline str
-
参数
str
: 支持%[xxx]
操作
-
示例
1 | #http://host转http://proxy_host |
2.2.21 rn-header hdrA hdrB
设置一行请求的行名
-
原型
http-request rn-header hdrA hdrB
-
参数
hdrA
: 被改名的请求行hdrB
: 需要改为的名称
-
示例
1 | #Host行改为T_Host |
2.2.22 xhostTot
Xhost
,Host
(如果没有大写的,则自动查找小写)转换为T_Host
如果xhost
,host
均存在
则以xhost
优先,把xhost
请求行名改为T_Host
如果host
行存在,xhost
不存在
则以host
行优先,把host
行改为T_Host
行
-
原型
http-request xhostTot null null
-
参数
null
: 无作用,但必须加null
: 无作用,但必须加
-
示例
1 | http-request xhostTot null null |
3.特殊用法
3.1 %[xxx]
操作
%[xxx]
操作就相当于变量,到了核心就会被转换成这个变量存储的数据
3.1.0 %[header(xxxx)]
例如:%[header(Host)]
就是取:Host行的值
这个语法为新增加语法,更适合编写模式
3.1.1 %[url]
如果请求的第一行为:GET http://byml.net/index.php HTTP/1.1\r\n
那么%[url]
代表的是http://byml.net/index.php
3.1.2 %[request_uri]
如果请求的第一行为:GET http://byml.net/index.php?user=recall HTTP/1.1\r\n
那么%[request_uri]
代表的是:/index.php?user=recall
3.1.3 %[req.hdr(xxx)]
例如:%[req.hdr(Accept)]
就是取Accept
行的值
如果是要取Host
的值
推荐使用%[host]
,这个是固定的,不会出现取值失败,自动停止等BUG
3.1.4 %[method]
如果当前的请求方式为GET
那么%[method]
的值就是GET
3.1.5 %[req.ver]
req.ver
是当前使用的HTTP协议的版本
如果请求是HTTP/1.1 %[req.ver]
则为1.1
如果请求是HTTP/1.0 %[req.ver]
则为1.0
3.1.6 %[url_no_port]
如果CONNECT
请求的第一行为CONNECT byml.net:443 HTTP/1.1\r\n
那么%[url_no_port]
代表byml.net
,目前只推荐在CONNECT
请求中使用
3.1.7 %[host]
取Host
行的值,解决atob
后,%[req.hdr(Host)]
取不到值的BUG
3.1.8 %[t_host]
取T_Host
行的值,可以先把Host
字符串修改成T_Host
这样就可以直接%[t_host]
取到Host
的值,而且只需要定义第一行就行了
3.1.9 %[xhost]
取X-Online-Host
行的值,固定搭配