• HAProxy的配置


    HAProxy的配置

    进程及安全管理:chroot, deamon,user,group,uid,gid
    	nbproc <number> :要启动的haproxy 的进程数量,系统默认单进程,要求使用daemon 模式
    	ulimit-n <number> :每个haproxy 进程可打开的最大文件数,系统自动会指定,不建议设置
    	daemon:后端方式运行,建议使用
    	log :定义全局的syslog 服务器,最多可以定义两个
    		log <address> [len <length>] <facility> [max level [min level]]
    	address:rsyslog 服务器地址
    	len:记录日志的长度,默认我1024
    日志:
    	log:
    		log global
    		log <address> [len <length>] <facility> [<level>[<minlevel>]]
    		no log
    		注意:
    			默认发往本机的日志服务器;
    			(1) local2.* /var/log/local2.log
    			(2) $ModLoad imudp
    				$UDPServerRun 514
    	log-format <string>:
    		课外实践:参考文档实现combined
    	将特定信息记录在日志中
    		capture cookie <name> len <length>:
    			捕获求和响应报文中的 cookie 并记录日志
    		capture request header <name> len <length>:
    			捕获请求报文中指定的首部并记录日志
    			示例:
    				capture request header X-Forwarded-For len 15
    		capture response header <name> len <length>:
    			捕获响应报文中指定的首部并记录日志
    			示例:
    				capture response header Content-length len 9
    				capture response header Location len 15
    性能调整:
    	maxconn <number>:
    		设定每个haproxy 进程所能接受的最大并发连接数
    	maxconnrate <number>:
    		设置每个进程每秒种所能建立的最大连接数量
    	maxsessrate <number>:
    		设置每个进程每秒种所能建立的最大会话数量
    	maxsslconn <number>:  
    		每进程支持SSL 的最大连接数量
    	spread-checks <0..50, in percent> :
    		健康检测延迟时长比建议2-5
    配置段
    	代理配置段:
    		- defaults <name>
    		- frontend <name>
    		- backend <name>
    		- listen <name>
    	Frontend 段:指定接收客户端连接侦听套接字设置
    	Backend 段:指定将连接请求转发至后端服务器的相关设置
    	Listen 对段:指定完整的前后端设置,只对TCP有效
    	proxy 名称:使用“字母“,”数字”,“-”,“_”,“.”,“:” 并区分字符大小写
    配置参数:
    	bind :指定一个或多个前端侦听地址和端口
    		bind [<address>]:<port_range> [, ...] [param*]
    	示例:
    		listen http_proxy
    		bind :80,:443
    		bind 10.0.0.1:10080,10.0.0.1:10443
    		bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
    Balance 配置
    	balance :后端服务器组内的服务器调度算法
    	balance <algorithm> [ <arguments> ]
    	balance url_param <param> [check_post]
    	调度算法:
    		roundrobin :基于权重轮询,动态算法, 支持权重在运行时调整,支持慢启动,每个后端backend 中最多支持4095 个server
    			server options:weight #
    		static-rr :基于权重轮询,静态算法,不支持权重在运行时调整及慢启动,后端主机数量无上限
    		leastconn :加权最少连接,动态算法,最少连接的后端服务器优先分配接收新连接,相同连接时轮询,推荐在较长会话的场景使用 ,例如MySQL、LDAP 等,不适合http。
    		first :根据服务器在列表中的位置,自上而下进行调度,前面服务器的连接数达到上限,新请求才会分配给下一台服务
    		source :源地址hash ,新连接先按权重分配,后续连接按source 分配请求
    	uri:
    		对URI 的左半部分或整个uri 做hash 计算,并除以服务器总权重取模,以后派发至某挑出的服务器, 适用于后端缓存服务器
    			<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
    		左半部分:/<path>;<params>
    		整个uri :/<path>;<params>?<query>#<frag>
    	url_param:
    		对用户请求的uri 中的<params> 部分中的参数的值作hash 计算,并由服务器总权重相除以后派发至某挑出的服务器,通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server
    	hdr(<name>) :
    		对于每个http 请求,此处由<name> 指定的http首部将会被取出做hash计算,并由服务器总权重相除以后派发至某挑出的服务器,无有效值的会被轮询调度。
    			hdr(Cookie)
    	rdp-cookie 远程桌面相关
    	rdp-cookie(<name>)
    哈希算法(hash)
    	hash-type :
    		hash-type <method> <function> <modifier>
    		method:
    			map-based :除权取余法,哈希数据结构是静态数组
    			consistent :一致性哈希,哈希数据结构是一棵树
    			<function> :  哈希函数
    				sdbm djb2 wt6
    	default_backend <backend>
    		无use_backend匹配时,使用默认的backend ,用于frontend中
    	default-server [param*]
    		为backend 中的各server设定默认选项
    
    后端配置:
    	server <name> <address>[:[port]] [param*]
    		定义后端主机的各服务器及其选项
    		server <name> <address>[:port] [settings ...]
    		default-server [settings ...]
    		<name> :服务器在haproxy 上的内部名称;出现在日志及警告信息
    		<address> :服务器地址,支持使用主机名
    		[:[port]] :端口映射;省略时,表示同bind 中绑定的端口
    		[param*] :参数
    			weight <weight> :权重,默认为1
    			maxconn <maxconn> :当前后端server 的最大并发连接数
    			backlog <backlog> :当server 的连接数达到上限后的后援队列长度
    			backup :设定当前server 为备用服务器Sorry Server
    健康状态检测
    	check :对当前server 做健康状态检测,只用于四层检测
    		注意:httpchk,“smtpchk”, “mysql-check”, “pgsql-check” 和“ssl-hello-chk”  用于定义应用层检测方法
    		addr:检测时使用的IP地址
    		port:针对此端口进行检测
    		inter <delay> :检测之间的时间间隔,默认为2000ms
    		rise <count> :连续多少次检测结果为“成功”才标记服务器为可用;默认为2
    		fall <count> :连续多少次检测结果为“失败”才标记服务器为不可用;默认为3
    	disabled :标记为不可用
    	redir <prefix> :将发往此server 的所有GET 和HEAD 类的请求重定向至指定的URL
    	对后端服务器做http 协议健康状态检测:通常用于bendend
    		option httpchk 默认为:/ OPTIONS HTTP/1.0
    		option httpchk <uri>
    		option httpchk <method> <uri>
    		option httpchk <method> <uri> <version>
    			定义基于http 协议的7 层健康状态检测机制
    		http-check expect [!] <match> <pattern>
    			http 协议健康 状态检测
    	
    cookie 配置
    	cookie <value> :为当前server 指定cookie 值,实现基于cookie 的会话黏性
    	cookie <name> [ rewrite | insert | prefix ] [ indirect ][ nocache ] [ postonly ] [ preserve ] [ httponly ] [secure ] [ domain <domain> ]* [ maxidle <idle> ] [maxlife <life> ]
    		<name>:cookie 名称,用于实现持久连接
    		rewrite :重写
    		insert :插入
    		prefix:前缀
    	示例:
    		基于cookie 的session sticky 的实现:
    		backend websrvs
    			cookie WEBSRV insert nocache
    			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
    统计接口启用的相关参数
    	stats enable
    		启用统计页;基于默认的参数启用stats page
    			- stats uri : /haproxy?stats uri 默认值
    			- stats realm : HAProxy Statistics
    			- stats auth : no authentication
    	stats uri <prefix>
    		自定义stats page uri, 默认为
    	stats auth <user>:<passwd>
    		认证时的账号和密码,可使用多次
    	stats realm <realm>
    		认证时的realm
    	stats hide-version
    		隐藏 版本
    	stats refresh <delay>
    		设定自动刷新时间间隔
    	stats admin { if | unless } <cond>
    		启用stats page 中的管理功能
    	配置示例:
    		listen stats
    			bind :9999
    			stats enable
    			stats realm HAPorxy Stats Page
    			stats auth admin1:password1
    			stats auth admin1:password2
    			stats refresh 3s
    			stats admin if TRUE
    工作模式
    	maxconn <conns> :为指定的frontend 定义其最大并发连接数,默认为3000
    	mode { tcp|http|health }
    		定义haproxy 的工作模式
    		tcp :基于layer4 实现代理,可代理mysql, pgsql, ssh,ssl 等协议,https 时使用此模式,默认模式
    		http :仅当代理协议为http 时使用,centos 实际默认模式
    		health :工作为健康状态检查的响应模式,当连接请求到达时回应“OK”
    	tcp模式示例:
    		listen ssh
    			bind :22022
    			balance leastconn
    			mode tcp
    			server sshsrv1 172.16.100.6:22 check
    			server sshsrv2 172.16.100.7:22 check
    
    
    forwardfor 配置
    	option forwardfor [ except <network> ] [ header <name> ][ if-none ]
    		在由haproxy 发往后端主机的请求报文中添加“X-Forwarded-For” 首部,其值为前端客户端的地址;用于向后端主发送真实的客户端IP。
    		[ except <network> ] :请求报文来自此处指定的网络时不予添加此首部,如haproxy 自身所在网络
    		[ header <name> ] :使用自定义的首部名称,而非“X-Forwarded-For”
    		[ if-none ] 如果没有首部才添加首部,如果有使用默认值
    	为指定的MIME 类型启用压缩传输功能
    		compression algo <algorithm> ... :启用http 协议的压缩机制,指明压缩算法gzip, deflate
    		compression type <mime type> ... :指明压缩的MIMI
    错误页配置
    	 errorfile <code> <file>  自定义错误页
    		<code> :HTTP status code.
    			支持200, 400, 403, 408, 500, 502, 503, 504.
    		<file> :错误页文件路径
    	示例:
    		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>
    		相当于errorloc302 <code> <url> ,利用302 重定向至指URL errorloc 503 http://www.magedu.com/error_pages/503.html
    修改报文首部
    	在请求报文尾部添加指定首部
    		reqadd <string> [{if | unless} <cond>]
    	在响应报文尾部添加指定首部
    		rspadd <string> [{if | unless} <cond>]
    		示例:rspadd X-Via: HAPorxy
    	从请求报文中删除匹配正则表达式的首部
    		reqdel <search> [{if | unless} <cond>]
    		reqidel <search> [{if | unless} <cond>]  不分大小写
    	从响应报文中删除匹配正则表达式的首部
    		rspdel <search> [{if | unless} <cond>]
    		rspidel <search> [{if | unless} <cond>]  不分大 小写
    		示例: rspidel server.*
    连接超时
    	timeout client <timeout>
    		客户端最长空闲连接超时时长  默认单位是毫秒
    	timeout server <timeout>
    		后端服务器最长空闲连接超时时长
    	timeout http-keep-alive <timeout>
    		持久连接的持久时长
    	timeout http-request <timeout>
    		一次完整的HTTP 请求的最大等待时长
    	timeout connect <timeout>
    		成功连接后端服务器的最大等待时长
    	timeout client-fin <timeout>
    		客户端 半连接的空闲时长
    	timeout server-fin <timeout>
    		后端服务器半连接的空闲时
    ACL
    	acl:
    		访问控制列表(ACL )的使用提供了一个灵活的解决方案来执行内容交换,并且通常基于从请求中提取的内容、响应或任何环境状态进行决策。
    	acl <aclname> <criterion> [flags] [operator] [<value>] ...
    		<aclname>:ACL 名称,可使用字母数字 : . - _区分字符大小写
    		<criterion>:比较的标准和条件
    	<value> 的类型:
    		- boolean
    		- integer or integer range
    		- IP address / network
    		- string (exact, substring, suffix, prefix, subdir,domain)
    		- regular expression
    		- hex block
    	<flags>
    		-i  不区分大小写
    		-m  使用指定的pattern 匹配方法
    		-n  不做DNS 解析
    		-u  强制每个ACL 必须 唯一ID ,否则多个同名ACL或关系
    		--  强制flag 结束.  当字符串和某个flag 相似时使用
    	[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 进行匹配
    	 acl 作为条件时的逻辑关系:
    		-  与:隐式(默认)使用
    		-  或:使用“or” 或“||” 表示
    		-  否定:使用“!“  表示
    		示例: 
    			if invalid_src invalid_port 与关系
    			if invalid_src || invalid_port 或
    			if ! invalid_src 非
    	<criterion> :各种条件
    		dst              目标IP
    		dst_port      目标PORT
    		src               源IP
    		src_port       源PORT
    		示例:acl invalid_src src 172.16.100.200
    	base : string
    		返回第一个主机头和请求的路径部分的连接,该请求从第一个斜杠开始,并在问号之前结束, 对虚拟主机有用
    		<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
    			base : exact string match
    			base_beg : prefix match
    			base_dir : subdir match
    			base_dom : domain match
    			base_end : suffix match
    			base_len : length match
    			base_reg : regex match
    			base_sub : substring match
    	path : string
    		提取请求的URL 路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)
    		<scheme>://<user>:<password>@<host>:<port>/<path>;<
    			params>?<query>#<frag>
    			path : exact string match
    			path_beg : prefix match
    			path_dir : subdir match
    			path_dom : domain match
    			path_end : suffix match
    			path_len : length match
    			path_reg : regex match
    			path_sub : substring match
    	url : string
    		提取请求中的URL,一个典型的应用是具有预取能力的缓存,以及需要从数据库聚合多个信息并将它们保存在缓存中的网页门户 入口
    			url : exact string match
    			url_beg : prefix match
    			url_dir : subdir match
    			url_dom : domain match
    			url_end : suffix match
    			url_len : length match
    			url_reg : regex match
    			url_sub : substring match
    	req.hdr([<name>[,<occ>]]) : string
    		提取在一个HTTP 请求报文的首部
    		hdr([<name>[,<occ>]]) : exact string match
    		hdr_beg([<name>[,<occ>]]) : prefix match
    		hdr_dir([<name>[,<occ>]]) : subdir match
    		hdr_dom([<name>[,<occ>]]) : domain match
    		hdr_end([<name>[,<occ>]]) : suffix match
    		hdr_len([<name>[,<occ>]]) : length match
    		hdr_reg([<name>[,<occ>]]) : regex match
    		hdr_sub([<name>[,<occ>]]) : substring match
    		示例:
    			acl bad_curl hdr_sub(User-Agent) -i curl
    			block if bad_curl
    	status : integer
    		返回在响应报文中的状态码
    	
    	预定义ACL
    		ACL名称 	等价于 	说明
    		TRUE 	always_true 	总是匹配
    		FALSE 	always_false 	从不匹配
    		HTTP 	req_proto_http 	匹配HTTP 协议
    		HTTP_1.0 	req_ver 1.0 	匹配HTTP 协议1.0
    		HTTP_1.1 	req_ver 1.1 	匹配HTTP 协议1.1
    		HTTP_CONTENT 	hdr_val(content-length) gt 0  	匹配已存在内容长度
    		HTTP_URL_ABS 	url_reg ^[^/:]*:// 	匹配URL 绝对路径
    		HTTP_URL_SLASH	url_beg / 	匹配URL 相对路径
    		HTTP_URL_STAR 	url * 	匹配 URL 于 等于 "*"
    		LOCALHOST	 src 127.0.0.1/8	 匹配从localhost 来的连接
    		METH_CONNECT	 method CONNECT 	匹配HTTP CONNECT
    		METH_GET	 method GET HEAD 	match HTTP GET or HEAD method
    		METH_HEAD 	method HEAD 	match HTTP HEAD method
    		METH_OPTIONS 	method OPTIONS 	match HTTP OPTIONS method
    		METH_POST 	method POST 	match HTTP POST method
    		METH_TRACE 	method TRACE 	match HTTP TRACE method
    		RDP_COOKIE 	req_rdp_cookie_cnt gt 0 	match presence of an RDP cookie
    		REQ_CONTENT 	req_len gt 0 	match data in the request buffer
    		WAIT_ENDwait_end 	wait for end of content analysis	
    	
    	配置
    		use_backend <backend> [{if | unless} <condition>]
    			当if/unless 一个基于ACL 的条件匹配时切换指定backend
    		block { if | unless } <condition>
    			阻止7 层请求if/unless 一个条件匹配
    			示例:
    				acl invalid_src src 172.16.200.2
    				block if invalid_src
    				errorfile 403 /etc/fstab
    		http-request { allow | deny |add-header <name> <fmt>|set-header <name> <fmt> } [ { if | unless }<condition> ]
    			对7 层请求的访问控制
    		 tcp-request connection {accept|reject} [{if | unless}<condition>]
    			根据第4 层条件对传入连接执行操作
    			示例:
    				listen ssh
    				bind :22222
    				mode tcp
    				balance leastconn
    				acl invalid_src src 172.16.0.200
    				tcp-request connection reject if invalid_src
    				server sshsrv1 192.168.1.101:22 check
    				server sshsrv2 192.168.1.102:22 check backup
    	
    	基于ACL 的动静分离示例
    		frontend web *:80
    			acl url_static path_beg -i /static /images /javascript/stylesheets
    			acl url_static path_end -i .jpg .gif .png .css .js .html .txt .htm
    			use_backend  staticsrvs if url_static
    			default_backend appsrvs
    		backend staticsrvs
    			balance roundrobin
    			server stcsrv1 172.16.100.6:80 check
    		backend appsrvs
    			balance roundrobin
    			server app1 172.16.100.7:80 check
    			server app1 172.16.100.7:8080 check
    		listen stats
    			bind :9091
    			stats enable
    			stats auth admin:admin
    			stats admin if TRUE
    		
    支持https 协议
    	配置HAProxy 支持https 协议:
    	支持ssl 会话;
    		bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
    		crt  后证书文件为PEM 格式,且同时包含证书和所有私钥
    		cat demo.crt demo.key > demo.pem
    	把80 端口的请求重向定443
    		bind *:80
    		redirect scheme https if !{ ssl_fc }
    	向后端传递用户请求的协议和端口(frontend 或backend) )
    		http_request set-header X-Forwarded-Port%[dst_port]
    		http_request add-header X-Forwared-Proto https if { ssl_fc }
    
  • 相关阅读:
    android NDK环境搭建
    Android 控制硬件加速hardwareAccelerated的说明
    如何使用ttf字体文件
    33 文件IO流(二)
    32 文件IO流(一)
    # 02 公共前缀问题
    01 对称匹配问题(总元素必为偶数个)
    31 包装类
    30 常用工具类(二)
    01.数组内容打印(String形式)
  • 原文地址:https://www.cnblogs.com/shenxm/p/8463563.html
Copyright © 2020-2023  润新知