1. 配置参数

本文是HaP核心的配置文件详解,比如global,defaults之类的能看到的配置语法,都可以在这里找到注释

1.1 global

global在配置文件中,主要设置一些全局性的参数,起重要作用
一般建议不要修改,特别是pid文件地址,如果修改了可能会导致无法正常停止HaP核心

1.1.1 daemon

HaP核心运行方式为:后台运行

1.1.2 user group

user - group
设置HAP核心工作所属的用户和组

  • 示例
1
2
3
4
5
6
7
8
9
#设置HAP核心工作的用户和组为:inet
user inet
group inet

###################################

#设置HAP核心工作的用户和组为:root
user root
group root

1.1.3 maxconn

设置每个进程可用的最大连接数

  • 示例
1
2
#设置每个进程可用的最大连接数20480
maxconn 20480

1.1.4 chroot

改变当前工作目录
一般不需要添加,所以在配置语法中这句是注释掉的,也不推荐使用,因为 pidfile 文件的路径是相对路径,这个会干扰 pidfile 文件的存放地址

  • 示例
1
2
3
4
5
#设置工作目录为HaP的私有目录
chroot /data/data/com.HaP.Byml/files

#/data/data/com.HaP.Byml/files目录
#就是HaP的私有目录

1.1.5 pidfile

haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
不推荐修改这个地址,修改以后会干扰自带的HAP停止脚本

  • 示例
1
2
3
4
5
#设置pidfile文件地址
pidfile ./haproxy.pid

#上面的配置会使在配置文件相同的目录下创建pid文件
#及这就是相对目录,建议默认就这样

1.2 defaults

默认的一个模块,一些超时和一些缺省值需要要设置的参数在这个模块设置

1.2.1 timeout connect

超时参数:连接超时
如果一个连接超过了超时参数设置的值没有进行响应操作,就会自动断开连接,返回一个错误的报文

  • 示例
1
2
#设置连接超时为:30000ms
timeout connect 30000ms

1.2.2 timeout client

超时参数:客户端超时
如果客户端超过了超时参数设置的值没有进行响应操作,就会自动断开连接,返回一个错误的报文

  • 示例
1
2
#设置客户端超时为:300000ms
timeout client 300000ms

1.2.3 timeout server

超时参数:服务器端超时
如果服务器端超过了超时参数设置的值没有进行响应操作,就会自动断开连接,返回一个错误的报文

  • 示例
1
2
#设服务器端超时为:3000000ms
timeout server 30000ms

1.2.4 stats

设置HaProxy的状态网页
由于有些模式修改过的请求,会干扰HAP核心的识别状态页面,所以推荐用默认透明模式进行访问状态页面

  • 示例
1
2
#设置HaP核心的状态页面为/hap
stats uri /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
2
#设置协议类型为http协议
mode 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
2
3
4
5
6
7
8
9
10
11
#判断请求模式是否为GET
acl http_g method GET
#如果为GET http_g就为true

#判断请求模式是否为POST
acl http_p method POST
#如果为GET http_p就为true

#判断请求模式是否为CONNECT(https)
acl http_s method CONNECT
#如果为GET http_s就为true

1.3.4 use_backend http-get/post/https if http_g/p/s

如果acl操作的值为true,

  • 示例
1
2
3
4
5
6
7
8
#如果http_g为true就使用http-get模块
use_backend http-get if http_g

#如果http_p为true就使用http-post模块
use_backend http-post if http_p

#如果http_s为true就使用https模块
use_backend https if http_s

1.3.5 default_backend https

默认使用的模块,当请求方法非get/post/https时,就会启用

  • 示例
1
2
#设置默认模块为:https
default_backend https

2. 请求处理语法

2.1 中文语法

