HAProxy介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HAProxy介绍相关的知识,希望对你有一定的参考价值。
参考技术A HAProxy是一个单线程,事件驱动的非阻塞引擎,它将一个非常快速的I / O层与一个基于优先级的调度器结合在一起。由于其设计时考虑了数据转发目标,因此其架构经过优化,可尽可能快地将数据移动到最少的操作。因此,它实现了在每个级别提供旁路机制的分层模型,确保数据不会达到更高的水平,除非需要。大多数处理在内核中执行,HAProxy尽可能快地通过提供一些提示或避免某些操作来帮助内核尽快完成工作,当它猜测它们可以被分组以后。结果,典型的数字显示了15%的处理时间花费在HAProxy上,在TCP或HTTP关闭模式下花费在内核上的85%,在HAProxy上花费约30%,在HTTP保持花费模式下花费70%。
一个进程可以运行多个代理实例; 据报道,单个进程中30万个不同代理的配置运行良好。因此,通常不需要为所有实例启动多个进程。
有可能使HAProxy运行在多个进程上,但是它有一些限制。一般来说,在HTTP关闭或TCP模式下没有意义,因为内核端不能很好地进行一些操作,比如connect()。对于HTTP保持活动模式,性能非常好可以通过一个单一的流程来实现,这个流程通常比一般的需求要好一个数量级。当用作SSL 卸载程序时,这是有意义的,而且这个特性在多进程模式下得到很好的支持。
HAProxy只需要haproxy可执行文件和配置文件即可运行。对于日志记录,强烈建议使用正确配置的syslog守护进程
和日志循环。配置文件在启动之前被解析,然后HAProxy尝试绑定所有监听套接字,如果有任何失败,则拒绝启动。过去这一点,它不能再失败了。这意味着没有运行时失败,如果它接受启动,它将工作,直到停止。
一旦HAProxy启动,它确实做了三件事情:
处理传入连接是迄今为止最复杂的任务,因为它依赖
于很多配置可能性,但是可以概括为以下9个步骤:
前端和后端有时被视为半代理,因为他们只看端到端连接的一端; 前端只关心客户端,而后端只关心服务器。HAProxy还支持
完整的代理,这正是前端和后端的联合。当需要进行HTTP 处理时,配置通常会被分割成前端和后端,因为任何前端都可能将
连接传递给任何后端。相对于TCP-only代理,使用前端和后端的一个好处是配置比用完整的代理更可读。
Linux haproxy代理介绍
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
1、安装
[[email protected] varnish]# yum install haproxy
2、调整参数
nbproc <number>:要启动的haproxy的进程数量; 官方建议一个 默认一个
maxconn 每个进程最大连接数 一个连接33kb 1g内存 能创建20000-25000个进程,这个还是要看具体调整
maxconnrate 最大创建连接速率
maxse***ate 最大创建会话数量
maxsslconn 最大创建ssl连接 默认还是maxconn,防止内存溢出等ulimit-n <number>:每个haproxy进程可打开的最大文件数; 客户端 服务端,所以是最大连接数量*2, 会自动调整
timeout client <timeout> 客户端非活动超时时长
timeout server <timeout> 服务器端非活动时长
timeout http-keep-alive 持久连接的持久时长;
timeout http-request 等待http请求报文超时时长
timeout connect 跟服务器连接 超时时长
timeout client-fin 客户端断开连接 默认30s
timeout server-fin 服务器断开连接
调整maxconn即可,其他看情况调整
3、配置前端后台
#调度方法
#roundrobin 动态算法:支持权重的运行时调整,支持慢启动;每个后端中最多支持4095个server;
#static-rr:静态算法:不支持权重的运行时调整及慢启动;后端主机数量无上限;
#leastconn:推荐使用在具有较长会话的场景中,例如MySQL、LDAP等;
#first:根据服务器在列表中的位置,自上而下进行调度;前面服务器的连接数达到上限,新请求才会分配给下一台服务;
#source:源地址hash;
#<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
#左半部分:/<path>;<params>
#整个uri:/<path>;<params>?<query>#<frag>
#uri:对URI的左半部分做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;
#url_param 对用户请求的uri听<params>部分中的参数的值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server;
#hdr(<name>):对于每个http请求,此处由<name>指定的http首部将会被取出做hash计算; 并由服务器总权重相除以后派发至某挑出的服务器;没有有效值的会被轮询调度; hdr(Cookie)#调度算法
#hash-type
#map-based:除权取余法,哈希数据结构是静态的数组;
#consistent:一致性哈希,哈希数据结构是一个树;#mode { tcp|http|health }
#tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议;
#http:仅当代理的协议为http时使用;
#health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接;#server 参数
#server <name> <address>[:port] [settings ...]
#<name>:服务器在haproxy上的内部名称;出现在日志及警告信息;
#<address>:服务器地址,支持使用主机名;
#[:[port]]:端口映射;省略时,表示同bind中绑定的端口;
#[param*]:参数
#maxconn <maxconn>:当前server的最大并发连接数;
#backup:设定当前server为备用服务器;
#check:对当前server做健康状态检测;
#addr :检测时使用的IP地址;
#port :针对此端口进行检测;
#inter <delay>:连续两次检测之间的时间间隔,默认为2000ms;
#rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2;
#all <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3;
#注意:httpchk,"smtpchk", "mysql-check", "pgsql-check" and "ssl-hello-chk" 用于定义应用层检测方法;
#cookie <value>:为当前server指定其cookie值,用于实现基于cookie的会话黏性; 一次固定值,第二次找这个固定值对应的主机
#disabled:标记为不可用;
#redir <prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL;https://www.baidu.com
#weight <weight>:权重,默认为1;
frontend main *:80
mode tcp
default_backend app
backend app
balance source
hash-type map-based
server node2 192.168.1.201:80 check inter 1000 rise 1 fall 2 weight maxconn 2000
server node3 192.168.1.202:80 check
4、配置状态页面和认证(base64)
可以写在backend 和 frontend中
listen stats:10080 # 也可以配置backend 或者 frontend 或者 listen
stats enable
stats uri /haadmin?admin
stats realm "HAProxy Statistics"
stats auth admin:admin
stats auth admin1:admin1
stats admin if TRUE #状态页面设置 慎用
5、tcp代理
listen sshsrvs :10022
mode tcp
maxconn 10
balance leastconn
server ssh1 192.168.1.201:22 check
server ssh2 192.168.1.202:22 check
6、基于cookie绑定
backend websrvs
cookie WEBSRV insert nocache indirect
server srv1 172.16.100.6:80 weight 2 check rise 1 fall 2 maxconn 3000 cookie srv1
server srv2 172.16.100.7:80 weight 1 check rise 1 fall 2 maxconn 3000 cookie srv2
#第一次来添加cookie值,第二次根据cookie值到指定的后端主机
7、代理ip 默认就有
默认开启的
option forwardfor [ except <network> ] [ header <name> ] [ if-none ]
option forwardfor header X-Client 重命名
8、自定义错误页面
<code>:is the HTTP status code. Currently, HAProxy is capable of generating codes 200, 400, 403, 408, 500, 502, 503, and 504.
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
errorfile 408 /dev/null # workaround Chrome pre-connect bug
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
errorloc <code> <url>
errorloc 403 http://www.baidu.com
errorloc302 <code> <url>
#_____________________________________________________________
acl invalid_src src 192.168.1.104
block if invalid_src
errorfile 403 /root/error.html
9、header
reqadd <string> [{if | unless} <cond>]
rspadd <string> [{if | unless} <cond>]
reqdel <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>] (ignore case)
rspdel <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>] (ignore case)
#_________________________________________________________________________
frontend main *:80
rspadd X-var: Haproxy
rspdel X-Powered-By
default_backend app
10、日志
log:定义全局的syslog服务器;最多可以定义两个;
log 127.0.0.1 local2
log-format <string>:
默认发往本机的日志服务器;
(1) local2.* /var/log/local2.log
(2) $ModLoad imudp
$UDPServerRun 514
[[email protected] varnish]# tail /var/log/haproxy.log
Jun 7 14:56:57 localhost haproxy[8676]: 192.168.1.104:64969 [07/Jun/2018:14:56:57.477] main app/node2 0/0/0/2/2 200 1734 - - --VN 2/2/0/0/0 0/0 "GET /index.php HTTP/1.1"
>>> Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} "GET /index.html HTTP/1.1"
Field Format Extract from the example above
1 process_name ‘[‘ pid ‘]:‘ haproxy[14389]:
2 client_ip ‘:‘ client_port 10.0.1.2:33317
3 ‘[‘ accept_date ‘]‘ [06/Feb/2009:12:14:14.655]
4 frontend_name http-in
5 backend_name ‘/‘ server_name static/srv1
6 Tq ‘/‘ Tw ‘/‘ Tc ‘/‘ Tr ‘/‘ Tt* 10/0/30/69/109
7 status_code 200
8 bytes_read* 2750
9 captured_request_cookie -
10 captured_response_cookie -
11 termination_state ----
12 actconn ‘/‘ feconn ‘/‘ beconn ‘/‘ srv_conn ‘/‘ retries* 1/1/1/1/0
13 srv_queue ‘/‘ backend_queue 0/0
14 ‘{‘ captured_request_headers* ‘}‘ {haproxy.1wt.eu}
15 ‘{‘ captured_response_headers* ‘}‘ {}
16 ‘"‘ http_request ‘"‘ "GET /index.html HTTP/1.1"
Tq 等待客户端发送报文时间
tw 队列等待时长
tc 创建连接时长
Tr 等待服务器发送响应到代理时间
tt 接收报文时长
actconn 日志记录时候当前进程连接数
feconn 日志记录时候前端连接数
beconn 日志记录时候后端连接数
srv_conn 日志记录时候当前活动连接数
retries 日志记录时候重新连接的个数
#捕获并记录日志
capture request header Host len 64
capture request header User-Agent len 128
capture request header X-Forwarded-For len 100
capture request header Referer len 200
capture response header Server len 40
capture response header Server-ID len 40
log-format %T %t Some Text
log-format %{+Q}o %t %s %{-Q}r
11、压缩
compression algo <algorithm> ...:启用http协议的压缩机制,指明压缩算法gzip, deflate;
compression type <mime type> ...:指明压缩的MIMI类型
#___________________________________________________________
compression type application/javascript text/plain
compression algo gzip
12、动静分离
frontend main *:80
acl invalid_src src 192.168.1.104
block if invalid_src
#如果源地址是192.168.1.104 invalid_src=True ;如果invalid_src是真就block
frontend main *:5000
#动静分离
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
#else
default_backend app
13、虚拟主机动静分离配置
frontend main *:80
acl www_proxy hdr_dom(host) -i www.proxy.develop
acl url_static path_end -i .jpg .gif .png .css .js
use_backend www_proxy_static if url_static
use_backend www_proxy_dynamic if www_proxy ! url_static
backend www_proxy_static
server node1 192.168.1.201:80 check
backend www_proxy_dynamic
server node2 192.168.1.202:80 check
14、https(http->https)
frontend https_frontend
bind *:443 ssl crt /etc/haproxy/demo.pem
default_backend app
frontend main *:80
acl ssl_proxy hdr_dom(host) -i www.proxy2.develop
redirect scheme https if ssl_proxy
以上是关于HAProxy介绍的主要内容,如果未能解决你的问题,请参考以下文章