一、概念
Haproxy工作在七層模型的應用層
Haproxy工作過程:6次TCP握手、4次NAT轉換
Haproxy 提供高可用性、負載均衡以及基於 TCP 和 HTTP 應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。Haproxy 特別適用於那些負載特大的 web 站點, 這些站點通常又需要會話保持或七層處理。Haproxy 運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進當前的架構中, 同時可以保護web 服務器不被暴露到網絡上。
二、配置
1、haproxy負載均衡
實驗
本實驗基於redhat6.5系統
主機 server1 server2 server3
ip 172.25.47.1 172.25.47.2 172.25.47.3
服務 反向代理 apache apache
物理真機可用作測試,ip爲172.25.47.250
1)添加apache服務
server2
yum install httpd -y
/etc/init.d/httpd start
vim /var/www/html/index.html
server2
server3
yum install httpd -y
/etc/init.d/httpd start
vim /var/www/html/index.html
server3
2)添加haproxy
1>配置yum源
物理主機,查看可用包
server1
vim /etc/yum.repos.d/rhel-source.repo
yum clean all
yum repolist
2>安裝haproxy並配置
yum install haproxy -y
cd /etc/haproxy/
vim haproxy.cfg ##修改配置文件
50 retries 3
51 timeout http-request 10s ##在客戶端建立連接但不請求數據時,關閉客戶端連接
52 timeout queue 1m ##等待最大時長
53 timeout connect 10s ##定義haproxy將客戶端請求轉發至後端服務器所等待的超時時長
54 timeout client 1m ##客戶端非活躍狀態的超時時長
55 timeout server 1m ##客戶端與服務器端建立連接後,等待服務器端的超時時長
56 timeout http-keep-alive 10s ##定義保持連接的超時時長
57 timeout check 10s ##健康狀態檢測時的超時時長,過短會誤判,過長會消耗資源
58 maxconn 3000 ##每個server的最大連接數
59行 之後的都註釋掉
##haproxy提供一個web監控頁面
87 listen admin *:8080
88 stats enable
89 stats uri /status ##監控頁面的地址
90 stats auth admin:westos ##帳號和密碼
91 stats refresh 5s ##刷新時間爲5s
##配置輪循
93 listen westos *:80
94 balance roundrobin ##輪詢
95 server web1 172.25.47.2:80 check
96 server web2 172.25.47.3:80 check
/etc/init.d/haproxy start
物理主機firefox
172.25.47.1:8080/status
看到監控界面
3)測試:
真機curl 172.25.47.1
可以看到輪詢
可以看監控界面
當server3上關閉apache服務器
可以看到監控頁面上web2行紅,即會有健康檢測
2、動態、靜態頁面
server3做靜態
server2做動態
1)server3添加靜態頁面的圖片
server3
cd /var/www/html/
mkdir images
cd images/
##給目錄下放一個圖片
[root@server3 images]# ls
redhat.jpg ##添加一個圖片
2)server1設定動態和靜態頁面
server1
1、修改配置文件
vim haproxy.cfg
87 listen admin *:8080
88 stats enable
89 stats uri /status
90 stats auth admin:westos
91 stats refresh 5s
92
93 frontend westos *:80
94 acl url_static path_beg -i /images ##以什麼開頭
95 acl url_static path_end -i .jpg .gif .png ##以什麼結尾
96
97 use_backend static if url_static ##如果是靜態
98 default_backend app ##默認動態
99
100 backend static ##靜態頁面,即訪問172.25.47.3/images
101 server web2 172.25.47.3:80 check
102
103 backend app ##動態頁面,即訪問172.25.47.2
104 balance roundrobin ##設置爲輪詢,但此處只有一個server,故輪詢不起作用
105 server web1 172.25.47.2:80 check
106 server local 172.25.47.1:8000 backup ##本機作爲備用機
2、配置apache作爲備用
yum install httpd -y
vim /etc/httpd/conf/httpd.conf
136 Listen 8000
vim /var/www/html/index.html
server1
/etc/init.d/httpd start
[root@server1 haproxy]# netstat -antlupe|grep httpd
tcp 0 0 :::8000 :::* LISTEN 0 16672 1146/httpd
/etc/init.d/haproxy reload
3)測試:瀏覽器訪問(測試時候記得清緩存)
1>訪問靜態
http://172.25.47.1/
看到server2
訪問靜態
http://172.25.47.1/images/
看到圖片
2>把server2服務關掉(此時server1備用機工作)
[root@server2 html]# /etc/init.d/httpd stop
再瀏覽172.25.47.1
看到server1
server2的apache再開啓
[root@server2 html]# /etc/init.d/httpd start
再次訪問172.25.47.1,就是server2工作
3、頁面重定向
302 臨時重定向
301 永久重定向
內部做網頁時,儘量不要用臨時重定向
1)、403錯誤頁面重定向
1>配置
vim haproxy.cfg
93 frontend westos *:80
94 acl url_static path_beg -i /images
95 acl url_static path_end -i .jpg .gif .png
96
97 acl badhost src 172.25.47.250 ####拒絕250主機連接
98 block if badhost
99
100 use_backend static if url_static
101 default_backend app
102
103 backend static
104 server web2 172.25.47.3:80 check
105
106 backend app
107 balance roundrobin
108 server web1 172.25.47.2:80 check
109 server local 172.25.47.1:8000 backup
當拒絕訪問時,此時客戶訪問時會出現如下界面
爲了用戶的體驗,此時我們把拒絕頁面重定向到其他頁面
vim haproxy.cfg
98 block if badhost
99 errorloc 403 http://172.25.47.1:8000
100 redirect location http://172.25.47.1:8000 if badhost ##如果是403錯誤時,會定向到server1服務器上
101
102 use_backend static if url_static
103 default_backend app
vim /var/www/html/index.html ##給server1寫一個發佈頁面,用於測試辨識
server1
/etc/init.d/httpd restart
/etc/init.d/haproxy reload
2>測試:
瀏覽器搜索
172.25.47.1
可以看到server1
2)所有錯誤頁面重定向
1>配置
server1
vim haproxy.cfg
97 acl badhost src 172.25.47.250 ##拒絕250連接
98 #block if badhost
99 #errorloc 403 http://172.25.47.1:8000
100 redirect location http://172.25.47.1:8000 if badhost ##訪問的任何錯誤都重定向到server1
/etc/init.d/haproxy reload
##修改一下發布頁面,便於分辨
vim /var/www/html/index.html
server1重定向
2>測試:
物理真機瀏覽器搜索
172.25.47.1
4、動靜分離
1) 301重定向(例如,訪問baidu.com會被重定向到www.baidu.com)
1>server2和server3的apache服務確保開啓
2>server1上進行配置
/etc/init.d/haproxy start
cd /etc/haproxy/
vim haproxy.cfg
98 acl westos.org hdr_beg(host) -i westos.org ##以域名訪問
99 acl 172.25.47.1 hdr(host) -i 172.25.47.1 ##以ip訪問
103 redirect code 301 location http://www.westos.org if westos.org ##域名訪問時會訪問 www.westos.org
104 redirect code 301 location http://www.westos.org if 172.25.47.1 ##ip地址訪問時會訪問 www.westos.org
/etc/init.d/haproxy reload
3>測試:
真機 做地址解析
瀏覽器訪問 www.westos.org、 westos.org、172.25.47.1
訪問的都是 後端server2
2)日至
添加haproxy的日誌文件
server1
vim /etc/rsyslog.conf
13 $ModLoad imudp
14 $UDPServerRun 514 ##打開UDP的端口
43 local2.* /var/log/haproxy.log ##添加日至的地址
/etc/init.d/rsyslog restart ##重啓
ll /var/log/haproxy.log ##查看一下文件已經存在
5、讀、寫分離
此處,寫是server2,讀是server3
圖片一般保存在文件系統之上,圖片服務器裏
1)server1 修改配置文件
vim /etc/haproxy/haproxy.cfg
96 acl read method GET ##讀
97 acl read method HEAD ##讀
98 acl write method PUT ##寫
99 acl write method POST ##寫
110 use_backend app if write ##如果是寫,就是動態訪問
111 default_backend static ##默認是靜態訪問
113 backend static
114 server web2 172.25.47.3:80 check ##靜態頁面
115
116 backend app
117 balance roundrobin
118 server web1 172.25.47.2:80 check
119 server local 172.25.47.1:8000 backup
2)server2、server3配置php
server2
yum install php -y
cd /var/www/html/
此處upload下文件是php,需要自行下載
[root@server2 html]# ls
index.html upload
cd upload/
mv * ..
cd ..
vim upload_file.php
chmod 777 upload
/etc/init.d/httpd restart
server3
yum install php -y
cd /var/www/html/
此處upload下文件是php,需要自行下載,同server2
cd upload/
mv * ..
cd ..
vim upload_file.php
chmod 777 upload
/etc/init.d/httpd restart
3)server1 重啓服務
/etc/init.d/haproxy reload
4)測試:
1>真機訪問瀏覽器www.westos.org 上傳(注意瀏覽器會有緩存)
上傳一個.jpg的圖片,然後可以看到
在server2上
ls upload 也能看到