HAProxy浅说:
HAProxy响应码:
200:请求正常,响应正常,也就是正常响应码
301:配置使用的重定向,以下都是有关于重定向的一些响应码,不做解释
302:
303:
307:
308:
400:客户端错误,请求无效或是请求太大
401:身份验证时的问题所向,如果通过有这个响应码
403:请求没有权限,一般为ACL或者是系统的filter功能对请求流进行了流量匹配执行了拒绝
408:请求超时
500:服务端错误,当HAProxy遇到不可恢复的内部错误时,会响应此响应码,一般不会出现,因为,如果这么严重的错误就会变成404了
502:服务端响应为空,响应无效,响应不完整或者rspdeny过滤的问题时会出现这个响应码
503:没有服务器可用于处理请求,或者无法连接后端服务器产生的错误
504:在服务器响应之前触发了请求超时
HAProxy的配置
配置文件的格式:
配置文件分为五段
globel:全局配置
defaults:默认配置,这一段的配置可以用于其它几段的公有配置
listen:用于代理监听的端口,也就是监听那一个端口,也可以加入一些其它配置
frontend:前端配置,也就是代理配置
backend:后端配置
时间格式:
通常使用毫秒来表示时间的相关配置
配置试例:
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind :80
default_backend servers
backend servers
server server1 127.0.0.1:8000 maxconn 32
以上的配置还可以写成如下的形式
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen http-in
bind *:80
server server1 127.0.0.1:8000 maxconn 32
全局配置指令(Global parameters)
chroot:指定HAProxy的运行根目录,将HAProxy的权限降低,如有此目录下的权限,其它目录下HAProxy是没有权限的
chroot /var/haproxy //一说是变更程序的特定目录,那就与selinux有关了,修改其标签或是关闭
deamon:运行为守护进程
log:日志存储位置
log 127.0.0.1 local2 //本地日志文件存放位置,这个local2可以在/etc/rsyslog.conf文件中做配置
log <address> [len <length>] <facility> [max level [min level]] //定义日志长度,日志级别等
group:定义HAProxy的启用进程的组
user:定义HAProxy的启用进程的用户
maxconn:最大连接数
maxconnrate:每秒最大连接数
maxcompcpuusage:最大CPU使用率
maxsessrate:每秒开启的最大会话数
maxsslconn:ssl的最大连接数
maxsslrate:每秒ssl最大连接数
maxpipes:最大打开多少个管道文件
spread-checks:对逻辑服务器或者物理服务器进行健康检测
Proxies段指令
defaults <name>:配置以下其它部分的公共配置段,也就是配置的默认配置
frontend <name>:前端监听客户端的配置
backend <name>:后端为前端提供服务的配置,也就是如何连接后端,有那些后端等
listen <name>:这里可以定义一个完整的代理,它的前端与后端组合在了一起,但是只可以定义TCP流量,所以只能进行伪四层代理
注:在配置文件中名字可以使用_-.:符号,当然也可以使用字母与数字
Proxy部分关键字说明
acl
acl <aclname> <criterion> [flags] [operator] <value> …
acl acl的名字 acl定义的标准 [标记] [选项] 值…
acl invalid_src src 0.0.0.0/7 224.0.0.0/3
acl invalid_src src_port 0:1023
acl local_dst hdr(host) -i localhost
返回的数据类型:
boolean:布尔型值
integer:整数
IPv4 or IPv6:IP地址
string:字符串
data block:数据块
ACL可以匹配识别的数据类型
boolean:布尔型
integer or integer range:整数或者一个整数的范围
IP or network:IP或者网段
string:字符串
hex block:十六进制块
ACL的标记:
-i:忽略匹配内容的大小写
-f:从文件中读取所要的匹配内空
-m:使用特定的模式匹配
-n:禁止DNS解析
-M:加载一个相当于-f指定的文件,内容为健–值型调用
-u:强制ACL使用的唯一ID号
–:强制结束标记,也就是给相关的字符串进行非标记符进行转意
选项
匹配整数时可用的运算符
eq,lt,le,gt,ge
字符串匹配:
exact match (-m str):提取的字符串必须完全匹配
substring match (-m sub):在内查找图片,提取字符串,进行ACL匹配
prefix match (-m beg):对匹配字符串的开头进行比较,匹配ACL
suffix match (-m end):对匹配字符串的尾部进行比较,匹配ACL
subdir match (-m dir):匹配一个路径(uri)的其中一段,以/分割取其中的某些段
domain match (-m dom):匹配一个url,以.分割,取其中的特定段
ACL标准:
关于IP与端口的标准:
dst:目标IP
dst_port:目标端口
src:源IP
src_prot:源端口
关于PATH的,也就是URI的相关标准:
path:string //提取请求中的URL路径,该路径以/开头,并在?之前结束
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
关于URI的相关标准:
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
关于请求头部的标准:
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 valid_method method GET HEAD //定义一个acl,标准为method,方法为GET和HEAD
http-request deny if ! valid_method //对此acl进行操作,可以使用非
blance:算法
roundrobin:动态轮询
static-rr:静态轮询
leastconn:最小连接
first:连接一台服务器到其负载最大值,再连接下一台服务器
source:对源IP进行绑定,类似于nginx的hash与ip_hash
uri:对uri左半部分进行hash,并由服务器总权重相除以后派发至某个挑出的服务器上
url_param:对用户请求的uri的<param>部分参数值做为hash计算,并由服务器总权重相除以后溾发至某个挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server上
hdr(<name>):对于每个http请求指定的头部做hash,并由服务器总权重相除后派发至挑选的服务器上,没有有效值的会被轮询调度
rdp-chookie(<name>):也就是chookie绑定,对应的用户只会由对应的服务器进行响就,也只有此一个服务器去响应,当然了,那些进行动静分离的不算,如果没有检查到chookie,那么会进行轮询对backend进行挑选
hash_type:定义使用的hash算法类型
map-bashed:除权法,也就是静态算法
consistents:一致性哈希算法,这个是一个动态算法
bind:对端口进行绑定
bind *:80 //对80端口进行绑定
block:如果条件匹配就阻止第七层请求
acl test_name hdr_reg(Status Code) 200
block if ! test_name
default-backend <backend>:设定默认的backend,用于frontend中;
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic
default-server:为backend中的各server设定默认选项
default-server inter 1000 weight 13
mode:设定实例的运行模式与协议
tcp:基于四层代理,可代理mysql,ssh,ssl,等协议
http:仅当代理的协议为http时使用
health:工作为健康状态的响应模式,当连接请求到达时回应OK后即断开连接
cookie:在backend开启基于cookie的长连接
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ]
[ postonly ] [ preserve ] [ httponly ] [ secure ]
[ domain <domain> ] [ maxidle <idle> ] [ maxlife <life> ]
cookie JSESSIONID prefix
cookie SRV insert indirect nocache
cookie SRV insert postonly indirect
cookie SRV insert indirect nocache maxidle 30m maxlife 8h
compression algo <algorithm>:启用压缩,设定压缩算法
identity:适用于在开发时测试使用
gzip:压缩为gzip
deflate:类似于gzip
compression algo gzip
compression type text/html text/plain
compression type <mime type>:
compression offload:
enable:将一个代理启动,默认为启动,所以此指令通常不使用
disable:将一个代理关闭,默认为启动,在进行灰度发布时可以将一个代理设置为disable
errorfile <code> <file>:将HAProxy的错误返回为指定文件
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
errorloc302 <code><url>:将HAProxy的错误重定向到指定页面
errorloc303 <code><url>:
http-check expect [!] <match> <pattern>:在特定的内容或者状态码下进行http的健康检测
status <string>:检测响应码确切的字符串
rstatus <regex>:检测响应码的匹配字符串
string <string>:检测响应内空的确切字符串
rstring <regex>检测响应内容的匹配字符串
http-check expect status 200 //响应状态码为200时进行检测
http-check expect ! string SQL\ Error //响应内容为非”SQL Error”进行检测
http-check expect ! rstatus ^5 //这个是非以5开头的响应码
http-check expect rstring <!–tag:[0-9a-f]</html> //检测在html之前是否有正确的十六进制标签
http-request:七层访问控制
http-request { allow | deny | tarpit | auth [realm <realm>] | redirect <rule> |
add-header <name> <fmt> | set-header <name> <fmt> |
del-header <name> | set-nice <nice> | set-log-level <level> |
replace-header <name> <match-regex> <replace-fmt> |
replace-value <name> <match-regex> <replace-fmt> |
set-tos <tos> | set-mark <mark> |
add-acl(<file name>) <key fmt> |
del-acl(<file name>) <key fmt> |
del-map(<file name>) <key fmt> |
set-map(<file name>) <key fmt> <value fmt>
}
[ { if | unless } <condition> ]
http-request replace-header Cookie foo=([^;]);(.) foo=\1;ip=%bi;\2
http-request replace-value X-Forwarded-For ^192.168.(.)$ 172.16.\1
acl nagios src 192.168.129.3
acl local_net src 192.168.0.0/16
acl auth_ok http_auth(L1)
http-request allow if nagios
http-request allow if local_net auth_ok
http-request auth realm Gimme if local_net auth_ok
http-request deny
acl auth_ok http_auth_group(L1) G1
http-request auth unless auth_ok
http_ response:修改响应报文
http-response { allow | deny | add-header <name> <fmt> | set-nice <nice> |
set-header <name> <fmt> | del-header <name> |
replace-header <name> <regex-match> <replace-fmt> |
replace-value <name> <regex-match> <replace-fmt> |
set-log-level <level> | set-mark <mark> | set-tos <tos> |
add-acl(<file name>) <key fmt> |
del-acl(<file name>) <key fmt> |
del-map(<file name>) <key fmt> |
set-map(<file name>) <key fmt> <value fmt>
}
[ { if | unless } <condition> ]
log:日志配置
log global //调用全局配置中的日志存储
log <address> [len <length>] <facility> [<level> [<minlevel>]] //自定义日志
no log //不启用日志
log global
log 127.0.0.1:514 local0 notice
log 127.0.0.1:514 local0 notice notice
log ${LOCAL_SYSLOG}:514 local0 notice
maxconn <conns>:指定配置HAProxy前端的最大并发连接
option forwardfor [ except <network> ] [ header <name> ] [ if-none ]:开启报文头部的X-Forwarded-For选项
backend www
mode http
option forwardfor header X-Client
redirect location <loc> [code <code>] <option> [{if | unless} <condition>]
redirect prefix <pfx> [code <code>] <option> [{if | unless} <condition>]
redirect scheme <sch> [code <code>] <option> [{if | unless} <condition>]
reqadd:在请求报文头部添加信息
reqadd <string> [{if | unless} <cond>]
repadd:在响应报文头部添加信息
reqdel:在请求报文头部添加信息
repdel:在响应报文头部删除信息
server:在backend中申明一个服务器
server <name> <address>[:[port]] [param*]
param:
maxconn:当前server最大连接数
backlog <backlog>:连接达到最大数的后援队列长度
backup:将此服务器定义为sorryserver
check:地当前server进行健康检测
addr:对地址进行检测
port:对端口进行检测
inter <delay>:检测时的延迟
rise <count>:连续多少次成功才会标记服务可用,默认为2
fall <count>:连续多少次失败才会标记失败,默认为3
cookie <value>:为当前server指定其cookie值,用于实现基于cookie的会话黏性;
disabled:标记为不可用;
redir <prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL;
weight <weight>:权重,默认为1;
server first 10.1.1.1:1080 cookie first check inter 1000
server second 10.1.1.2:1080 cookie second check inter 1000
server transp ipv4@
server backup ${SRV_BACKUP}:1080 backup
server www1_dc1 ${LAN_DC1}.101:80
server www1_dc2 ${LAN_DC2}.101:80
stats enable:开启状态页
stats admin { if | unless } <cond>:定义状态页可以由那此主机登陆
stats admin if localhost
stats auth <user>:<passwd>:认证时的账号和密码,可使用多次;
stats uri <prefix>:自定义stats page uri
stats refresh <delay>:设定自动刷新时间间隔;
stats realm <string>:配置一个输入提示
配置示例:
listen stats
bind :9099
stats enable
stats realm HAPorxy\ Stats\ Page
stats auth admin:admin
stats admin if TRUE
HAProxy实现的动静分离,使用keepalived实现其高可用性,使用stats page对HAProxy进行管理
拓扑图:
此环境配置分为四大步
配置backend
配置frondend
配置keepalived
配置全栈ssl
配置backend
配置node3:
yum -y install httpd php php-mysql showmount //安装相关包
vim /etc/httpd/conf/httpd.conf
#DocumentRoot “/var/www/html”
vim /etc/httpd/conf.d/vhost.conf
<Directory /data>
Allowoverride none
require all granted
</Directory>
Listen *:8080
DirectoryIndex index.php index.html
<Virtualhost *:80>
Documentroot /data/static
</Virtualhost>
<Virtualhost *:8080>
Documentroot /data/dynamic
</Virtualhost>
mkdir /data/{static,dynamic} -p
vim /data/static/index.html
<h1>Web1:172.18.250.38</h1>
vim /data/dynamicl/index.php
<?php
echo “172.18.250.38”;
phpinfo();
?>
systemctl start httpd
配置node4
yum -y install httpd php php-mysql mariadb-server //安装相关包
vim /etc/httpd/conf/httpd.conf
#DocumentRoot “/var/www/html”
vim /etc/httpd/conf.d/vhost.conf
<Directory /data>
Allowoverride none
Require all granted
</Directory>
Listen *:8080
DirectoryIndex index.php index.html
<Virtualhost *:80>
Documentroot /data/static
</Virtualhost>
<Virtualhost *:8080>
Documentroot /data/dynamic
</Virtualhost>
mkdir /data/{static,dynamic} -p
vim /data/static/index.html
<h1>Web2:172.18.251.103</h1>
vim /data/dynamicl/index.php
<?php
echo “172.18.251.103”;
phpinfo();
?>
systemctl start httpd
配置frondend:
配置node1:
yum -y install httpd haproxy
vim /var/www/html/index.html
<h1>I’m sorry</h1>
vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats_web *:3303
stats enable
stats realm HAProxy\ Basic
stats refresh 5s
stats uri /admin?stats
stats auth admin:admin
stats admin if TRUE
frontend main *:80
acl dynamic_web path_end .php
use_backend static if ! dynamic_web
use_backend dynamic if dynamic_web
backend static
balance roundrobin
server static1 172.18.250.38:80 check
server static2 172.18.251.103:80 check
server sorry_web1 127.0.0.1:8080 check backup
backend dynamic
balance roundrobin
server dynamic1 172.18.250.38:8080 check
server dynamic2 172.18.250.38:8080 check
server sorry_web2 127.0.0.1:8080 check backup
systemctl start haproxy
vim /etc/httpd/conf/httpd.conf
#Listen 80
Listen 8080
配置LVS_RS脚本,如下,两个节点相同
#!/bin/bash
VIP=”172.18.35.105″
netmask=”255.255.255.255″
device=”enp0s3″
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 $VIP netmask $netmask broadcast $VIM up
route add -host $VIP dev lo:0
;;
stop)
ifconfig lo:0 down
route del -host $VIP dev lo:0
;;
*)
echo “Usage $(basename $0) {start|stop}”
;;
esac
配置node2:
yum -y install haproxy httpd
vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats_web *:3303
stats enable
stats realm HAProxy\ Basic
stats auth admin:admin
stats uri /admin?stats
stats refresh 5s
stats admin if TRUE
frontend main *:80
acl dynamic_web path_end .php
use_backend dynamic if dynamic_web
use_backend static if ! dynamic_web
backend static
balance roundrobin
server static1 172.18.250.38:80 check
server static2 172.18.251.103:80 check
server sorry_web1 127.0.0.1:8080 check backup
backend dynamic
balance roundrobin
server dynamic1 172.18.250.38:8080 check
server dynamic2 172.18.251.103:8080 check
server sorry_web1 127.0.0.1:8080 check backup
service haproxy start
vim /etc/httpd/conf/httpd.conf
#Listen 80
Listen 8080
service httpd start
配置keepalived:
配置node6
yum -y install keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
sysadmin@firewall.loc
}
notification_email_from root@localhost.con
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id CentOS7-node5
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.35.105
}
}
virtual_server 172.18.35.105 80 {
delay_loop 6
lb_algo wrr
lb_kind dr
nat_mask 255.255.255.255
protocol TCP
real_server 172.18.252.96 80 {
weight 1
}
real_server 172.18.250.37 80 {
weight 1
}
}
virtual_server 172.18.35.105 3303 {
delay_loop 6
lb_algo wrr
lb_kind dr
nat_mask 255.255.255.255
protocol TCP
real_server 172.18.252.96 3303 {
weight 1
}
real_server 172.18.250.37 3303 {
weight 1
}
}
配置node6:
yum -y install keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
}
notification_email_from root@localhost.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id CentOS7-node6
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.35.105
}
}
virtual_server 172.18.35.105 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
protocol TCP
real_server 172.18.252.96 80 {
weight 1
}
real_server 172.18.250.37 80 {
weight 1
}
}
virtual_server 172.18.35.105 3303 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
protocol TCP
real_server 172.18.252.96 3303 {
weight 1
}
real_server 172.18.250.37 3303 {
weight 1
}
}
原创文章,作者:gaomei,如若转载,请注明出处:http://www.178linux.com/76267