一.Haproxy簡介
- Haproxy是一個使用C語言編寫的自由及開放源代碼軟體,其提供高可用性、負載均衡,以及基于TCP和HTTP的應用的程式代理。
- Haproxy特别适用于負載特大的web站點,這些站點通常又需要會話保持或七層處理。Haproxy運作在目前的硬體上,完全可以支援數以萬計的并發連接配接。并且它的運作模式使得它可以很簡單安全的整合進您目前的架構中,同時可以保護你的web伺服器不被暴露在網絡上
- Haproxy實作了一種事件驅動,單一程序模型,此模型支援非常大的并發連接配接數。多進行或線程模型受記憶體的限制,系統排程器限制以及無處不在的鎖限制,很少能處理數千并發連接配接。事件驅動模型因為在有更好的資源和時間管理的使用者空間實作所有這些任務,是以沒有這些問題。此模型的弊端是,在多核系統上,這些程式通常擴充性較差。這就是為什麼他們必須進行優化以使每個cpu時間片做更多的工作
- 此外,包括GItHub、Bitbucket、Stack Overflow、Reddit、Tumber、Twitter、Tuenti在内的知名網站,以及亞馬遜網絡服務系統使用了Haproxy
二.Haproxy搭建web群集分析
- Haproxy是目前比較流行的一種群集排程工具,同類群集排程工具也有很多,比如LVS和Nginx.相對而言,LVS的性能最好,但是搭建相對複雜,Nginx的upstream子產品支援群集功能,但是對群集節點的健康檢查功能不強,性能沒有Haproxy好
- Haproxy官網是http://haproxy.1wt.eu/
- 目前常見的web群集排程器分為軟體和硬體兩類,軟體通常使用開源的LVS、Haproxy、Nginx,硬體一般使用比較多的是F5,當然國内也有一些産品,比如:梭子魚、綠盟等。
- Haproxy配置檔案的分析
[[email protected] ~]# cd haproxy-1.5.19/examples
[[email protected] examples]# vim haproxy.cfg
##Haproxy配置檔案通常分為三個部分,即global、defaults、listen
##global為全局配置,defaults為預設配置,listen為應用元件配置
global
log 127.0.0.1 local0 //配置日志記錄,local0為日志裝置,預設存放到系統日志
log 127.0.0.1 local1 notice //notice為日志級别
#log loghost local0 info
maxconn 4096 //最大連接配接數
chroot /usr/share/haproxy
uid 99 //使用者uid
gid 99 //使用者gid
daemon
#debug
#quiet
defaults
log global //定義日志為global配置中的日志定義
mode http //模式為http
option httplog //采用http日志格式記錄日志
option dontlognull
retries 3 //檢查節點伺服器失敗次數,連續達到三次失敗,則節點不可用
redispatch
maxconn 2000 //最大連接配接數
contimeout 5000 //連接配接逾時時間
clitimeout 50000 //用戶端逾時時間
srvtimeout 50000 //伺服器逾時時間
listen appli1-rewrite 0.0.0.0:10001 //定義一個appli1-rewrite的應用
cookie SERVERID rewrite
balance roundrobin //負載均衡算法使用輪詢算法
server app1_1 192.168.34.23:8080 cookie app1inst1 check inter 2000 rise 2 fall 5
server app1_2 192.168.34.32:8080 cookie app1inst2 check inter 2000 rise 2 fall 5
server app1_3 192.168.34.27:8080 cookie app1inst3 check inter 2000 rise 2 fall 5
server app1_4 192.168.34.42:8080 cookie app1inst4 check inter 2000 rise 2 fall 5
listen appli2-insert 0.0.0.0:10002
option httpchk //檢查伺服器的檔案
balance roundrobin
cookie SERVERID insert indirect nocache
server inst1 192.168.114.56:80 cookie server01 check inter 2000 fall 3
server inst2 192.168.114.56:81 cookie server02 check inter 2000 fall 3
capture cookie vgnvisitor= len 32
option httpclose # disable keep-alive
rspidel ^Set-cookie:\ IP= # do not let this cookie tell our internal IP address
listen appli3-relais 0.0.0.0:10003
dispatch 192.168.135.17:80
注:日志的級别,0(EMERG,緊急),1(ALERT,警告),2(CRIT,嚴重),3(ERR,錯誤),4(WARNING,提醒),5(NOTICE,注意),6(INFO,資訊),7(DEBUG,調試)
三.搭建Nginx和Haproxy群集架構
類型 | IP位址 | 系統 | 軟體包 |
Haproxy排程器 | 192.168.43.101 | centos7 | haproxy-1.5.19.tar.gz |
Nginx伺服器1 | 192.168.43.102 | centos7 | nginx-1.12.2.tar.gz |
Nginx伺服器2 | 192.168.43.103 | centos7 | nginx-1.12.2.tar.gz |
cilent | 192.168.43.105 | cents7 |
注:以上軟體包可至官網下載下傳
Nginx web server 1
1.下載下傳相關軟體包
yum install -y pcre-devel zlib-devel gcc gcc-c++ make
2.建立nginx的賬戶
useradd -M -s /sbin/nologin nginx
3.解壓軟體包
tar zxvf nginx-1.12.2.tar.gz -C /opt
4.配置環境,編譯且安裝
cd /opt/nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx
make && make install
5.設定首頁面
[[email protected] nginx-1.12.2]# cd /usr/local/nginx/html
[[email protected] html]# ls
50x.html index.html
[[email protected] html]# rz
[[email protected] html]# ls
1.jpg 50x.html index.html
[[email protected] html]# vim index.html
<img height=200px src="1.jpg"/>
6.将執行腳本建立軟連結
[[email protected] html]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
7.驗證文法錯誤
[[email protected] html]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
8.開啟nginx服務,關閉防火牆
[[email protected] html]# nginx
[[email protected] html]# systemctl stop firewalld
[[email protected] html]# setenforce 0
Nginx web server 2
1.下載下傳相關軟體包
yum install -y pcre-devel zlib-devel gcc gcc-c++ make
2.建立nginx的賬戶
useradd -M -s /sbin/nologin nginx
3.解壓軟體包
tar zxvf nginx-1.12.2.tar.gz -C /opt
4.配置環境,編譯且安裝
cd /opt/nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx
make && make install
5.設定首頁面
[[email protected] nginx-1.12.2]# cd /usr/local/nginx/html
[[email protected] html]# ls
50x.html index.html
[[email protected] html]# rz
[[email protected] html]# ls
1.jpg 50x.html index.html
[[email protected] html]# vim index.html
<img height=200px src="1.jpg"/>
6.将執行腳本建立軟連結
[[email protected] html]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
7.驗證文法錯誤
[[email protected] html]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
8.開啟nginx服務,關閉防火牆
[[email protected] html]# nginx
[[email protected] html]# systemctl stop firewalld
[[email protected] html]# setenforce 0
1.下載下傳軟體包
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
2.解壓haproxy軟體包
tar zxvf haproxy-1.5.19.tar.gz
3.編譯安裝haproxy
cd haproxy-1.5.19/
make TARGET=linux26 //64位系統
make install
4.建立配置檔案的目錄,且複制模闆
[[email protected] ~]# mkdir /etc/haproxy
[[email protected] ~]# cd haproxy-1.5.19
[[email protected] haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
5.編輯配置檔案
vim /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log /dev/log local0 info //開啟日志記錄功能
log /dev/log local0 notice
#log loghost local0 info
maxconn 4096
# chroot /usr/share/haproxy //關閉固定家目錄
uid 99
gid 99
daemon
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
retries 3
# redispatch //關閉對于失敗伺服器發送請求
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webcluster 0.0.0.0:80 //監聽任意網段的80端口
option httpchk GET /index.html
balance roundrobin
##兩個節點伺服器,2000毫秒進行健康檢查,如果三次沒有回應則認為節點故障
server inst1 192.168.43.102:80 check inter 2000 fall 3
server inst1 192.168.43.103:80 check inter 2000 fall 3
6.配置服務控制方式
[[email protected] ~]# cp /root/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[[email protected] ~]# chmod +x /etc/init.d/haproxy
[[email protected] ~]# chkconfig --add /etc/init.d/haproxy
[[email protected] ~]# ln -s /usr/local/sbin/haproxy /usr/sbin
7.配置日志記錄,添加腳本
[[email protected] haproxy]# touch /etc/rsyslog.d/haproxy.conf
[[email protected] haproxy]# cd /etc/rsyslog.d/
[[email protected] rsyslog.d]# ls
haproxy.conf listen.conf
[[email protected] rsyslog.d]# vim haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
8.關閉安全性功能,開啟服務
systemctl stop firewalld
setenforce 0
service haproxy start
systemctl restart rsyslog.service //重新開機系統日志
注:在使用客戶機通路時,可能不會調轉到另外一台伺服器,可以選擇不同IP位址的客戶機通路