Haproxy安装与配置html
有关高负载均衡的软件,目前使用比较多的是haproxy、nginx和lvs。下面咱们就开始学习haprxoy这款软件。前端
haproxy提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费、快速而且可靠的一种解决方案。node
haproxy特别适用于那些负载特别大的web站点,这些站点一般又须要会话保持或七层处理。haproxy运行在时下的硬件上,彻底能够支持数以万计的并发链接,而且它的运行模式使得它能够很简单安全的整合进您当前的架构中,同时能够保护你的web服务器不被暴露到网络上。linux
haproxy实现了一种事件驱动、单一进程模型,此模型支持很是大的并发链接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,不多能处理数千并发链接。ios
事件驱动模型由于在有更好的资源和时间管理的用户端(User-Space)实现全部这些任务,因此没有这些问题。此模型的弊端是,在多核系统上,这些程序一般扩展性较差。这就是为何他们必须进行优化以使每一个CPU时间片(Cycle)作更多的工做。nginx
gongji
蠕虫(attack bots),也就是说限制它们的链接打开从而限制它们的危害。这个已经为一个陷于小型DDoSgongji
的网站开发了并且已经拯救了不少站点,这个优势也是其它负载均衡器没有的。内核版本:3.10.0-862
架构:x86_64
系统版本:CentOS Linux release 7.5.1804 (Core)
HAproxy版本:haproxy-1.8.19.tar.gz
安装方式:源码编译
安装路径:/usr/local/haproxy/
官方文档:https://www.haproxy.org/#docs
下载路径:https://www.haproxy.org/#downgit
CentOS 6.*
和CentOS 7
安装的Haproxy版本同样github
[root@node1 ~]# yum install haproxy # base源 [root@node1 ~]# haproxy -v HA-Proxy version 1.5.18 2016/05/10 Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>
安装 Software Collections (SCL) repository 源以获取最新版本的haproxyweb
sudo yum install centos-release-scl -y
安装haproxy:访问慢redis
sudo yum install rh-haproxy18-haproxy rh-haproxy18-haproxy-syspaths -y
开启:systemctl start rh-haproxy18-haproxy
中止:systemctl stop rh-haproxy18-haproxy
开机启动:systemctl enable rhhaproxy18-haproxy
groupadd --system haproxy #添加haproxy的组 useradd --system -M -g haproxy haproxy -s /sbin/nologin #建立haproxy的系统帐户到haproxy的组,可是禁止其登录系统。
[root@node1 opt]# yum install gcc make -y # 安装编译工具 [root@node1 opt]# wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.19.tar.gz [root@node1 opt]# tar xf haproxy-1.8.19.tar.gz [root@node1 opt]# cd haproxy-1.8.19 [root@node1 haproxy-1.8.19]# uname -r 3.10.0-862.el7.x86_64 [root@node1 haproxy-1.8.19]# more README # 查看安装说明 ... ... 38 - linux22 for Linux 2.2 39 - linux24 for Linux 2.4 and above (default) 40 - linux24e for Linux 2.4 with support for a working epoll (> 0.21) 41 - linux26 for Linux 2.6 and above 42 - linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy) 43 - solaris for Solaris 8 or 10 (others untested) 44 - freebsd for FreeBSD 5 to 10 (others untested) 45 - netbsd for NetBSD 46 - osx for Mac OS/X 47 - openbsd for OpenBSD 5.7 and above 48 - aix51 for AIX 5.1 49 - aix52 for AIX 5.2 50 - cygwin for Cygwin 51 - haiku for Haiku 52 - generic for any other OS or version. 53 - custom to manually adjust every setting ... ... 要构建haproxy,必须在上面操做系统中选择目标操做系统 并将其分配给TARGET变量: 个人内核是3.10.0,选择linux2628 [root@node1 haproxy-1.8.19]# make TARGET=linux2628 ARCH=x86_64 prefix=/usr/local/haproxy # TARGET指定内核版本,ARCH指定CPU架构,PREFIX指haprxoy的安装路径。 [root@node1 haproxy-1.8.19]# make install PREFIX=/usr/local/haproxy [root@node1 haproxy-1.8.19]# ll /usr/local/haproxy/ 总用量 0 drwxr-xr-x 3 root root 21 3月 22 17:50 doc drwxr-xr-x 2 root root 21 3月 22 17:50 sbin drwxr-xr-x 3 root root 17 3月 22 17:50 share [root@node1 haproxy-1.8.19]# cp -a examples /usr/local/haproxy/ # 拷贝一些模板;
mkdir -pv /usr/local/haproxy/conf/ready/{tcp,http} # 为多配置文件准备,省略; mkdir -pv /usr/local/haproxy/conf/enabled/{tcp,http} # 为多配置文件准备,省略; mkdir -pv /usr/local/haproxy/logs mkdir -pv /etc/haproxy #建立配置目录 mkdir -pv /usr/share/haproxy/ #防止启动出错 touch /usr/local/haproxy/conf/haproxy.cfg #建立配置文件 ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件
[root@node1 haproxy-1.8.19]# /usr/local/haproxy/sbin/haproxy -v HA-Proxy version 1.8.19 2019/02/11 Copyright 2000-2019 Willy Tarreau <willy@haproxy.org>
复制haproxy文件到/usr/sbin下
由于下面的haproxy.init启动脚本默认会去/usr/sbin下找。
[root@node1 haproxy-1.8.19]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
添加到系统服务并开机自启动
[root@node1 haproxy-1.8.19]# cp ./examples/haproxy.init /etc/init.d/haproxy [root@node1 haproxy-1.8.19]# chmod 755 /etc/init.d/haproxy [root@node1 haproxy-1.8.19]# chkconfig --add haproxy [root@node1 haproxy-1.8.19]# chkconfig haproxy on [root@node1 haproxy-1.8.19]# chkconfig --list|grep haproxy 注:该输出结果只显示 SysV 服务,并不包含 原生 systemd 服务。SysV 配置数据 可能被原生 systemd 配置覆盖。 要列出 systemd 服务,请执行 'systemctl list-unit-files'。 查看在具体 target 启用的服务请执行 'systemctl list-dependencies [target]'。 haproxy 0:关 1:关 2:开 3:开 4:开 5:开 6:关
服务管理:
启动:service haproxy start 中止:service haproxy stop 重载:service haproxy restart 状态:service haproxy status 检查:service haproxy test
处理一个报错
[root@node1 haproxy-1.8.19]# service haproxy status /etc/init.d/haproxy: 第 26 行:[: =: 期待一元表达式 ● haproxy.service - SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments. Loaded: loaded (/etc/rc.d/init.d/haproxy; bad; vendor preset: disabled) Active: inactive (dead) Docs: man:systemd-sysv-generator(8) [root@node1 haproxy-1.8.19]# vim +26 /etc/rc.d/init.d/haproxy 26 [ ${NETWORKING} = "no" ] && exit 0 改成: 26 [ "${NETWORKING}" = "no" ] && exit 0
官方文档:
https://cbonte.github.io/haproxy-dconv/1.8/configuration.html
熟悉 Nginx 和 Apache 的朋友都知道,这两个 Webservice 都支持 include 加载多个配置文件的语法,可是 Haproxy 并不支持!若是现网映射规则很是多,那么 haproxy.cfg 这个配置文件就很长!
Hparoxy 实现多配置文件的方案,可是不是 include 语法,而是在启动的时候屡次使用-f 拼接配置文件,好比:
cd /usr/local/haproxy/sbin ./haproxy -f ../conf/haproxy.cfg -f ../conf/ext1.cfg -f ../conf/ext2.cfg
所以,咱们能够在配置文件目录以及启动脚本上作点改变,让 Haproxy 支持多配置文件。
路径约定:
Haproxy配置中分红五部份内容,固然这些组件不是必选的,能够根据须要选择做为配置。
• global:参数是进程级的,一般和操做系统(OS)相关。这些参数通常只设置一次,若是配置无误,就不须要再次配置进行修改;
• default:配置默认参数的,这些参数能够被利用配置到frontend,backend,listen组件;
• frontend:接收请求的前端虚拟节点,Frontend能够根据规则直接指定具体使用后端的backend(可动态选择);
• backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器;
• listen:Frontend和Backend的组合体;经过关联“前端”和“后端”定义了一个完整的代理,一般只对TCP流量有用。
主配置:/usr/local/haproxy/haproxy.cfg文件
[root@node1 ~]# vim /usr/local/haproxy/conf/haproxy.cfg #configure haproxy.cfg # 全局配置 global log 127.0.0.1 local0 # 设置日志 log 127.0.0.1 local1 notice maxconn 4000 # 最大链接数 chroot /usr/local/haproxy # 安装目录 user haproxy group haproxy daemon # 守护进程运行 #nbproc 1 # 进程数量,只能用于守护进程模式的haproxy;默认启动一个进程,通常只在单进程仅能打开少数文件描述符的场景中才使用多进程模式; pidfile /var/run/haproxy.pid # 默认配置 defaults log global mode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK option httplog # http 日志格式 option dontlognull # 不记录健康检查日志信息; option redispatch # serverId对应的服务器挂掉后,强制定向到其余健康的服务器 option http-server-close #option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接; #option forwardfor # 若是后端服务器须要得到客户端真实ip须要配置的参数,能够从Http Header中得到客户端ip; #option httpclose # 主动关闭http通道,每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现; balance roundrobin # 负载均衡算法,轮询; retries 3 # 重试次数; timeout http-request 10s # 客户端创建链接但不请求数据时,关闭客户端链接; timeout queue 1m # 等待最大时长; timeout connect 10s # 定义haproxy将客户端请求转发至后端服务器所等待的超时时间; timeout client 1m # 客户端非活动状态的超长时间(默认毫秒) timeout server 1m # 客户端与服务器创建链接后,等待服务器端的超时时长(默认毫秒) timeout http-keep-alive 10s # 定义保持链接的超时时长; timeout check 10s # 心跳检测超时; maxconn 3000 # 每一个server最大的链接数; # 统计页面配置 listen admin_stats bind 0.0.0.0:50000 # 监听IP和端口,为了安全能够设置本机的局域网IP及端口; mode http option httplog # 采用http日志格式 stats refresh 30s # 统计页面自动刷新时间 stats uri /haproxy?stats # 状态管理页面,经过/haproxy?stats来访问 stats realm Haproxy Manager # 统计页面密码框上提示文本 stats auth admin:psadmin # 统计页面用户名和密码设置 #stats hide-version # 隐藏统计页面上HAProxy的版本信息 #errorfile 403 /usr/local/haproxy/examples/errorfiles/ #设置haproxy 错误页面 #前端配置 frontend http_main bind 0.0.0.0:80 # http请求的端口,会被转发到设置的ip及端口 # 转发规则 #acl url_yuming path_beg www.yuming.com #use_backend server_yuming if url_yuming # 默认跳转项,当上面都没有匹配上,就转到backend的http_default上; default_backend http_default # 提高失败的时候的用户体验 #errorfile 502 /usr/local/haproxy/examples/errorfiles/502.http #errorfile 503 /usr/local/haproxy/examples/errorfiles/503.http #errorfile 504 /usr/local/haproxy/examples/errorfiles/504.http # 后端配置 backend http_default # 额外的一些设置,按需使用 option forwardfor option forwardfor header Client-IP option http-server-close option httpclose # 负载均衡方式 #source 根据请求源IP #static-rr 根据权重 #leastconn 最少链接先处理;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的, #uri 根据请求的uri #url_param 根据请求的url参数 #rdp-cookie 据据cookie(name)来锁定并哈希每一次请求 #hdr(name) 根据HTTP请求头来锁定每一次HTTP请求 #roundrobin 轮询方式 balance roundrobin # 负载均衡的方式,轮询方式 # 设置健康检查页面 #option httpchk GET /index.html #传递客户端真实IP option forwardfor header X-Forwarded-For # 须要转发的ip及端口 # inter 2000 健康检查时间间隔2秒 # rise 3 检测多少次才认为是正常的 # fall 3 失败多少次才认为是不可用的 # weight 30 权重 server node1 192.168.1.101:8080 check inter 2000 rise 3 fall 3 weight 30 server node2 192.168.1.101:8081 check inter 2000 rise 3 fall 3 weight 30
多配置模式中,多个 frontend 必须绑定不一样的 IP 或者端口,不然数据会串,致使映射到不一样的后端而报错。所以,同一个 IP+端口下的映射务必配置到同一个 frontend 模块内。
前端配置frontend中
acl url_yuming path_beg www.yuming.com use_backend yuming if url_yuming
当www.yuming.com
访问时,会转发给后端backend的yuming项目;可用于一下几种配置:
域名跳转:客户端经过访问某个域名跳转到跳转指定服务器或者其余域名;
IP地址跳转:客户端访问指定IP地址时,转发到后端IP;
端口跳转:客户端经过域名加端口访问时,转发到后端IP和端口;
动静分离:
默认跳转:客户端访问时,若是其它规则都不匹配,默认转发到后端IP和端口;
多ACL匹配:当指定客户端(根据IP匹配)访问某一个域名或者IP时,默认转发到后端IP和端口;
vim /etc/rsyslog.conf # 取消以下2行注释 $ModLoad imudp $UDPServerRun 514 # 新增配置:local 1~7 –自定义的日志设备 local7.* /var/log/haproxy.log
重启syslog服务
# centos 6.* service rsyslog restart # CentOS 7.* systemctl restart rsyslog
[root@node1 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg [root@node1 ~]# ps -ef |grep haproxy |grep -v grep root 6950 1 0 19:35 ? 00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
或者
[root@node1 ~]# service haproxy start Starting haproxy (via systemctl): [ 肯定 ] [root@node1 ~]# ps -ef |grep haproxy |grep -v grep haproxy 4383 1 0 15:53 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
haproxy参数说明
-v 显示版本; -vv 显示已知的构建选项。 -f 指定配置文件启动; -p 指定pid文件; -d 进入调试模式; -db 仅禁用后台模式。 -dM [<byte>] 使用<byte>中毒内存(默认为0x50) -V 进入详细模式(禁用安静模式) -D 去守护进程; -C 在加载文件以前更改成<dir>。 -q quiet mode:不显示消息 -c check mode:只检查配置文件并退出 -n 设置最大链接数(2000) -m 限制可用内存量(以MB为单位) -N 设置默认的每代理最大链接数(2000) -L 设置本地对等名称(默认为hostname) -p 将全部子项的pid写入此文件 -de 即便在可用时也禁用epoll()用法 -dp 即便在可用时也禁用poll()用法 -dS 禁用拼接使用(在旧内核上断开) -dG 禁用getaddrinfo()用法 -dV 在服务器端禁用SSL验证 -sf/-st [pid]* 完成/终止旧的pid。必须是最后的论点。
URL:http://$IP:80
建议把上面两个转发改成不一样的页面,不停刷新,查看是否有页面切换;
URL:http://$IP:50000/haproxy?stats
username:admin
password:psadmin
haproxy监控后台服务器的状况如图:
http://www.javashuo.com/article/p-qxlniskh-dn.html
http://www.ttlsa.com/linux/haproxy-study-tutorial/