最近我在负责一个统一接入层的建设项目,涉及到 Haproxy 和 ospf 的运维部署,本文分享一下我在部署 Haproxy 之后整理的运维部署规范,并实现了Haproxy 的多配置文件管理方案。

一、部署安装

1、下载源码包

最新 stable 版本下载地址:http://www.haproxy.org/download/1.7/src/haproxy-1.7.9.tar.gz

2、编译安装

  1. tar zxf haproxy-1.7..tar.gz
  2. cd haproxy-1.7.
  3. make TARGET=linux31 prefix=/usr/local/haproxy
  4. make install PREFIX=/usr/local/haproxy

3、创建目录

  1. mkdir-p/usr/local/haproxy/conf/ready/tcp
  2. mkdir-p/usr/local/haproxy/conf/ready/http
  3. mkdir-p/usr/local/haproxy/conf/enabled/tcp
  4. mkdir-p/usr/local/haproxy/conf/enabled/http
  5. mkdir-p/usr/local/haproxy/logs
  6. mkdir-p/data/wwwlogs/logs

二、软件配置

熟悉 Nginx 和 Apache 的朋友都知道,这两个 Webservice 都支持 include 加载多个配置文件的语法,但是 Haproxy 并不支持!如果现网映射规则非常多,那么 haproxy.cfg 这个配置文件就跟臭袜子一样,又臭又长!

因此,我也是翻遍了国外的各种论坛帖子,终于发现一种变相实现 Haproxy 多配置文件的方案。其实,Hparoxy 是支持多配置文件的,但是不是 include 语法,而是在启动的时候多次使用-f 拼接配置文件,比如:

  1. cd/usr/local/haproxy/sbin
  2. ./haproxy-f../conf/haproxy.cfg-f../conf/ext1.cfg-f../conf/ext2.cfg

因此,我们可以在配置文件目录以及启动脚本上做点改变,让 Haproxy 支持多配置文件。

1、路径约定:

  • 待上线的 tcp 映射规则存放目录:/usr/local/haproxy/conf/ready/tcp
  • 待上线的 http 映射规则存放目录:/usr/local/haproxy/conf/ready/http
  • 已上线的 tcp 映射规则存放目录:/usr/local/haproxy/conf/enabled/tcp
  • 已上线的 http 映射规则存放目录:/usr/local/haproxy/conf/enabled/http
  • Ps:本文为多配置模式,enabled 里面的配置为软链接形式,软链接至 ready 对应配置文件,方便管理。

2、配置模板

①、主配置:haproxy.cfg

  1. #configure haproxy.cfg
  2. global
  3. log127.0.0. local0
  4. maxconn4096 #最大连接数
  5. chroot/usr/local/haproxy#安装目录
  6. uid99 #用户nobody
  7. gid99 #组nobody
  8. daemon #守护进程运行
  9. nbproc1 #进程数量
  10. pidfile/usr/local/haproxy/logs/haproxy.pid#haproxy pid
  11.  
  12. defaults
  13. log global
  14. mode http #7层 http;4层tcp 如果要让haproxy支持虚拟主机,mode 必须设为http
  15. option httplog #http 日志格式
  16. log127.0.0.1local6
  17. option httpclose #主动关闭http通道
  18. option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
  19. retries1
  20. option dontlognull
  21. maxconn2000 #最大连接数
  22. timeout connect #连接超时(毫秒)
  23. timeout client #客户端超时(毫秒)
  24. timeout server #服务器超时(毫秒)
  25.  
  26. frontend default
  27. option httplog
  28. option httpclose
  29. bind0.0.0.:
  30. # 状态页面规则
  31. acl haproxy_stats path_beg/haproxy
  32. use_backend haproxy_stats ifhaproxy_stats
  33. # 其他
  34. # default_backend default_server
  35. # 提升失败的时候的用户体验
  36. #errorfile /usr/local/haproxy/html/maintain.html
  37. #errorfile /usr/local/haproxy/html/maintain.html
  38. #errorfile /usr/local/haproxy/html/maintain.html
  39.  
  40. # 状态页面
  41. backend haproxy_stats
  42. stats uri/haproxy
  43. stats enable
  44. stats refresh60s
  45. #stats auth admin:admin # 状态页面认证配置
  46. stats admin ifTRUE

