Haproxy安装部署文档及多配置文件管理方案
最近我在负责一个统一接入层的建设项目,涉及到 Haproxy 和 ospf 的运维部署,本文分享一下我在部署 Haproxy 之后整理的运维部署规范,并实现了Haproxy 的多配置文件管理方案。
一、部署安装
1、下载源码包
最新 stable 版本下载地址:http://www.haproxy.org/download/1.7/src/haproxy-1.7.9.tar.gz
2、编译安装
tar zxf haproxy-1.7..tar.gz
cd haproxy-1.7.
make TARGET=linux31 prefix=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
3、创建目录
mkdir-p/usr/local/haproxy/conf/ready/tcp
mkdir-p/usr/local/haproxy/conf/ready/http
mkdir-p/usr/local/haproxy/conf/enabled/tcp
mkdir-p/usr/local/haproxy/conf/enabled/http
mkdir-p/usr/local/haproxy/logs
mkdir-p/data/wwwlogs/logs
二、软件配置
熟悉 Nginx 和 Apache 的朋友都知道,这两个 Webservice 都支持 include 加载多个配置文件的语法,但是 Haproxy 并不支持!如果现网映射规则非常多,那么 haproxy.cfg 这个配置文件就跟臭袜子一样,又臭又长!
因此,我也是翻遍了国外的各种论坛帖子,终于发现一种变相实现 Haproxy 多配置文件的方案。其实,Hparoxy 是支持多配置文件的,但是不是 include 语法,而是在启动的时候多次使用-f 拼接配置文件,比如:
cd/usr/local/haproxy/sbin
./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
#configure haproxy.cfg
global
log127.0.0. local0
maxconn4096 #最大连接数
chroot/usr/local/haproxy#安装目录
uid99 #用户nobody
gid99 #组nobody
daemon #守护进程运行
nbproc1 #进程数量
pidfile/usr/local/haproxy/logs/haproxy.pid#haproxy pid defaults
log global
mode http #7层 http;4层tcp 如果要让haproxy支持虚拟主机,mode 必须设为http
option httplog #http 日志格式
log127.0.0.1local6
option httpclose #主动关闭http通道
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries1
option dontlognull
maxconn2000 #最大连接数
timeout connect #连接超时(毫秒)
timeout client #客户端超时(毫秒)
timeout server #服务器超时(毫秒) frontend default
option httplog
option httpclose
bind0.0.0.:
# 状态页面规则
acl haproxy_stats path_beg/haproxy
use_backend haproxy_stats ifhaproxy_stats
# 其他
# default_backend default_server
# 提升失败的时候的用户体验
#errorfile /usr/local/haproxy/html/maintain.html
#errorfile /usr/local/haproxy/html/maintain.html
#errorfile /usr/local/haproxy/html/maintain.html # 状态页面
backend haproxy_stats
stats uri/haproxy
stats enable
stats refresh60s
#stats auth admin:admin # 状态页面认证配置
stats admin ifTRUE
②、http 扩展配置文件模板
frontend demo
option httplog
option httpclose
bind192.168.1.:# 扩展
# 域名匹配范例
acl is_demo hdr_beg(host)-idemo.oa.com
# 正则范例范例
acl is_demo_rex hdr_reg(host)-i^demo[-].oa.com$
# 路径匹配范例
acl is_demo_path path_beg/demo/path
use_backend demo_oa_com ifis_demo||is_demo_rex|| is_demo_path backend http_demo_ext
mode http
# 额外的一些设置,按需使用
option forwardfor
option forwardfor header Client-IP
option http-server-close
option httpclose
#balance roundrobin #负载均衡的方式,轮询方式
#balance leastconn #负载均衡的方式,最小连接
balance source #负载均衡的方式,根据请求的源IP
cookie SERVERID insert nocache indirect # 插入serverid到cookie中,serverid后面可以定义
# 健康检查
option httpchk HEAD/index.html HTTP/1.1\r\nHost:\demo.oa.com
serverx.x.x.xx.x.x.x:80cookie server1 check inter2srise3fall3weight3
serverx.x.x.xx.x.x.x:80cookie server1 check inter2srise3fall3weight3
③、tcp 扩展配置文件模板
listen tcp_demo_ext
bind0.0.0.:
mode tcp
serverx.x.x.xx.x.x.x:3306weight1check inter1srise2fall2
serverx.x.x.xx.x.x.x:3306weight1check inter1srise2fall2
Ps:多配置模式中,多个 frontend 必须绑定不同的 IP 或者端口,否则数据会串,导致映射到不同的后端而报错。因此,同一个 IP+端口下的映射务必配置到同一个 frontend 模块内。
三、系统服务
1、服务脚本
对比已有的 Haproxy 脚本,我编写的时候新增了如下实用功能:
- 支持配置文件语法测试
- 支持进程的监控(自拉起)功能
- 重启之前会先检测配置语法,规避因配置错误导致重启后进程挂掉
- 支持多配置文件模式(按照前文约定目录存放拓展配置,脚本将自动识别)
下面是服务脚本代码:
#!/bin/bash
###################################################################
# Haproxy Service Script 1.0. Author: Jager <im@zhang.ge> #
# Common Operations(start|stop|restart|mon|test) #
#-----------------------------------------------------------------#
# For more information please visit https://zhang.ge/5125.html #
# Copyright @ zhang.ge. All rights reserved. #
###################################################################
# chkconfig:
export PATH=/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:$PATH
PROCESS_NAME=haproxy
BASE_DIR=/usr/local/haproxy
EXEC=$BASE_DIR/sbin/haproxy
PID_FILE=$BASE_DIR/logs/haproxy.pid
DEFAULT_CONF=$BASE_DIR/conf/haproxy.cfg
MONLOG_PATH="$BASE_DIR/logs/${PROCESS_NAME}_mon.log" # COLOR print
COLOR_RED=$( echo-e"\e[31;49m")
COLOR_GREEN=$( echo-e"\e[32;49m")
COLOR_RESET=$( echo-e"\e[0m" )
info(){echo"${COLOR_GREEN}$*${COLOR_RESET}" ;}
warn(){echo"${COLOR_RED}$*${COLOR_RESET}" ;} do_log()
{
local log_fpath=$
local log_content=$
echo"$(date '+%F %T') $log_content">>$log_fpath
} print_usage()
{
echo
info" Usage: $(basename $0) [start|stop|restart|mon|test]"
echo
} #get Expanding configuration
ext_configs()
{
CONFIGS=
if[[-d$BASE_DIR/conf/enabled]];then
forFILEin$(find$BASE_DIR/conf/enabled-typel|sort-n)
do
CONFIGS="$CONFIGS -f $FILE";
done
echo$CONFIGS
else
echo
fi
}
# check process status
check_process()
{
PID=`get_pid`
ifpsaux|awk'{print $2}'|grep-qw$PID2>/dev/null;then
true
else
false
fi }
# check Configuration file
check_conf()
{
$EXEC-c-f$DEFAULT_CONF`ext_configs`>/dev/null2>&
return$?
}
get_pid()
{
if[[-f$PID_FILE]];then
cat$PID_FILE
else
warn" $PID_FILE not found!"
exit1
fi
}
start()
{
echo
ifcheck_process;then
warn" ${PROCESS_NAME} is already running!"
else
$EXEC-f$DEFAULT_CONF`ext_configs`&&\
echo-e" ${PROCESS_NAME} start [ `info OK` ]"||\
echo-e" ${PROCESS_NAME} start [ `warn Failed` ]"
fi
echo
} stop()
{
echo
ifcheck_process;then
PID=`get_pid`
kill-$PID>/dev/null2>&
echo-e" ${PROCESS_NAME} stop [ `info OK` ]"
else
warn" ${PROCESS_NAME} is not running!"
fi
echo
} restart()
{
echo
ifcheck_process;then
:
else
warn" ${PROCESS_NAME} is not running! Starting Now..."
fi
if`check_conf`;then
PID=`get_pid`
$EXEC-f$DEFAULT_CONF`ext_configs`-st$PID&&\
echo-e" ${PROCESS_NAME} restart [ `info OK` ]"||\
echo-e" ${PROCESS_NAME} restart [ `warn Failed` ]"
else
warn" ${PROCESS_NAME} Configuration file is not valid, plz check!"
echo-e" ${PROCESS_NAME} restart [ `warn Failed` ]"
fi
echo
} mon()
{
ifcheck_process;then
info"${PROCESS_NAME} is running OK!"
do_log$MONLOG_PATH"${PROCESS_NAME} is running OK!"
else
start
warn" ${PROCESS_NAME} not running, start it!"
do_log$MONLOG_PATH"${PROCESS_NAME} not running, plz check"
fi
} if[[$# != ]]; then
print_usage
exit1
else
case$1in
"start"|"START")
start
;;
"stop"|"STOP")
stop
;;
"restart"|"RESTART"|"-r")
restart
;;
"status"|"STATUS")
ifcheck_process;then
info"${PROCESS_NAME} is running OK!"
else
warn" ${PROCESS_NAME} not running, plz check"
fi
;;
"test"|"TEST"|"-t")
echo
ifcheck_conf;then
info" Configuration file test Successfully."
else
warn" Configuration file test failed."
fi
echo
;;
"mon"|"MON"|"-m")
mon
;;
*)
print_usage
exit1
esac
fi
保存为 /usr/local/haproxy/sbin/ctrl.sh,赋可执行权限,如下注册系统服务:
chmod+x/usr/local/haproxy/sbin/ctrl.sh
ln-sf/usr/local/haproxy/sbin/ctrl.sh /etc/init.d/haproxy
chkconfig haproxy on
服务控制:
启动:service haproxy start
停止:service haproxy stop
重载:service haproxy restart
状态:service haproxy status
检查:service haproxy test
监控:service haproxy mon # 进程自拉起,如有告警通道可自行加入
2、配置自拉起
*****bash/usr/local/haproxy/ctrl.sh mon>/dev/null2>&
全部完成后,最终目录结构如下:
[root@locahost:/usr/local/haproxy]# tree
.
├──conf
│ ├──enabled # 正式使用的拓展配置
│ │ ├──http
│ │ │ └──demo.cfg->/usr/local/haproxy/conf/ready/http/demo.cfg# 此处软链到可以上线的配置
│ │ └──tcp
│ │ └──demo.cfg->/usr/local/haproxy/conf/ready/tcp/demo.cfg
│ ├──haproxy.cfg
│ └──ready # 存在预发布的拓展配置
│ ├──http
│ │ └──demo.cfg
│ │ └──other.cfg
│ └──tcp
│ └──demo.cfg
│ └──other.cfg
├──doc
│ .....
├──logs
│ └──haproxy.pid
├──sbin
│ ├──ctrl.sh
│ └──haproxy
└──share
└─...
14directories,24files
四、日志配置
配置 rsyslog
mkdir-p/data/wwwlogs
vim/etc/rsyslog.conf 或/etc/syslog.conf #新增配置
local6.*/data/wwwlogs/haproxy.log #取消如下2行注释
$ModLoad imudp
$UDPServerRun514 #重启syslog服务
service rsyslog restart
五、小结
以上内容就是我对 Haproxy 部署规范的整理,并通过拼接方式变相实现了 Haproxy 的多配置文件管理。当然,略遗憾的是未能实现 Haproxy 的 WEB 管理方案,这个有待继续研究实现,敬请期待!
转自:https://zhang.ge/5125.html
Haproxy安装部署文档及多配置文件管理方案的更多相关文章
- keepalived双机热备,安装部署文档
keepalived双击热备,安装部署文档: 下载目录:/apps/keepalived-1.2.7.tar.gz 1:---> yum install -y make wget 2:---&g ...
- LVS+Heartbeat安装部署文档
LVS+Heartbeat安装部署文档 发表回复 所需软件: ipvsadm-1.24-10.x86_64.rpmheartbeat-2.1.3-3.el5.centos.x86_64.rpmhear ...
- Sqlserver2008安装部署文档
Sqlserver2008部署文档 注意事项: 如果你要安装的是64位的服务器,并且是新机器.那么请注意,你需要首先需要给64系统安装一个.net framework,如果已经安装此功能,请略过这一步 ...
- supervisor安装部署文档和管理实例
Supervisord是用Python实现的一款非常实用的进程管理工具,类似于monit(关于monit见我的博客:用monit监控系统关键进程),monit和supervisord的一个比较大的差异 ...
- zabbix3.0安装部署文档
zabbix v3.0安装部署 摘要: 本文的安装过程摘自http://www.ttlsa.com/以及http://b.lifec-inc.com ,和站长凉白开的<ZABBIX从入门到精通v ...
- MetaQ安装部署文档
一.MetaQ安装部署情况: 地点 IP Broker ID Master/Slave Slave ID:Group 合肥 192.168.52.23 Slave 1:meta-slave-group ...
- 1. Oracle安装部署文档
一. 部署环境步骤 1.1 软件环境 操作系统:CentOS release 6.5oracle安装包:linux.x64_11gR2_database_1of1.zip:linux.x64_11gR ...
- OpenPAI大规模人工智能平台安装部署文档
环境要求: 如果需要图形界面,需要在Ubuntu系统安装,否则centos系统安装时是没有问题的(web端和命令行进行任务提交) 安装过程需要有另外一台控制端机器(注意:区别于集群所在的任何一台服务器 ...
- Oracle Grid Infrastructure安装部署文档
1. 部署环境步骤 1.1 软件环境 操作系统: CentOS release 6.5 oracle安装包: linux.x64_11gR2_grid.zip linux.x64_11gR2_data ...
随机推荐
- Unity3d粒子特效:制作火焰效果
效果 分析 真实的火焰效果,通常包括:火.火光.火星等组成部分,而火焰对周围环境的烘焙,可以通过灯光实现,如点光源. 针对火焰组成部分,我们可以创建对应的粒子系统组件,实现相应的效果,如下图所示: 1 ...
- map 与 set的使用
1.map的使用 初始化的两种方式 a. const map = new Map([['name','ouycx'],['age', 20]]); b. const map = new Map(); ...
- [Scala]Scala安装以及在IDEA中配置Scala
一 Scala简述 Scala (斯卡拉)是一门多范式(multi-paradigm)的编程语言. 这里所谓的范式,指的是编写程序的方式,不同的编程语言,方式也不尽相同,也就意味着Scala编程语言 ...
- Pandas 时间序列
# 导入相关库 import numpy as np import pandas as pd 在做金融领域方面的分析时,经常会对时间进行一系列的处理.Pandas 内部自带了很多关于时间序列相关的工具 ...
- hashMapp
原文链接:https://www.iteye.com/topic/539465 Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很 ...
- JavaScript闭包使用姿势指南
目录 JavaScript闭包使用姿势指南 引言 闭包的定义 来个有趣的例子吧 现在我们换个例子吧 我们再来个有趣的例子 内存泄露问题 用闭包解决递归调用问题 用闭包模拟私有方法 在循环中使用闭包 性 ...
- 在控制器中如何对frxml的控件初始化
如果在控制器中实现Initializable这个接口,并重iInitializable这个方法 对于一个fxml文件来说它首先执行控制器的构造函数,这个时候它是无法对@FXML修饰的方法进行访问的,然 ...
- 推荐Java五大微服务器及其代码示例教程
来源素文宅博客:http://blog.yoodb.com/yoodb/article/detail/1339 微服务越来越多地用于开发领域,因为开发人员致力于创建更大,更复杂的应用程序,这些应用程序 ...
- SSM配置梳理
这两天梳理了一下 SSM 的配置,做一个小总结 可能有一些不对的地方,如果您发现了什么错误,非常希望能帮忙指出,谢谢 我参考了很多文章,都标明了来源(链接),可能会影响阅读的连贯性,抱歉 ...
- nyoj 21-三个水杯(BFS)
21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...