添加中文语法的主要原因,是英文语法多多少少有些繁琐,不易写模式,而且很多友友都不懂英文语法,甚至看到英文就头疼。
添加中文语法对HaP的效率没有影响,最终的处理的都和英文语法一样。中文语法中的语句,都可以在英文语法里找到相同的作用的语法。
HaP是一款免费的软件,希望大家能尽量分享一些,多帮助些新人,这样才能发展HaP。

2.1.1 添加一行

在请求中添加一行请求

  • 原型
    请求 添加一行 hanme value

  • 参数

    • 参数1:hname 必填,一行的行头名称
    • 参数2:value 必填,一行的值,支持%[xxx]操作
  • 示例

1
2
#在请求中添加一行:test: abc\r\n 
请求 添加一行 test abc

2.1.2 设置行值

设置一行的值

  • 原型
    请求 设置行值 sanme value

  • 参数

    • 参数1:sname 必填,需要设置的值得行名称
    • 参数2:value 必填,一行的值 ,支持%[xxx]操作

在请求中,寻找sname行,如果存在就修改sname行的值,如果不存在就在请求结尾添加sname行,值为value

  • 示例
1
2
#设置Host行的值为:10.0.0.172
请求 设置行值 Host 10.0.0.172

2.1.3 设置行值2

设置一行的值(与设置行值一致)

  • 原型
    请求 设置行值2 sanme value

  • 参数

    • 参数1:sname 必填,需要设置的值得行名称
    • 参数2:value 必填,一行的值 ,支持%[xxx]操作

在请求中,寻找sname行,如果存在就修改sname行的值,如果不存在就在请求结尾添加sname行,值为value

  • 示例
1
2
#设置Host行的值为:10.0.0.172
请求 设置行值2 Host 10.0.0.172

2.1.4 删除一行

删除请求中的一行

  • 原型
    请求 删除一行 danme

  • 参数

    • 参数1:dname 必填,需要删除的行名称

会删除请求中的dname

  • 示例
1
2
#删除请求中的Host行
请求 删除一行 Host

2.1.5 删除一行2

删除请求中的一行(与删除一行一致)

  • 原型
    请求 删除一行2 danme

  • 参数

    • 参数1:dname 必填,需要删除的行名称

会删除请求中的dname

  • 示例
1
2
#删除请求中的Host行
请求 删除一行2 Host

2.1.6 替换字符串

替换请求中指定的字符串

  • 原型
    请求 替换字符串 str1 str2

  • 参数

    • 参数1:str1 必填,需要被替换的字符串,支持%[xxx]操作
    • 参数2:str2 必填 ,需要替换的字符串

在请求中,把str1字符串替换为str2字符串

  • 示例
1
2
3
4
5
#修改HTTP协议版本为:1.0
请求 替换字符串 HTTP/1.1 HTTP/1.0

#把Host行替换成X-Online-Host行
请求 替换字符串 \nHost: \nX-Online-Host:

2.1.7 之前添加

在请求中某一个字符串前面添加字符串

  • 原型
    请求 之前添加 name str

  • 参数

    • 参数1:name 必填,确定在哪一个字符串前面添加字符串
    • 参数2:str 必填,需要添加的字符串,支持%[xxx]操作

在请求中的的name字符串前添加str字符串

  • 示例
1
2
#在Host行前面添加一行:test,值为abc
请求 之前添加 Host: test:\ abc\r\n

2.1.8 之后添加

在请求中指定字符串后面添加字符串

  • 原型
    请求 之后添加 name str

  • 参数

    • 参数1:name 必填,确定在哪个字符串后面添加字符串
    • 参数2:str 必填,需要添加的字符串,支持%[xxx]操作

在请求中的name行后面添加str字符串

  • 示例
1
2
#在首行下面添新的一行test 值为abc
请求 之后添加 \n test:\ abc\r\n

2.1.9 行前添加

在请求中某一行前面添加字符串

  • 原型
    请求 行前添加 name str

  • 参数

    • 参数1:name 必填,确定在哪一行前面添加字符串
    • 参数2:str 必填,需要添加的字符串,支持%[xxx]操作