②、http 扩展配置文件模板

  1. frontend demo
  2. option httplog
  3. option httpclose
  4. bind192.168.1.:# 扩展
  5. # 域名匹配范例
  6. acl is_demo hdr_beg(host)-idemo.oa.com
  7. # 正则范例范例
  8. acl is_demo_rex hdr_reg(host)-i^demo[-].oa.com$
  9. # 路径匹配范例
  10. acl is_demo_path path_beg/demo/path
  11. use_backend demo_oa_com ifis_demo||is_demo_rex|| is_demo_path
  12.  
  13. backend http_demo_ext
  14. mode http
  15. # 额外的一些设置,按需使用
  16. option forwardfor
  17. option forwardfor header Client-IP
  18. option http-server-close
  19. option httpclose
  20. #balance roundrobin #负载均衡的方式,轮询方式
  21. #balance leastconn #负载均衡的方式,最小连接
  22. balance source #负载均衡的方式,根据请求的源IP
  23. cookie SERVERID insert nocache indirect # 插入serverid到cookie中,serverid后面可以定义
  24. # 健康检查
  25. option httpchk HEAD/index.html HTTP/1.1\r\nHost:\demo.oa.com
  26. serverx.x.x.xx.x.x.x:80cookie server1 check inter2srise3fall3weight3
  27. serverx.x.x.xx.x.x.x:80cookie server1 check inter2srise3fall3weight3

③、tcp 扩展配置文件模板

  1. listen tcp_demo_ext
  2. bind0.0.0.:
  3. mode tcp
  4. serverx.x.x.xx.x.x.x:3306weight1check inter1srise2fall2
  5. serverx.x.x.xx.x.x.x:3306weight1check inter1srise2fall2

Ps:多配置模式中,多个 frontend 必须绑定不同的 IP 或者端口,否则数据会串,导致映射到不同的后端而报错。因此,同一个 IP+端口下的映射务必配置到同一个 frontend 模块内。

三、系统服务

1、服务脚本

对比已有的 Haproxy 脚本,我编写的时候新增了如下实用功能:

  • 支持配置文件语法测试
  • 支持进程的监控(自拉起)功能
  • 重启之前会先检测配置语法,规避因配置错误导致重启后进程挂掉
  • 支持多配置文件模式(按照前文约定目录存放拓展配置,脚本将自动识别)

下面是服务脚本代码:

