HAProxy負載均衡
阿新 • • 發佈:2018-04-08
HAProxy負載均衡在大型系統設計中用代理在負載均衡是最常見的一種方式,而相對靠譜的解決方案中Nginx、HAProxy、LVS、F5在各大場中用得比較普遍,各有各的優勢和使用場景,由於本次要使用到TCP,因此Nginx只能在HTTP層負載,因此用HAProxy來負載,為什麽不用LVS?因為配置太麻煩。
HAProxy是免費、極速且可靠的用於為TCP和基於HTTP應用程序提供高可用、負載均衡和代理服務的解決方案,尤其適用於高負載且需要持久連接或7層處理機制的web站點。HAProxy還可以將後端的服務器與網絡隔離,起到保護後端服務器的作用。HAProxy的負載均衡能力雖不如LVS,但也是相當不錯,而且由於其工作在7層,可以對http請求報文做深入分析,按照自己的需要將報文轉發至後端不同的服務器(例如動靜分離),這一點工作在4層的LVS無法完成。
環境
CentOS6.X
HAProxy 1.7.3
用root用戶安裝
下載
若在線安裝不用下載,可直接通過yum命令安裝(建議),不過需要聯網。
去官網下載 :http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz
下載後放進CentOS中的/usr/local/ 文件夾中(至於怎麽放,你不會 這個鍋我不背,去學學Linux 操作基礎)
關閉SElinux、配置防火墻
vi /etc/selinux/config#SELINUX=enforcing #註釋掉#SELINUXTYPE=targeted #註釋掉SELINUX=disabled#增加:wq!#保存退出setenforce 0#使配置立即生效
vi /etc/sysconfig/iptables#編輯-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT#允許組播地址通信(在做keepalived時用得到)-A RH-Firewall-1-INPUT -p vrrp -j ACCEPT#允許VRRP(虛擬路由器冗余協)通信-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT#允許80端口通過防火墻:wq!#保存退出service iptables restart#重啟防火墻使配置生效
創建HAProxy運行賬戶和組
[root@H32 local]#groupadd haproxy #添加haproxy組[root@H32 local]#useradd -g haproxy haproxy -s /bin/false #創建nginx運行賬戶haproxy並加入到haproxy組,不允許haproxy
安裝
分兩種:
1、在線裝:yum install haproxy (建議)
2、安裝包:
環境中要有gcc,用於編譯,一般安裝環境時都會有,若沒有 運行 :
yum install -y gcc
進入local文件夾中
[root@H32 ~]#cd /usr/local
然後解壓下載好haproxy包到當前文件夾
[root@H32 local]#tar -zxvf haproxy-1.7.3.tar.gz[root@H32 local]#cd haproxy-1.7.3
安裝
[root@H32 haproxy-1.7.3]#make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haproxy-1.7.3 #編譯(源碼才需要) uname -r #查看系統內核版本號[root@H32 haproxy-1.7.3]#make install PREFIX=/usr/local/haproxy-1.7.3 #安裝 haproxy-1.7.3為解壓後的文件路徑(很重要)
設置HAProxy
mkdir -p /usr/local/haproxy-1.7.3/conf#創建配置文件目錄
mkdir -p /etc/haproxy#創建配置文件目錄
touch /usr/local/haproxy-1.7.3/conf/haproxy.cfg#創建配置文件
ln -s /usr/local/haproxy-1.7.3/conf/haproxy.cfg /etc/haproxy/haproxy.cfg#添加配置文件軟連接
cp -r /usr/local/haproxy-1.7.3/examples/errorfiles /usr/local/haproxy-1.7.3/errorfiles#拷貝錯誤頁面
ln -s /usr/local/haproxy-1.7.3/errorfiles /etc/haproxy/errorfiles#添加軟連接
mkdir -p /usr/local/haproxy-1.7.3/log#創建日誌文件目錄
touch /usr/local/haproxy-1.7.3/log/haproxy.log#創建日誌文件
ln -s /usr/local/haproxy-1.7.3/log/haproxy.log /var/log/haproxy.log#添加軟連接
cp /usr/local/haproxy-1.7.3/examples/haproxy.init /etc/rc.d/init.d/haproxy#拷貝開機啟動文件
chmod +x /etc/rc.d/init.d/haproxy#添加腳本執行權限
chkconfig haproxy on#設置開機啟動
ln -s /usr/local/haproxy-1.7.3/sbin/haproxy /usr/sbin#添加軟連接
註意上面的文件夾,若與上面的文件夾路徑一致,可以直接復制運行。
配置haproxy.cfg參數
vi /usr/local/haproxy-1.7.3/conf/haproxy.cfg#編輯
這裏是最關鍵的設置,在此有兩個相同的服務由兩臺服務器提供:192.168.30.33,192.168.30.34
#---------------------------------------------------------------------#Global settings#---------------------------------------------------------------------globallog127.0.0.1 local2###[err warning info debug]chroot/usr/local/haproxy-1.7.3pidfile/var/run/haproxy.pid###haproxy的pid存放路徑,啟動進程的用戶必須有權限訪問此文件maxconn 4000###最大連接數,默認4000user haproxy
group haproxy
daemon###創建1個進程進入deamon模式運行。此參數要求將運行模式設置為"daemon"#---------------------------------------------------------------------#common defaults that all the ‘listen‘ and ‘backend‘ sections will#use if not designated in their block#---------------------------------------------------------------------defaults
mode http###默認的模式,tcp是4層,http是7層,health只會返回OK若是混合模式則 mode 不需要設置logglobal###采用全局定義的日誌option dontlognull###不記錄健康檢查的日誌信息option httpclose###每次請求完畢後主動關閉http通道option httplog###日誌類別http日誌格式混合模式 此處還需要加上 tcplog#option forwardfor###如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ipoption redispatch###serverId對應的服務器掛掉後,強制定向到其他健康的服務器timeout connect 10s#default 10 second timeout if a backend is not foundtimeout client 10s###客戶端連接超時timeout server 10s###服務器連接超時maxconn 60000###最大連接數retries 3###3次連接失敗就認為服務不可用,也可以通過後面設置########統計頁面配置########listen admin_stats#監聽端口bind 0.0.0.0:8089#啟用狀態監控stats enable
mode http
logglobal#統計頁面URLstats uri /stats#統計頁面密碼框上提示文本stats realm Haproxy\ Statistics#統計頁面用戶名和密碼設置stats auth admin:admin#隱藏統計頁面上HAProxy的版本信息#stats hide-version#當通過認證才可管理stats adminifTRUE#統計頁面自動刷新時間stats refresh 30s########WEB配置#################listen web1080
bind0.0.0.0:1080mode http
option httplog
logglobalmaxconn3000balance leastconnserver web33192.168.80.33:8007 weight 1 rise 2 fall 3server web34 192.168.80.34:8007 weight 1 rise 2 fall 3#---------------------------------------------------------------------#main frontend which proxys to the backends 這裏不需要動靜分離,所以全部註釋掉#---------------------------------------------------------------------#frontend main :5000#acl url_static path_beg -i /static /images /javascript /stylesheets#acl url_static path_end -i .jpg .gif .png .css .js#use_backend static if url_static#default_backend app#---------------------------------------------------------------------#static backend for serving up images, stylesheets and such#---------------------------------------------------------------------#backend static#balance roundrobin#server static 127.0.0.1:4331 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#backend app#balance roundrobin#server app1 127.0.0.1:5001 check#server app2 127.0.0.1:5002 check#server app3 127.0.0.1:5003 check#server app4 127.0.0.1:5004 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#errorloc 503 http://www.osyunwei.com/404.htmlerrorfile 403 /etc/haproxy/errorfiles/403.http
errorfile500 /etc/haproxy/errorfiles/500.http
errorfile502 /etc/haproxy/errorfiles/502.http
errorfile503 /etc/haproxy/errorfiles/503.http
errorfile504 /etc/haproxy/errorfiles/504.http
統一綁定的對外接口為1080, 監控頁面端口為8089。
啟動
:wq!#保存退出
service haproxy start#啟動
#設置開機啟動
chkconfig haproxy on
設置HAProxy日誌
vi /etc/syslog.conf#編輯,在最下邊增加#
haproxy.log
local0. /var/log/haproxy.log
local1. /var/log/haproxy.log
local2. /var/log/haproxy.log
local3. /var/log/haproxy.log
:wq!#保存退出
vi /etc/sysconfig/rsyslog#編輯修改
SYSLOGD_OPTIONS="-r -m 0"#接收遠程服務器日誌
:wq!#保存退出
service rsyslog restart#重啟syslog
監控頁面
打開監控頁面,用戶名密碼為admin,出現下面的頁面就說明配置成功:
http://192.168.30.32:8089/stats
service haproxy stop#關閉service haproxy restart#重啟
擴展問題:
此處只做了簡單的IP請求負載,還可以做TCP層的負載,但裏面的設置需要根據自己的實際情況不停的壓力測試進行調置。
此後還要做Keepalived + HAProxy 多機熱備的負載實用方案。
還可做mysql的讀寫負載、動靜態資源分離等等
ACL規則介紹
ACL控制哪些開放,往哪裏轉,哪些屏蔽 ,具體的內容網上也有介紹,此處只做拋磚引玉。
實例:實現動靜分離功能
首先定義兩個backend,分別以動態和靜態進行分組
backend jingtai
balance roundrobin
server web1 10.0.10.82:80 check weight 1maxconn 2000
backend dongtai
balance roundrobin
server web2 10.0.10.83:80 check weight 1maxconn 3000
配置frontend
frontend web_server
bind :80
default_backend webservers
acl badguy src 10.0.10.1
acl denyfile path /1.html
#http-request deny if badguy denyfile
acl static path_end .html
use_backend jingtai if static
default_backend dongtai
定義acl名稱為static ,如果訪問匹配是.html的文件,那麽直接跳轉至jingtai 這個backend
如果訪問的不匹配.html 那麽直接跳轉至默認backend dongtai組
HAProxy是免費、極速且可靠的用於為TCP和基於HTTP應用程序提供高可用、負載均衡和代理服務的解決方案,尤其適用於高負載且需要持久連接或7層處理機制的web站點。HAProxy還可以將後端的服務器與網絡隔離,起到保護後端服務器的作用。HAProxy的負載均衡能力雖不如LVS,但也是相當不錯,而且由於其工作在7層,可以對http請求報文做深入分析,按照自己的需要將報文轉發至後端不同的服務器(例如動靜分離),這一點工作在4層的LVS無法完成。
CentOS6.X
HAProxy 1.7.3
用root用戶安裝
下載
若在線安裝不用下載,可直接通過yum命令安裝(建議),不過需要聯網。
去官網下載 :http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz
下載後放進CentOS中的/usr/local/ 文件夾中(至於怎麽放,你不會 這個鍋我不背,去學學Linux 操作基礎)
關閉SElinux、配置防火墻
vi /etc/selinux/config#SELINUX=enforcing #註釋掉#SELINUXTYPE=targeted #註釋掉SELINUX=disabled#增加:wq!#保存退出setenforce 0#使配置立即生效
創建HAProxy運行賬戶和組
安裝
分兩種:
1、在線裝:yum install haproxy (建議)
2、安裝包:
環境中要有gcc,用於編譯,一般安裝環境時都會有,若沒有 運行 :
yum install -y gcc
進入local文件夾中
[root@H32 ~]#cd /usr/local
然後解壓下載好haproxy包到當前文件夾
[root@H32 local]#tar -zxvf haproxy-1.7.3.tar.gz[root@H32 local]#cd haproxy-1.7.3
安裝
[root@H32 haproxy-1.7.3]#make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haproxy-1.7.3 #編譯(源碼才需要) uname -r #查看系統內核版本號[root@H32 haproxy-1.7.3]#make install PREFIX=/usr/local/haproxy-1.7.3 #安裝 haproxy-1.7.3為解壓後的文件路徑(很重要)
設置HAProxy
mkdir -p /usr/local/haproxy-1.7.3/conf#創建配置文件目錄
mkdir -p /etc/haproxy#創建配置文件目錄
touch /usr/local/haproxy-1.7.3/conf/haproxy.cfg#創建配置文件
ln -s /usr/local/haproxy-1.7.3/conf/haproxy.cfg /etc/haproxy/haproxy.cfg#添加配置文件軟連接
cp -r /usr/local/haproxy-1.7.3/examples/errorfiles /usr/local/haproxy-1.7.3/errorfiles#拷貝錯誤頁面
ln -s /usr/local/haproxy-1.7.3/errorfiles /etc/haproxy/errorfiles#添加軟連接
mkdir -p /usr/local/haproxy-1.7.3/log#創建日誌文件目錄
touch /usr/local/haproxy-1.7.3/log/haproxy.log#創建日誌文件
ln -s /usr/local/haproxy-1.7.3/log/haproxy.log /var/log/haproxy.log#添加軟連接
cp /usr/local/haproxy-1.7.3/examples/haproxy.init /etc/rc.d/init.d/haproxy#拷貝開機啟動文件
chmod +x /etc/rc.d/init.d/haproxy#添加腳本執行權限
chkconfig haproxy on#設置開機啟動
ln -s /usr/local/haproxy-1.7.3/sbin/haproxy /usr/sbin#添加軟連接
註意上面的文件夾,若與上面的文件夾路徑一致,可以直接復制運行。
配置haproxy.cfg參數
vi /usr/local/haproxy-1.7.3/conf/haproxy.cfg#編輯
這裏是最關鍵的設置,在此有兩個相同的服務由兩臺服務器提供:192.168.30.33,192.168.30.34
#---------------------------------------------------------------------#Global settings#---------------------------------------------------------------------globallog127.0.0.1 local2###[err warning info debug]chroot/usr/local/haproxy-1.7.3pidfile/var/run/haproxy.pid###haproxy的pid存放路徑,啟動進程的用戶必須有權限訪問此文件maxconn 4000###最大連接數,默認4000user haproxy
group haproxy
daemon###創建1個進程進入deamon模式運行。此參數要求將運行模式設置為"daemon"#---------------------------------------------------------------------#common defaults that all the ‘listen‘ and ‘backend‘ sections will#use if not designated in their block#---------------------------------------------------------------------defaults
mode http###默認的模式,tcp是4層,http是7層,health只會返回OK若是混合模式則 mode 不需要設置logglobal###采用全局定義的日誌option dontlognull###不記錄健康檢查的日誌信息option httpclose###每次請求完畢後主動關閉http通道option httplog###日誌類別http日誌格式混合模式 此處還需要加上 tcplog#option forwardfor###如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ipoption redispatch###serverId對應的服務器掛掉後,強制定向到其他健康的服務器timeout connect 10s#default 10 second timeout if a backend is not foundtimeout client 10s###客戶端連接超時timeout server 10s###服務器連接超時maxconn 60000###最大連接數retries 3###3次連接失敗就認為服務不可用,也可以通過後面設置########統計頁面配置########listen admin_stats#監聽端口bind 0.0.0.0:8089#啟用狀態監控stats enable
mode http
logglobal#統計頁面URLstats uri /stats#統計頁面密碼框上提示文本stats realm Haproxy\ Statistics#統計頁面用戶名和密碼設置stats auth admin:admin#隱藏統計頁面上HAProxy的版本信息#stats hide-version#當通過認證才可管理stats adminifTRUE#統計頁面自動刷新時間stats refresh 30s########WEB配置#################listen web1080
bind0.0.0.0:1080mode http
option httplog
logglobalmaxconn3000balance leastconnserver web33192.168.80.33:8007 weight 1 rise 2 fall 3server web34 192.168.80.34:8007 weight 1 rise 2 fall 3#---------------------------------------------------------------------#main frontend which proxys to the backends 這裏不需要動靜分離,所以全部註釋掉#---------------------------------------------------------------------#frontend main :5000#acl url_static path_beg -i /static /images /javascript /stylesheets#acl url_static path_end -i .jpg .gif .png .css .js#use_backend static if url_static#default_backend app#---------------------------------------------------------------------#static backend for serving up images, stylesheets and such#---------------------------------------------------------------------#backend static#balance roundrobin#server static 127.0.0.1:4331 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#backend app#balance roundrobin#server app1 127.0.0.1:5001 check#server app2 127.0.0.1:5002 check#server app3 127.0.0.1:5003 check#server app4 127.0.0.1:5004 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#errorloc 503 http://www.osyunwei.com/404.htmlerrorfile 403 /etc/haproxy/errorfiles/403.http
errorfile500 /etc/haproxy/errorfiles/500.http
errorfile502 /etc/haproxy/errorfiles/502.http
errorfile503 /etc/haproxy/errorfiles/503.http
errorfile504 /etc/haproxy/errorfiles/504.http
統一綁定的對外接口為1080, 監控頁面端口為8089。
啟動
:wq!#保存退出
service haproxy start#啟動
#設置開機啟動
chkconfig haproxy on
設置HAProxy日誌
vi /etc/syslog.conf#編輯,在最下邊增加#
haproxy.log
local0. /var/log/haproxy.log
local1. /var/log/haproxy.log
local2. /var/log/haproxy.log
local3. /var/log/haproxy.log
:wq!#保存退出
vi /etc/sysconfig/rsyslog#編輯修改
SYSLOGD_OPTIONS="-r -m 0"#接收遠程服務器日誌
:wq!#保存退出
service rsyslog restart#重啟syslog
監控頁面
打開監控頁面,用戶名密碼為admin,出現下面的頁面就說明配置成功:
http://192.168.30.32:8089/stats
service haproxy stop#關閉service haproxy restart#重啟
擴展問題:
此處只做了簡單的IP請求負載,還可以做TCP層的負載,但裏面的設置需要根據自己的實際情況不停的壓力測試進行調置。
此後還要做Keepalived + HAProxy 多機熱備的負載實用方案。
還可做mysql的讀寫負載、動靜態資源分離等等
ACL規則介紹
ACL控制哪些開放,往哪裏轉,哪些屏蔽 ,具體的內容網上也有介紹,此處只做拋磚引玉。
實例:實現動靜分離功能
首先定義兩個backend,分別以動態和靜態進行分組
backend jingtai
balance roundrobin
server web1 10.0.10.82:80 check weight 1maxconn 2000
backend dongtai
balance roundrobin
server web2 10.0.10.83:80 check weight 1maxconn 3000
配置frontend
frontend web_server
bind :80
default_backend webservers
acl badguy src 10.0.10.1
acl denyfile path /1.html
#http-request deny if badguy denyfile
acl static path_end .html
use_backend jingtai if static
default_backend dongtai
定義acl名稱為static ,如果訪問匹配是.html的文件,那麽直接跳轉至jingtai 這個backend
如果訪問的不匹配.html 那麽直接跳轉至默認backend dongtai組
HAProxy負載均衡