在大型系統設計中用代理在負載均衡是最常見的一種方式,而相對靠譜的解決方案中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組