Shell
  1. #!/bin/bash
  2. ###################################################################
  3. # Haproxy Service Script 1.0. Author: Jager <im@zhang.ge> #
  4. # Common Operations(start|stop|restart|mon|test) #
  5. #-----------------------------------------------------------------#
  6. # For more information please visit https://zhang.ge/5125.html #
  7. # Copyright @ zhang.ge. All rights reserved. #
  8. ###################################################################
  9. # chkconfig:
  10. export PATH=/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:$PATH
  11. PROCESS_NAME=haproxy
  12. BASE_DIR=/usr/local/haproxy
  13. EXEC=$BASE_DIR/sbin/haproxy
  14. PID_FILE=$BASE_DIR/logs/haproxy.pid
  15. DEFAULT_CONF=$BASE_DIR/conf/haproxy.cfg
  16. MONLOG_PATH="$BASE_DIR/logs/${PROCESS_NAME}_mon.log"
  17.  
  18. # COLOR print
  19. COLOR_RED=$( echo-e"\e[31;49m")
  20. COLOR_GREEN=$( echo-e"\e[32;49m")
  21. COLOR_RESET=$( echo-e"\e[0m" )
  22. info(){echo"${COLOR_GREEN}$*${COLOR_RESET}" ;}
  23. warn(){echo"${COLOR_RED}$*${COLOR_RESET}" ;}
  24.  
  25. do_log()
  26. {
  27. local log_fpath=$
  28. local log_content=$
  29. echo"$(date '+%F %T') $log_content">>$log_fpath
  30. }
  31.  
  32. print_usage()
  33. {
  34. echo
  35. info" Usage: $(basename $0) [start|stop|restart|mon|test]"
  36. echo
  37. }
  38.  
  39. #get Expanding configuration
  40. ext_configs()
  41. {
  42. CONFIGS=
  43. if[[-d$BASE_DIR/conf/enabled]];then
  44. forFILEin$(find$BASE_DIR/conf/enabled-typel|sort-n)
  45. do
  46. CONFIGS="$CONFIGS -f $FILE";
  47. done
  48. echo$CONFIGS
  49. else
  50. echo
  51. fi
  52. }
  53. # check process status
  54. check_process()
  55. {
  56. PID=`get_pid`
  57. ifpsaux|awk'{print $2}'|grep-qw$PID2>/dev/null;then
  58. true
  59. else
  60. false
  61. fi
  62.  
  63. }
  64. # check Configuration file
  65. check_conf()
  66. {
  67. $EXEC-c-f$DEFAULT_CONF`ext_configs`>/dev/null2>&
  68. return$?
  69. }
  70. get_pid()
  71. {
  72. if[[-f$PID_FILE]];then
  73. cat$PID_FILE
  74. else
  75. warn" $PID_FILE not found!"
  76. exit1
  77. fi
  78. }
  79. start()
  80. {
  81. echo
  82. ifcheck_process;then
  83. warn" ${PROCESS_NAME} is already running!"
  84. else
  85. $EXEC-f$DEFAULT_CONF`ext_configs`&&\
  86. echo-e" ${PROCESS_NAME} start [ `info OK` ]"||\
  87. echo-e" ${PROCESS_NAME} start [ `warn Failed` ]"
  88. fi
  89. echo
  90. }
  91.  
  92. stop()
  93. {
  94. echo
  95. ifcheck_process;then
  96. PID=`get_pid`
  97. kill-$PID>/dev/null2>&
  98. echo-e" ${PROCESS_NAME} stop [ `info OK` ]"
  99. else
  100. warn" ${PROCESS_NAME} is not running!"
  101. fi
  102. echo
  103. }
  104.  
  105. restart()
  106. {
  107. echo
  108. ifcheck_process;then
  109. :
  110. else
  111. warn" ${PROCESS_NAME} is not running! Starting Now..."
  112. fi
  113. if`check_conf`;then
  114. PID=`get_pid`
  115. $EXEC-f$DEFAULT_CONF`ext_configs`-st$PID&&\
  116. echo-e" ${PROCESS_NAME} restart [ `info OK` ]"||\
  117. echo-e" ${PROCESS_NAME} restart [ `warn Failed` ]"
  118. else
  119. warn" ${PROCESS_NAME} Configuration file is not valid, plz check!"
  120. echo-e" ${PROCESS_NAME} restart [ `warn Failed` ]"
  121. fi
  122. echo
  123. }
  124.  
  125. mon()
  126. {
  127. ifcheck_process;then
  128. info"${PROCESS_NAME} is running OK!"
  129. do_log$MONLOG_PATH"${PROCESS_NAME} is running OK!"
  130. else
  131. start
  132. warn" ${PROCESS_NAME} not running, start it!"
  133. do_log$MONLOG_PATH"${PROCESS_NAME} not running, plz check"
  134. fi
  135. }
  136.  
  137. if[[$# != ]]; then
  138. print_usage
  139. exit1
  140. else
  141. case$1in
  142. "start"|"START")
  143. start
  144. ;;
  145. "stop"|"STOP")
  146. stop
  147. ;;
  148. "restart"|"RESTART"|"-r")
  149. restart
  150. ;;
  151. "status"|"STATUS")
  152. ifcheck_process;then
  153. info"${PROCESS_NAME} is running OK!"
  154. else
  155. warn" ${PROCESS_NAME} not running, plz check"
  156. fi
  157. ;;
  158. "test"|"TEST"|"-t")
  159. echo
  160. ifcheck_conf;then
  161. info" Configuration file test Successfully."
  162. else
  163. warn" Configuration file test failed."
  164. fi
  165. echo
  166. ;;
  167. "mon"|"MON"|"-m")
  168. mon
  169. ;;
  170. *)
  171. print_usage
  172. exit1
  173. esac
  174. fi

