實驗環境:
操作系統: redhat EL 6.5
機器及軟件:
server9: 172.25.12.9 haproxy
server8: 172.25.12.8 apache(httpd) php
server7: 172.25.12.7 apache(httpd) php
原理及簡介:
HAProxy 提供高可用 負載均衡 以及基於 TCP 和 HTTP 應用的代理
是輕量級的 擅長處理併發
但與nginx不同的是 Haproxy 並不是 Http服務器。很多帶反向代理均衡負載的產品,如nginx,apacheproxy,都清一色是 WEB 服務器。簡單說,就是他們能自個兒提供靜態(html,jpg,gif..)或動態(PHP,cgi..)文件的傳輸以及處理。而Haproxy僅僅,而且專門是一款的用於均衡負載的應用代理。其自身並不能提供http服務
它自帶健康檢測,1.3版本後還自帶一些簡單的規則匹配
動靜分離,讀寫分離主要使用了acl函數,haproxy支持acl函數
安裝與配置:
server9先配置yum 源:
[root@server9 ~]# cat /etc/yum.repos.d/rhel-source.repo
[Server]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.12.250/rhel6.5/Server
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.12.250/rhel6.5/HighAvailability
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.12.250/rhel6.5/LoadBalancer
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.12.250/rhel6.5/ResilientStorage
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.12.250/rhel6.5/ScalableFileSystem
gpgcheck=0
haproxy軟件下載鏈接:
http://www.haproxy.org/download/1.6/src/haproxy-1.6.11.tar.gz
其他版本下載:
http://www.haproxy.org/download/
下載完後進行解壓安裝:
安裝方式: rpm包安裝(用rpmbuild製作工具製作rpm包)
#我的安裝包放在了root家目錄下
#解壓
tar zxf haproxy-1.6.11.tar.gz
cd haproxy-1.6.11
#進入 examples目錄 查看有沒有haproxy.spec文件,這個可以用來製作rpm包
cd examples/
#安裝rpmbuild軟件(安裝完之後會在當前用戶家目錄下生成一個rpmbuild目錄)
yum install rpm-build -y
#將安裝包放進 ~/rpmbuild/SOURCES/下
cp ~/haproxy-1.6.11.tar.gz ~/rpmbuild/SOURCES/
#製作rpm包
rpmbuild -bb haproxy.spec
#製作完成的rpm包會放在下面的目錄中
cd ~/rpmbuild/RPMS/x86_64/
#rpm安裝
rpm -ivh haproxy-1.6.11-1.x86_64.rpm
#查看rpm安裝後的文件存放目錄
rpm -qpl haproxy-1.6.11-1.x86_64.rpm
#rpm安裝不會有配置文件(rpm -qpl 後沒有顯示有配置文件存在)
#拷貝一份配置文件
cd ~/haproxy-1.6.11/examples
cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg
配置haproxy負載均衡:
cd /etc/haproxy/
vim haproxy.cfg
global
maxconn 10000
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 #日誌輸出配置,所有日誌都記錄在本機,通過local0輸出
uid 200
gid 200
chroot /var/empty
daemon #以後臺形式運行haproxy
defaults
mode http #默認模式 tcp是4層 http是7層
log global
option httplog #日誌級別
option dontlognull #不記錄健康檢查日誌信息
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
timeout connect 5s
timeout server 30s
timeout queue 30s
stats uri /status
frontend public
bind 0.0.0.0:80 #開啓佔用80端口
default_backend static #默認訪問後端爲 static
backend static
balance roundrobin #輪詢
server server8 172.25.12.8:80 check inter 1000
server server7 172.25.12.7:80 check inter 1000
#兩個後臺的主機,check inter 1000 檢測心跳頻率
檢測haproxy是否配置成功:
server7 server8上安裝apache 並啓動服務:
yum install -i httpd
/etc/init.d/httpd start
server7:
echo server7 > /var/www/html/index.html
server8:
echo server8 > /var/www/html/index.html
負載均衡結果:
將server7上的apache down掉
增加日誌文件:
vim /etc/rsyslog.conf
13 $ModLoad imudp
14 $UDPServerRun 514
42 *.info;mail.none;authpriv.none;cron.none;local0.none /var/log /messages
62 local0.*
重啓日誌服務:
/etc/init.d/rsyslog restart
查看日誌文件是否添加上了:
ll /var/log/haproxy.log
重啓haproxy:
/etc/init.d/haproxy restart
設置acl權限:
vim haproxy.cfg
frontend public
acl badhost src 172.25.12.250 #將172.25.12.250的訪問全部設爲badhost
http-request deny if badhost #拒絕badhost 狀態下的ip
default_backend static
這種情況下,172.25.12.250不能通過80端口訪問這臺主機(我設置haproxy開啓的是80端口)
動靜分離:
vim haproxy.cfg
將訪問後綴爲.php文件的請求全部丟給server7 其他丟給server8
frontend public
acl url_dynamic path_end -i .php
bind 0.0.0.0:80
use_backend dynamic if url_dynamic
default_backend static
backend dynamic
balance roundrobin
server server7 172.25.12.7:80 check inter 1000
backend static
server server6 172.25.12.8:80 check inter 1000
測試:
server7:
yum install php -y
vim /var/www/html/index.php
<?php
phpinfo()
?>
/etc/init.d/httpd restart
瀏覽器訪問172.25.12.9/index.php
彈出的界面是server7下的index.php界面
讀寫分離:
vim haproxy.cfg
將讀的請求交給server7處理
將寫的請求交給server8處理
frontend public
acl read method GET
acl read method HEAD
acl write method PUT
acl write method POST
bind 0.0.0.0:80
use_backend dynamic if write
use_backend static if read
backend dynamic
balance roundrobin
server server7 172.25.12.7:80 check inter 1000
backend static
server server6 172.25.12.8:80 check inter 1000