在请求中的的name行前添加str字符串

  • 示例
1
2
#在Host行前面添加一行:test,值为abc
请求 行前添加 Host test:\ abc\r\n

2.1.10 行后添加

在请求中某一行后面添加字符串

  • 原型
    请求 行后添加 name str

  • 参数

    • 参数1:name 必填,确定在哪一行后面添加字符串
    • 参数2:str 必填,需要添加的字符串,支持%[xxx]操作

在请求中的的name行后面添加str字符串

  • 示例
1
2
#在Host行后面添加一行:test,值为abc
请求 行后添加 Host test:\ abc\r\n

2.1.11 行值前添加

在一行值的前面添加字符串

  • 原型
    请求 行值前添加 name str

  • 参数

    • 参数1:name 必填,确定在哪一行值的前面添加字符串
    • 参数2:str 必填,需要添加的字符串,支持%[xxx]操作

在请求中的的name的值前面添加添加str字符串

  • 示例
1
2
3
4
5
#在Host行值前面添加字符串:abc
请求 行值前添加 Host abc
#如果Host行整行为:Host: wap.baidu.com\r\n
#那么使用上面的Host行就会变成:Host:abcwap.baidu.com\r\n
#这个时候Host行值的前面增加了abc,这就是'行值前添加'语法的作用

2.1.12 行值后添加

  • 原型
    请求 行值后添加 name str

  • 参数

    • 参数1:name 必填,确定在哪一行值的后面
    • 参数2:str 必填,需要添加的字符串,支持%[xxx]操作
  • 示例

1
2
3
4
5
#在Host行值后面添加abc
请求 行值后添加 Host abc
#如果Host行的整行为:Host: wap.baidu.com\r\n
#使用上面的语法后Host整行为:Host: wap.baidu.comabc\r\n
#这个时候Host行值后面添加了abc,这就是'行值后添加'语法的作用

2.1.13 URL前添加

  • 原型
    请求 URL前添加 str

  • 参数

    • 参数1:str 必填,需要添加的字符串,支持%[xxx]操作
  • 示例

1
2
#在请求URL之前添加字符串str
请求 URL前添加 str

2.1.14 URL后添加

  • 原型
    请求 URL后添加 str

  • 参数

    • 参数1:str 必填,需要添加的字符串,支持%[xxx]操作
  • 示例

1
2
##在请求URL之后添加字符串str
请求 URL后添加 str

2.1.15 删除网址http://host

  • 原型
    请求 删除网址http://host null null

  • 参数

    • 参数1: 可选,默认null即可
    • 参数2: 可选,默认null即可

在请求的第一行通常是这样的
GET(method) http://wap.baidu.com/?from=xxx
由于某些特殊修改请求的方法,需要去掉请求中的http://wap.baidu.com
所以出现了上面的语法,语法跟mov-fhttp null null作用一样

  • 示例
1
2
#删除网址http://host
请求 删除网址http://host null null

2.1.16 删除s_e

  • 原型
    请求 删除s_e start end

  • 参数

    • 参数1:start 必填,开始字符
    • 参数2:end 必填,结束字,支持%[xxx]操作符

删除startend之间的字符,保留end

  • 示例
1
2
3
#删除网址http://host
请求 删除s_e http:// /
#上面的语句的作用就等于删除网址http://

2.1.17 删除s_e2

  • 原型
    请求 删除s_e2 start end

  • 参数

    • 参数1:start 必填,开始的字符
    • 参数2:end 结束的字符串,支持%[xxx]操作

删除startend的字符,删除end,跟删除s_e的区别就是s_e保留了end,这个语法删除了end

  • 示例
1
2
3
#删除Host行
请求 删除s_e2 Host \r\n
#上面的语法的意思是删除:以Host开头到以\r\n结尾的字符串,开头和结尾都删除

2.1.18 atob a b

