最近我在負責一個統一接入層的建設項目,涉及到 Haproxy 和 ospf 的運維部署,本文分享一下我在部署 Haproxy 以後整理的運維部署規範,並實現了Haproxy 的多配置文件管理方案。html
1、部署安裝
一、下載源碼包
最新 stable 版本下載地址:http://www.haproxy.org/download/1.7/src/haproxy-1.7.9.tar.gzlinux
二、編譯安裝
tar zxf haproxy-1.7.9.tar.gz cd haproxy-1.7.9 make TARGET=linux31 prefix=/usr/local/haproxy make install PREFIX=/usr/local/haproxy
三、建立目錄
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
2、軟件配置
熟悉 Nginx 和 Apache 的朋友都知道,這兩個 Webservice 都支持 include 加載多個配置文件的語法,可是 Haproxy 並不支持!若是現網映射規則很是多,那麼 haproxy.cfg 這個配置文件就跟臭襪子同樣,又臭又長!web
所以,我也是翻遍了國外的各類論壇帖子,終於發現一種變相實現 Haproxy 多配置文件的方案。其實,Hparoxy 是支持多配置文件的,可是不是 include 語法,而是在啓動的時候屢次使用-f 拼接配置文件,好比:redis
cd/usr/local/haproxy/sbin
./haproxy-f../conf/haproxy.cfg-f../conf/ext1.cfg-f../conf/ext2.cfg
所以,咱們能夠在配置文件目錄以及啓動腳本上作點改變,讓 Haproxy 支持多配置文件。vim
一、路徑約定:
- 待上線的 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 對應配置文件,方便管理。
二、配置模板
①、主配置:haproxy.cfg後端
#configure haproxy.cfg global log127.0.0.1 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 3600000 #鏈接超時(毫秒) timeout client 3600000 #客戶端超時(毫秒) timeout server 3600000 #服務器超時(毫秒) frontend default option httplog option httpclose bind0.0.0.0:80 # 狀態頁面規則 acl haproxy_stats path_beg/haproxy use_backend haproxy_stats ifhaproxy_stats # 其餘 # default_backend default_server # 提高失敗的時候的用戶體驗 #errorfile 502 /usr/local/haproxy/html/maintain.html #errorfile 503 /usr/local/haproxy/html/maintain.html #errorfile 504 /usr/local/haproxy/html/maintain.html # 狀態頁面 backend haproxy_stats stats uri/haproxy stats enable stats refresh60s #stats auth admin:admin # 狀態頁面認證配置 stats admin ifTRUE
②、http 擴展配置文件模板bash
frontend demo option httplog option httpclose bind192.168.1.10:80# 擴展 # 域名匹配範例 acl is_demo hdr_beg(host)-idemo.oa.com # 正則範例範例 acl is_demo_rex hdr_reg(host)-i^demo[0-9].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.0:3306 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 模塊內。cookie
3、系統服務
一、服務腳本
對比已有的 Haproxy 腳本,我編寫的時候新增了以下實用功能:負載均衡
- 支持配置文件語法測試
- 支持進程的監控(自拉起)功能
- 重啓以前會先檢測配置語法,規避因配置錯誤致使重啓後進程掛掉
- 支持多配置文件模式(按照前文約定目錄存放拓展配置,腳本將自動識別)
下面是服務腳本代碼:
#!/bin/bash ################################################################### # Haproxy Service Script 1.0.0 Author: Jager <im@zhang.ge> # # Common Operations(start|stop|restart|mon|test) # #-----------------------------------------------------------------# # For more information please visit https://zhang.ge/5125.html # # Copyright @2017 zhang.ge. All rights reserved. # ################################################################### # chkconfig: 35 10 90 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=$1 local log_content=$2 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>&1 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-9$PID>/dev/null2>&1 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[[$# != 1 ]]; 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 # 進程自拉起,若有告警通道可自行加入
二、配置自拉起
*****bash/usr/local/haproxy/ctrl.sh mon>/dev/null2>&1
所有完成後,最終目錄結構以下:
[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
4、日誌配置
配置 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
5、小結
以上內容就是我對 Haproxy 部署規範的整理,並經過拼接方式變相實現了 Haproxy 的多配置文件管理。固然,略遺憾的是未能實現 Haproxy 的 WEB 管理方案,這個有待繼續研究實現,敬請期待!
轉自:https://zhang.ge/5125.html