保存为 /usr/local/haproxy/sbin/ctrl.sh,赋可执行权限,如下注册系统服务:

  1. chmod+x/usr/local/haproxy/sbin/ctrl.sh
  2. ln-sf/usr/local/haproxy/sbin/ctrl.sh /etc/init.d/haproxy
  3. chkconfig haproxy on

服务控制:

  1. 启动:service haproxy start
  2. 停止:service haproxy stop
  3. 重载:service haproxy restart
  4. 状态:service haproxy status
  5. 检查:service haproxy test
  6. 监控:service haproxy mon # 进程自拉起,如有告警通道可自行加入

2、配置自拉起

  1. *****bash/usr/local/haproxy/ctrl.sh mon>/dev/null2>&

全部完成后,最终目录结构如下:

  1. [root@locahost:/usr/local/haproxy]# tree
  2. .
  3. ├──conf
  4. ├──enabled # 正式使用的拓展配置
  5. ├──http
  6. └──demo.cfg->/usr/local/haproxy/conf/ready/http/demo.cfg# 此处软链到可以上线的配置
  7. └──tcp
  8. └──demo.cfg->/usr/local/haproxy/conf/ready/tcp/demo.cfg
  9. ├──haproxy.cfg
  10. └──ready # 存在预发布的拓展配置
  11. ├──http
  12. └──demo.cfg
  13. └──other.cfg
  14. └──tcp
  15. └──demo.cfg
  16. └──other.cfg
  17. ├──doc
  18. .....
  19. ├──logs
  20. └──haproxy.pid
  21. ├──sbin
  22. ├──ctrl.sh
  23. └──haproxy
  24. └──share
  25. └─...
  26. 14directories,24files

四、日志配置

配置 rsyslog

  1. mkdir-p/data/wwwlogs
  2. vim/etc/rsyslog.conf 或/etc/syslog.conf
  3.  
  4. #新增配置
  5. local6.*/data/wwwlogs/haproxy.log
  6.  
  7. #取消如下2行注释
  8. $ModLoad imudp
  9. $UDPServerRun514
  10.  
  11. #重启syslog服务
  12. service rsyslog restart

五、小结

以上内容就是我对 Haproxy 部署规范的整理,并通过拼接方式变相实现了 Haproxy 的多配置文件管理。当然,略遗憾的是未能实现 Haproxy 的 WEB 管理方案,这个有待继续研究实现,敬请期待!

转自:https://zhang.ge/5125.html

