haproxy安装不算很难,haprox官方base源已经被收录,也可以使用源码编译。
yum install haproxy -y
安装开发环境
yum groupinstall "development tools" -y
下载源码包
wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-1.8.12.tar.gz/sha512/2b782a54988cc88d1af0e5f011af062910e8fac28eab13db7e05a58d0d23961f827da47e3871e8d081f5a2d222588480d81dec2e9f14ec9f54a1c3cb5bf3d56a/
解压并安装
tar -xvf haproxy-1.8.12.tar.gz
cd haproxy-1.8.12
#获取内核版本信息
uname -r
# TARGET=linux310,内核版本,使用uname -r来查看
# ARCH指明系统的位数
# PREFIX指明安装的路径
make TARGET=linux310 ARCH=x86_64 PREFIX=/usr/local/haproxy (#此处TARGET=linux26是填写系统内核版本 uname -r ,如版本是3.10.0-693.2.2.el7.x86_64, 直接填写26即可。)
make install PREFIX=/usr/local/haproxy
准备配置文件
#创建对应目录
mkdir /usr/local/haproxy/conf
#创建配置文件
cd /usr/local/haproxy/conf
vim haproxy.cfg
如果没有yum安装的配置文件,从可以实现下面的命令来获取配置文件:
cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
PS: haproxy安装完成后,默认安装目录中没有配置文件,这里是将源码包里面的示例配置文件拷贝到配置文件目录
这样,HAProxy就安装完成了。
添加用户
useradd -r -s /usr/sbin/nologin haproxy
启动haproxy
# -f指明配置文件,配置文件一定要写对,否则无法启动haproxy
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
全局配置段(global):(建议不做改动,会自动调整)
代理配置段(proxies):
6. defaults段:默认参数的配置段,在本段配置的参数值,默认会被自动引用到之后的frontend段,backend段和listen段,所以,如果某些参数属于公用的配置段,那么可以在default段进行配置即可。如果在frontend段,backend段和listen段进行配置的参数同时在default也有相应参数配置的话,default段的配置会被覆盖掉。
7. frontend段:本段负责配置接收用户请求的虚拟前端节点。类似于nginx的server{}部分。
8. backend段:本段用于设置集群后端服务器集群的配置,也就是用来定义一组真实服务器,来处理用户发出的请求。添加的真实服务器类似于LVS中的real-server,相当于nginx中的 upstream {}段
9. listen段:同时用来负责配置前端和happ后端。
里面用到的时间变量
时间格式,默认为毫秒
us 微秒1/1000000秒
ms 毫秒1/1000秒
s 秒
m 分钟
h 小时
d 天
global配置段
global
maxconn 20000 #设定每个haproxy进程可以接受的最大并发连接数
ulimit-n 16384 #设置最大打开的文件描述符数,在1.4的官方文档中提示,该值会自动计算,所以不建议进行设置
log 127.0.0.1 local0 #全局日志文件配置条目,local2表示日志设备,最多可定义两个
uid 200
gid 200
user haproxy #指定运行haproxy的用户和组
chroot /var/lib/haproxy #chroot 切换根目录,将haproxy都运行在/var/lib/haproxy 这样做是为了增加haproxy的安全
pidfile /var/run/haproxy.pid #指定haproxy的进程pid文件,启动进程的用户必须要有访问该文件的权限。
nbproc 2 #要启动的haproxy的进程数量
daemon #设置haproxy以后台运行的方式运行。
#常用配置项
log: 全局日志文件配置条目,local2表示日志设备,最多可定义两个
nbproc:要启动的haproxy的进程数量
chroot: chroot 切换根目录,将haproxy都运行在/var/lib/haproxy 这样做是为了增加haproxy的安全。
pidfile:指定haproxy的进程pid文件,启动进程的用户必须要有访问该文件的权限。
maxconn:设定每个haproxy进程可以接受的最大并发连接数。
user和group:指定运行haproxy的用户和组
daemon: 设置haproxy以后台运行的方式运行。
maxconnrate:每个进程每秒最大处理的连接数量。
maxse***ate:每个进程每秒可以创建的最大会话速率。
maxsslconn:设定每个haproxy进程所能接受的ssl最大并发连接数。
default配置段
defaults
mode http #设置haproxy实例默认的运行模式,默认是http,支持tcp,http可选值
log global #继承全局日志
maxconn 20000 #最大连接数
option httplog # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录“时间[Jan 5 13:23:46] 日志服务器[127.0.0.1]
#实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很简单。
option http-server-close #客户端与服务器端在完成一次连接请求之后,HAProxy会主动关闭该TCP连接,有助于提高性能。
option forwardfor except 127.0.0.0/8 #由于haprxoy工作在反向代理方向,因此后端的真实服务器可能无法获取真实的请求端ip,使用xforwardfor可以在报文中封装新的字段记录请求端ip,httpd的话要在默认日志格式中进行修改才可以记录。
option redispatch # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,
#如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。#
option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
#官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来#
stats refresh 30 #统计页面刷新间隔
retries 3 #定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
balance roundrobin #默认的负载均衡的方式,这里为轮询方式,也可以是balance source
timeout http-request 10s #http请求超时时间
timeout queue 1m #排队超时
timeout connect 10s # 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,老版本haproxy使用contimeout替代
timeout client 1m #设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,老版本haproxy使用clitimeout替代
timeout server 1m # 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,老版本haproxy使用srvtimeout替代
timeout http-keep-alive 10s
timeout check 10s #心跳检测超时
#常用配置项
mode:设置haproxy实例默认的运行模式,默认是http,支持tcp,http可选值
tcp模式:在该模式之下,客户端会与服务器端建立一个全双工连接,不对七层报文做检查,常用语ssl,ssh,smtp等服务。
http模式:客户端在请求转发到后端服务器之前会被分析。
log global:继承全局日志
option dontlognull:保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
option http-server-close:客户端与服务器端在完成一次连接请求之后,HAProxy会主动关闭该TCP连接,有助于提高性能。
xforwardfor:由于haprxoy工作在反向代理方向,因此后端的真实服务器可能无法获取真实的请求端ip,使用xforwardfor可以在报文中封装新的字段记录请求端ip,httpd的话要在默认日志格式中进行修改才可以记录。
redispatch:是否允许在session 失败后重新分配。
retries:设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,haproxy将会将对应的后端服务器设置为不可用状态。
timeout connect: 成功连接到一台服务器的最长等待时间,默认为毫秒,可以换用其他单位。
timeout client:连接客户端发送数据的最长等待时间,默认毫秒,可修改。
timeout server:服务器端回应客户端数据发送的最长等待时间,默认毫秒,可以修改。
timeout check:设置对后端服务器的检测超时时间,默认毫秒,可以修改
bind :80,:443 同时监听2个端口(之间不能有空格,监听端口要重启服务)
bind ip:port,ip:port
bind /var/****.sock 使用套接字文件
roundrobin:轮询,依次访问每一个后端ip(短连接和无状态的连接推荐使用rr算法)
server options: weight # 支持配置权重
动态算法:支持权重的运行时调整,支持慢启动;每个后端中最多支持4095个server;
static-rr:静态算法:不支持权重的运行时调整及慢启动;后端主机数量无上限;
配置文件:
前端
frontend web_server #定义前端名称,可自定义。
bind 0.0.0.0:80 #监听IP地址与端口
后端
backend server_web #后端名称
mode http #http七层模式
balance roundrobin #负载均衡的方式
option ignore-persist {if | unless} <condition> #在某些条件下拒绝持续连接,适用于静态文件的负载均衡。
option independant-streams #启用双向超时处理,如socket的read和write
option log-health-checks #记录健康检查日志
option log—separate—errors #对非完全成功的连接改变日志记录等级
option logasap #传输大文件时可以提前记录日志
option mysql-check #mysql健康检查
option persist #强制将http请求发往已经down掉的server
option redispatch #是否允许重新分配在session失败后
option smtpchk #smtp检查
option httpchk #通过http协议进行健康检查
option socket-stats #允许对单个socket进行统计
option srvtcpka #是否允许向server发送 keepalive
option tcpka #是否允许向 server和 client发送 keepalive
option tcplog #允许记录tcp连接的状态和时间
option transparent #允许客户端透明代理
option httpchk GET /1b.html HTTP/1·0 #心跳检测的文件
tick-table type ip size 1024 #为当前后端配置粘性表;表存储条目类型为IP地址,允许存储1k大小的IP地址
stick on dst #定义一个请求模式dst,以将一个客户端同某个后端服务器关联起来
timeout server 90m #后端服务器最大等待时间,超过此时间则认为服务器不可用。
如下进行多后端服务器定义, check inter 1500是检测心跳频率, rise 3表示3次检查结果正确则认为服务器可用,fall 3表示检测结果失败3次则认为服务器不可用, weight代表服务器权重。port 9200表示通过端口9200来进行基于 http的健康检查, backup表示该服务器是备份服务器,只有在其他非 backup服务器均不可用的情况下负载均衡器才会使用该后端服务器,默认情况下使用第一个标记为 backup的后端服务器, on-marked-down shutdown-sessions表示当该服务器被认为是 shutdown的时候,关闭全部与该服务器的请求连接。
server 192.168.51.78 192.168.151.78:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions
server 192.168.51.79 192.168.151.79:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions
server 192.168.51.80 192.168.151.80:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions
启动时报如下警告
[WARNING] 102/151915 (11151) : Proxy ‘http_gsres‘: in multi-process mode, stats will be limited to process assigned to the current request.
解决方案:
nbproc进程设置为1则不会提示,如果想去掉这个提示可以修改编译文件即可。 在源码配置src/cfgparse.c找到如下行
if (nbproc > 1) { if (curproxy->uri_auth) { - Warning(“Proxy ‘%s’: in multi-process mode, stats will be limited to process assigned to the current request.\n”, + Warning(“Proxy ‘%s’: in multi-process mode, stats will be limited to the process assigned to the current request.\n”,
调整nbproc > 1数值即可。
haproxy启动报错Starting proxy : cannot bind socket
解决方案
查看haproxy.conf配置文件
发现其监听80跟apache或nginx冲突,而apache或nginx没在使用,关闭或者卸载。
查看netstat -ntpl
如果有80端口,说明80被占用了,只需要找到程序关闭即可,一般是apache的进程
/usr/local/apache/bin/apachectl stop
再执行:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
就可以了!
[/usr/local/haproxy/sbin/haproxy.main()] Cannot chroot1(/var/lib/haproxy).
解决方案:
将chroot指定文件改为/usr/local/haproxy 或者 注释掉
[/usr/local/haproxy/sbin/haproxy.main()] FD limit (16384) too low for maxconn=20000/maxsock=40022. Please raise ‘ulimit-n’ to 40022 or more to avoid any trouble.
暂时未找到,希望有人能在评论提供
[ALERT] 014/193706 (2346) : parsing [/usr/local/haproxy/conf/haproxy.cfg:11] : user/uid already specified. Continuing.
解决方案:
注释掉user haproxy