Haproxy安裝與配置
有關高負載均衡的軟件,目前使用比較多的是haproxy、nginx和lvs。下面我們就開始學習haprxoy這款軟件。
1、Haproxy概念
1.1、haproxy原理
haproxy提供高可用性、負載均衡以及基于TCP(第四層)和HTTP(第七層)應用的代理,支持虛擬主機,它是免費、快速并且可靠的一種解決方案。
haproxy特別適用于那些負載特別大的web站點,這些站點通常又需要會話保持或七層處理。haproxy運行在時下的硬件上,完全可以支持數以萬計的并發連接,并且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。
haproxy實現了一種事件驅動、單一進程模型,此模型支持非常大的并發連接數。多進程或多線程模型受內存限制、系統調度器限制以及無處不在的鎖限制,很少能處理數千并發連接。
事件驅動模型因為在有更好的資源和時間管理的用戶端(User-Space)實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是為什么他們必須進行優化以使每個CPU時間片(Cycle)做更多的工作。
1.2、haproxy的優點
- 免費開源,穩定性也是非常好。單haproxy也跑得不錯,穩定性可以與硬件級的F5相媲美。
- 根據官方文檔,haproxy可以跑滿10Gbps,這個數值作為軟件級負載均衡器是相當驚人的。
- haproxy支持連接拒絕:因為維護一個連接的打開的開銷是很低的,有時我們很需要限制
gongji
蠕蟲(attack bots),也就是說限制它們的連接打開從而限制它們的危害。這個已經為一個陷于小型DDoSgongji
的網站開發了而且已經拯救了很多站點,這個優點也是其它負載均衡器沒有的。 - haproxy支持全透明代理(已具備硬件防火墻的典型特點):可以用客戶端IP地址或者任何其他地址來連接后端服務器。這個特性僅在Linux 2.4/2.6內核打了tcp proxy補丁后才可以使用。這個特性也使得為某特殊服務器處理部分流量同時又不修改服務器的地址成為可能。
- haproxy現多于線上的Mysql集群環境,我們常用于它作為MySQL(讀)負載均衡。
- 自帶強大的監控服務器狀態的頁面,實際環境中我們結合Nagios進行郵件或短信報警。
- HAProxy支持虛擬主機,許多朋友說它不支持虛擬主機是錯誤的,通過測試我們知道,HAProxy是支持虛擬主機的。
2、環境
內核版本: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/#down
3、安裝Haproxy
3.1、yum安裝:參考
3.1.1、官方base源安裝
CentOS 6.*
和CentOS 7
安裝的Haproxy版本一樣
[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>
3.1.2、SCL源安裝haproxy1.8
安裝 Software Collections (SCL) repository 源以獲取最新版本的haproxy
sudo yum install centos-release-scl -y
安裝haproxy:訪問慢
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
3.2、編譯安裝Haproxy
3.2.1、創建運行賬戶和組
groupadd --system haproxy #添加haproxy的組
useradd --system -M -g haproxy haproxy -s /sbin/nologin #創建haproxy的系統賬戶到haproxy的組,但是禁止其登陸系統。
3.2.2、編譯安裝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.239 - 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 above42 - 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 NetBSD46 - osx for Mac OS/X47 - openbsd for OpenBSD 5.7 and above48 - aix51 for AIX 5.149 - aix52 for AIX 5.250 - cygwin for Cygwin51 - haiku for Haiku52 - 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/ # 拷貝一些模板;
3.2.3、創建目錄
mkdir -pv /usr/local/haproxy/conf/ready/{tcp,http} # 為多配置文件準備,省略;
mkdir -pv /usr/local/haproxy/conf/enabled/{tcp,http} # 為多配置文件準備,省略;
mkdir -pv /usr/local/haproxy/logsmkdir -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 #添加配置文件
3.2.4、查看haprxoy的版本
[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>
3.2.5、把haproxy添加到系統服務
復制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/haproxy26 [ ${NETWORKING} = "no" ] && exit 0改為:26 [ "${NETWORKING}" = "no" ] && exit 0
4、配置Haproxy
官方文檔:
https://cbonte.github.io/haproxy-dconv/1.8/configuration.html
4.1、為多配置文件準備,省略;
熟悉 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 支持多配置文件。
路徑約定:
- 待上線的 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 對應配置文件,方便管理。
4.2、配置模板
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
# 全局配置
globallog 127.0.0.1 local0 # 設置日志log 127.0.0.1 local1 noticemaxconn 4000 # 最大連接數chroot /usr/local/haproxy # 安裝目錄user haproxygroup haproxydaemon # 守護進程運行#nbproc 1 # 進程數量,只能用于守護進程模式的haproxy;默認啟動一個進程,一般只在單進程僅能打開少數文件描述符的場景中才使用多進程模式;pidfile /var/run/haproxy.pid# 默認配置
defaultslog globalmode http # 默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OKoption 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 httpoption 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_mainbind 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 forwardforoption forwardfor header Client-IPoption http-server-closeoption 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#傳遞客戶端真實IPoption 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 30server node2 192.168.1.101:8081 check inter 2000 rise 3 fall 3 weight 30
多配置模式中,多個 frontend 必須綁定不同的 IP 或者端口,否則數據會串,導致映射到不同的后端而報錯。因此,同一個 IP+端口下的映射務必配置到同一個 frontend 模塊內。
4.3、配置說明
轉發規則
前端配置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和端口;
5、配置日志rsyslog
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
6、驗證
6.1、啟動Haproxy
[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。必須是最后的論點。
6.2、前端登陸頁面
URL:http://$IP:80
建議把上面兩個轉發改為不同的頁面,不停刷新,查看是否有頁面切換;
6.3、后臺監控登陸
URL:http://$IP:50000/haproxy?stats
username:admin
password:psadmin
haproxy監控后臺服務器的情況如圖:
參考
https://www.cnblogs.com/ilanni/p/4750081.html
http://www.ttlsa.com/linux/haproxy-study-tutorial/
轉載于:https://blog.51cto.com/moerjinrong/2370128