Haproxy安装部署文档及多配置文件管理方案的更多相关文章

  1. keepalived双机热备,安装部署文档

    keepalived双击热备,安装部署文档: 下载目录:/apps/keepalived-1.2.7.tar.gz 1:---> yum install -y make wget 2:---&g ...

  2. LVS+Heartbeat安装部署文档

    LVS+Heartbeat安装部署文档 发表回复 所需软件: ipvsadm-1.24-10.x86_64.rpmheartbeat-2.1.3-3.el5.centos.x86_64.rpmhear ...

  3. Sqlserver2008安装部署文档

    Sqlserver2008部署文档 注意事项: 如果你要安装的是64位的服务器,并且是新机器.那么请注意,你需要首先需要给64系统安装一个.net framework,如果已经安装此功能,请略过这一步 ...

  4. supervisor安装部署文档和管理实例

    Supervisord是用Python实现的一款非常实用的进程管理工具,类似于monit(关于monit见我的博客:用monit监控系统关键进程),monit和supervisord的一个比较大的差异 ...

  5. zabbix3.0安装部署文档

    zabbix v3.0安装部署 摘要: 本文的安装过程摘自http://www.ttlsa.com/以及http://b.lifec-inc.com ,和站长凉白开的<ZABBIX从入门到精通v ...

  6. MetaQ安装部署文档

    一.MetaQ安装部署情况: 地点 IP Broker ID Master/Slave Slave ID:Group 合肥 192.168.52.23 Slave 1:meta-slave-group ...

  7. 1. Oracle安装部署文档

    一. 部署环境步骤 1.1 软件环境 操作系统:CentOS release 6.5oracle安装包:linux.x64_11gR2_database_1of1.zip:linux.x64_11gR ...

  8. OpenPAI大规模人工智能平台安装部署文档

    环境要求: 如果需要图形界面,需要在Ubuntu系统安装,否则centos系统安装时是没有问题的(web端和命令行进行任务提交) 安装过程需要有另外一台控制端机器(注意:区别于集群所在的任何一台服务器 ...

  9. Oracle Grid Infrastructure安装部署文档

    1. 部署环境步骤 1.1 软件环境 操作系统: CentOS release 6.5 oracle安装包: linux.x64_11gR2_grid.zip linux.x64_11gR2_data ...

随机推荐

  1. LeetCode 11月第1周题目汇总

    开源地址:点击该链接 前言 最近一个多月发现以[每天一题]系列的形式来更新题目并不太合适,一是没有足够多合适的题目来更新,二是单独拿出来一个题来讲不太系统,应该把多个相似的题目放在一起讲,这样才能够达 ...

  2. 命令行代理神器 proxychains

    因为某些原因,我们需要在命令行下载一些国外的资源,这个时候如果使用 wget,curl,或者 aria2c 的时候,往往又没有速度.这个时候我们需要使用代理来进行加速. 我本地搭的有 ss,但 ss ...

  3. NOIP模拟18 T2

    不知道为什么很多人拒绝这题打搜索...其实搜索在充分剪枝后时间是非常优秀的,不管数据怎样基本都可跑出 首先一个显然结论:对于某种状态,他抓到的小精灵一定是一个连续的区间. 因此我们可以枚举这个区间的左 ...

  4. 安装cnpm遇到的问题

    安装 cnpm时,用git安装时,安装好node环境后,测试版本号node -v和npm -v都没问题,可以输出版本号,但是安装cnpm时,使用淘宝镜像安装后,会出现如下警告: 这个是提醒你安装的版本 ...

  5. 期末考试(正解:三分单峰函数 me~)

    好久没有水过杂题了! 今天lsc终于刚过了三道考试题来水杂题了! 期末考试 首先一看还是一脸mb(这是正常现象,毕竟我不像一些大神可以一眼出正解)然后我就被颓了标签,知道是三分单峰函数,但是自己实在是 ...

  6. SpringBoot RESTful api

    一.REST简单介绍 REST代表Representational State Transfer,是一种URI风格,是一组架构约束条件和原则.REST风格服务调用就是解析URL请求,将请求由逻辑构建处 ...

  7. shell的运用 : jenkins 编译 打包前端发布 生产(tomcat)

    生产隔离做得非常.....文件上传只能通过固定ip机器的sftp账户上传,账户密码每个月要写申请才能获得. 登陆生产服务只能通过浏览器登陆!!! 发布一次生产,很痛苦. 做了简单的shell来减轻痛苦 ...

  8. Project Euler 63: Powerful digit counts

    五位数\(16807=7^5\)也是一个五次幂,同样的,九位数\(134217728=8^9\)也是一个九次幂.求有多少个\(n\)位正整数同时也是\(n\)次幂? 分析:设题目要求的幂的底为\(n\ ...

  9. .NET资源泄露与处理方案

    .NET虽然拥有强大易用的垃圾回收机制,但并不是因为这样,你就可以对资源管理放任不管,其实在稍不注意的时候,可能就造成了资源泄露,甚至因此导致系统崩溃,到那时再来排查问题就已经是困难重重. 一.知识点 ...

  10. 破解网站二维码验证,Java实现,不调用任何平台api接口

    package image.images; import java.io.File; import java.io.IOException; import java.io.InputStream; i ...