主要用于转换行头(行头就是一行的名字,通常有host行的叫法,就是因为行头为Host
如果a行存在,那么行头就替换成b行,b行不管存不存在都会被删除
如果a行的值为空,那么a行将会被删除,b行保留

  • 原型
    请求 atob a b

  • 参数

    • 参数1:a 必填,A行
    • 参数2:b 必填,B行
  • 示例

1
2
#X-Online-Host转Host
请求 atob X-Online-Host Host

2.1.19 设置第一行 str

自定义请求的第一行

  • 原型
    请求 设置第一行 str

  • 参数

    • 参数1:str 必填,支持%[xxx]操作
  • 示例

1
2
3
4
#具体事例 http://host转http://proxy_host
请求 设置第一行 %[method]\ http://prxoy_host%[request_uri]\ HTTP/1.1\r\n
#%[method] 请求方法 GET/POST/CONNECT
#%[request_uri] 请求url 跟php的REQUEST_URI类似

2.1.20 设置行名 hdrA hdrB

设置一行请求的行名

  • 原型
    请求 设置行名 hdrA hdrB

  • 参数

    • 参数1:`hdrA 需要被改名的请求行必填
    • 参数1: 将要改为的行名
  • 示例

1
2
3
#Host行改为T_Host行
请求 设置行名 Host T_Host
#就把Host行的行名: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
2
#添加test行,值为abc
http-request add-header 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
2
#设置Host行的值为10.0.0.172
http-request set-header2 Host 10.0.0.172

2.2.4 del-header
删除请求中的一行

  • 原型
    http-request del-header h

  • 参数

    • h: 必填,被删除的行头

删除请求中的h

  • 示例
1
2
#删除请求中的Host行
http-request del-header Host

2.2.5 del-header2

删除请求中的一行,与del-heder语法的区别就是此语法更稳当,del-header语法为开发语法

  • 原型
    http-request del-header2 h

  • 参数

    • h: 必填,被删除的行头
  • 示例

1
2
#删除请求中Host行
http-request del-header2 Host

2.2.6 add-replace(str_repalce)

替换请求中的字符串

  • 原型
    http-request add-replace(str_replace) str1 str2

  • 参数

    • str1: 必填,被替换的字符串,支持%[xxx]操作
    • str2: 必填,替换的字符串

把请求中的str1字符串替换成str2字符串

示例

1
2
#更改http协议版本为1.0
http-request add-replace HTTP/1.1 HTTP/1.0

2.2.7 add-before

在指定字符串前面添加字符串

  • 原型
    http-request add-before name str

  • 参数

    • name: 必填,定位在哪个字符串前面添加字符串
    • str: 必填,需要添加的字符串 ,支持%[xxx]操作
  • 示例

1
2
#Host行前添加一行test,值为abc
http-request add-before Host test:\ abc\r\n

2.2.8 add-after

在指定字符串后面添加字符串

  • 原型
    http-request add-after name str

  • 参数

    • name: 必填,定位在哪个字符后面添加字符
    • str: 必填,要添加的字符,支持%[xxx]操作
  • 示例

1
2
#在首行下面添加一个Host 值为test
http-rrequest add-after \n Host:\ test\r\n

2.2.9 add-lbefore

在指定行之前添加字符串

  • 原型
    http-request add-lbefore h str

  • 参数

    • h: 必填,在指定的行前
    • str: 必填, 添加的字符串,支持%[xxx]操作
  • 示例

1
2
#在Host行前添加新的一行test值为abc
http-request add-lbeofore Host test:\ abc\r\n

2.2.10 add-lafter

在指定行后添加字符串

  • 原型
    http-request add-lafter h str

  • 参数

    • h: 必填,在指定的行后
    • str: 必填, 添加的字符串,支持%[xxx]操作
  • 示例

1
2
#在Host行后添加新的一行:test行值为:abv
http-request add-lafter Host test:\ abc\r\n

2.2.11 add-vbefore

在指定行后的值前面添加字符串

  • 原型
    http-request add-vbefore h v

  • 参数

    • h: 必填,确定在哪一行值的前面添加字符串
    • v: 必填,添加的字符串 ,支持%[xxx]操作

h行的值后面添加字符串v

  • 示例
1
2
3
4
5
#在Host行值前面添加字符串:abc
http-request add-vbefore Host abc
#如果Host行整行为:Host: wap.baidu.com\r\n
#那么使用上面的Host行就会变成:Host:abcwap.baidu.com\r\n
#这个时候Host行值的前面增加了abc,这就是'add-hbefore'法的作用

2.2.12 add-vafter

在指定行的值后面添加

  • 原型
    http-request add-vafter h v

  • 参数

    • h: 指定哪个行值后面添加字符串
    • v: 需要添加的字符串,支持%[xxx]操作
  • 示例

1
2
3
4
5
#在Host行值后面添加abc
http-request add-vafter Host abc
#如果Host行的整行为:Host: wap.baidu.com\r\n
#使用上面的语法后Host整行为:Host: wap.baidu.comabc\r\n
#这个时候Host行值后面添加了abc

2.2.13 add-ubfore

在请求URL前面添加字符串

  • 原型
    http-request add-ubefore str

  • 参数

    • str: 添加的字符串,支持%[xxx]操作
  • 示例

1
2
#在请求url前添加'http://bml.net'
http-request ubefore http://byml.net

2.2.14 add-uafter

在请求URL之后添加字符串

  • 原型
    http-request add-uafter str

  • 参数

    • str: 添加的字符串,支持%[xxx]操作
  • 示例

1
2
#在请求URL后面添加字符串?abc
http-request add-uafter ?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
2
#X-Online-Host转Host
http-request atob X-Online-Host Host

####2.2.16 rep-hvalue
修改一行的值,如果不存在行就不添加

  • 原型
    http-request rep-hvalue h v

  • 参数

    • h: 修改值的行
    • v: 需要修改成的值,支持%[xxx]操作
  • 示例

1
2
#修改host行的值为byml.net,如果不存在则不做任何处理
http-request rep-havlue Host byml.net

2.2.17 mov-fhttp

删除请求网址开头:http://host

  • 原型
    http-request mov-fhttp null null

  • 参数

    • null: 默认即可
    • null: 默认即可,支持%[xxx]操作
  • 示例

1
2
#使用例子
http-request mov-fhttp null null

2.2.18 mov-se s e

删除以s开头到e结尾的字符串,保留e

  • 原型
    http-request mov-se s e

  • 参数

    • s: 开始的字符串
    • e: 结束的字符串,支持%[xxx]操作
  • 示例

1
2
#删除请求地址中的http://host
http-request mov-se http:// /

2.2.19 mov-nse s e

删除以s开头到e结尾的字符串,删除e

  • 原型
    http-request mov-nse s e

  • 参数

    • s: 开始的字符串
    • e: 结束的字符串,支持%[xxx]操作
  • 示例

1
2
3
#删除Host行
http-request mov-nse Host \r\n
#一行的结束标志是\r\n

2.2.20 set-req-fline str

自定义请求的第一行

  • 原型
    http-request set-req-fline str

  • 参数

    • str: 支持%[xxx]操作
  • 示例

1
2
3
4
#http://host转http://proxy_host
http-request set-req-fline %[method]\ http://proxy_host%[request_uri]\ HTTP/1.1\r\n
#%[method] 请求方法 GET/POST/CONNECT
#%[request_uri] 请求的url 跟php的REQUEST_URI类似

2.2.21 rn-header hdrA hdrB

设置一行请求的行名

  • 原型
    http-request rn-header hdrA hdrB

  • 参数

    • hdrA: 被改名的请求行
    • hdrB: 需要改为的名称
  • 示例

1
2
3
#Host行改为T_Host
http-request rn-header Host T_Host
#把Host行的请求名: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行的值,固定搭配

3.2 核心函数

3.2.1 未完待续