如何用Haproxy+nginx實現負載均衡
環境
物理機 | IP | 環境配置 |
---|---|---|
master | 192.168.194.148 | Haproxy |
node1 | 192.168.194.144 | nginx |
node2 | 192.168.194.146 | nginx |
node1和node2安裝nginx
(我這裡採用的是tar包的方式進行安裝的)
Nginx是一個高效能的HTTP和反向代理伺服器,同時還是IMAP/POP3/SMTP代理伺服器,該程式由俄羅斯Rambler.ru 站點開發,Nginx因為效能穩定、低系統資源消耗而聞名,近幾年Nginx在國內已經成炙熱化狀態,比如像騰訊、網易、51CTO、迅雷、噹噹網、51、人人網等諸多大型網站都已經使用Nginx來做Web伺服器,所以我們要學會運用Nginx還是非常有必要的
1 安裝編譯工具 yum -y install gcc gcc-c++ make 2 安裝pcre庫
為了確保能在 Nginx 中使用正則表示式進行更靈活的配置,安裝之前需要確定系統是否安裝有 PCRE
tar zxvf pcre-8.33.tar.gz 解壓安裝包
cd pcre-... 進入安裝包目錄
./configure 執行
make &&make install 進行編譯
3 安裝zlib庫
tar zxvf zlib-1.2.7.tar.gz cd zlib-... ./configure make &&make install
4 安裝nginx
tar zxvf nginx-1.4.4.....tar.gz
cd nginx-...
./configure
make &&make install
5 開啟nginx服務 /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx -s reload 重新啟動服務 6 關閉防火牆 systemctl stop firewalld setenforce 0 7 修改nginx的預設介面內容(方便我們檢視負載均衡效果) nginx 的預設頁面放在/usr/local/nginx/html
[[email protected] html]# vi index.html
<h1>NO.2</h1>
7 訪問192.168.194.144檢視是否部署成功
同理部署node2
部署master
1 安裝haproxy yum install haproxy -y 2 關閉防火牆 iptables -F setenforce 0 3 將配置檔案進行備份(以防萬一) cp /etc/haproxy/haproxy.cfg{,.bak} 4 編輯配置檔案(注意用自己搭建nginx伺服器的IP替換下面的IP)
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend 0.0.0.0:80
bind *:80
default_backend websrvs
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend websrvs
balance roundrobin
server srv1 192.168.194.144:80 check maxconn 3
server srv2 192.168.194.146:80 check
5 啟用Haproxy的日誌功能 vim /etc/haproxy/haproxy.cfg
log 127.0.0.1 local2 \\日誌的裝置管道為local2,需在rsyslog配置檔案中定義local2的日誌裝置
vim /etc/rsyslog.conf
將下面兩句解除註釋
$ModLoad imudp \\啟用UDP協議接收日誌
$UDPServerRun 514 \\UDP埠為514
增加
local2.* /var/log/haproxy.log \\定義local2日誌裝置的檔案為/var/log/haproxy.log
6 開啟服務 systemctl start haproxy systemctl enable haproxy 7 檢視80 埠是否開啟
8 測試
[[email protected] ~]# for i in {1..10};do curl http://192.168.194.148;done
<h1>NO.2</h1>
<h1>N0.1</h1>
<h1>NO.2</h1>
<h1>N0.1</h1>
<h1>NO.2</h1>
<h1>N0.1</h1>
<h1>NO.2</h1>
<h1>N0.1</h1>
<h1>NO.2</h1>
<h1>N0.1</h1>
9 頁面測試
擴充套件
=1 啟動壓縮功能= vim /etc/haproxy/haproxy.cfg
frontend 0.0.0.0:80
bind *:80
default_backend websrvs
compression algo gzip \\啟動壓縮功能,壓縮型別為gzip
compression type text/html text/plainhtml, application/xml\\壓縮檔案的型別為文字檔案,plainhtml純文字檔案
backend websrvs
balance roundrobin
server srv1 192.168.194.144:80 check
server srv2 192.168.194.146:80 check
2 定義check檢查的時間間隔 vim /etc/haproxy/haproxy.cfg
frontend 0.0.0.0:80
bind *:80
default_backend websrvs
backend websrvs
balance roundrobin
# option httpchk \\啟用七層代理向主頁傳送請求
option httpchk GET /test1.html HTTP/1.0 \\啟用七層代理,當使用GET命令,使用HTTP1.0協議向test1.txt頁面傳送請求時檢查頁面健康狀態
server srv1 192.168.194.146:80 check inter 3000ms rise 1 fall 2 \\inter定義為每3s檢查一次,rise為檢查成功一次即為成功,fall為檢查失敗兩次即為故障
server srv2 192.168.194.144:80 check backup \\backup為備用服務端,當其他主機故障時啟用
後端主機的httpd訪問日誌中可以看到每隔2秒都有一次主頁檢查記錄日誌 [[email protected] html]# tail -f /var/log/httpd/access_log
== 3 實現網頁重定向== 訪問192.168.194.144後端主機srv1的網頁將自動跳轉到指定的網頁,eg redir http://www.baidu.com 跳轉到www.baidu.com
frontend myweb
bind *:80
default_backend websrvs
backend websrvs
balance roundrobin
server srv1 192.168.194.144:80 check inter 3000ms rise 1 fall 2 redir http://www.baidu.com \\將訪問172.16.253.105主頁面重定向訪問www.baidu.com
server srv2 192.168.194.146:80 check backup
4 權重設定
frontend myweb
bind *:80
default_backend websrvs
backend websrvs
balance roundrobin
server srv1 192.168.194.144:80 check weight 2 \\權重為2
server srv2 192.168.194.146:80 check weight 1 \\權重為1
5 頁面的使用者訪問控制
frontend myweb
stats enable \\啟用stats
stats uri /myproxy?admin \\自定義stats頁面uri的路徑為/myproxy?admin
stats realm "HAProxy Stats Page" \\認證提示
stats auth admin:admin \\stats頁面使用者訪問控制,使用者admin,密碼admin
bind *:80
default_backend websrvs
backend websrvs
balance roundrobin
server srv1 192.168.194.144:80 check weight 2
server srv2 192.168.194.146:80check weight 1
啟用status的管理功能
frontend myweb *:80
stats enable \\啟用stats
stats uri /myproxy?admin \\自定義stats頁面uri的路徑為/myproxy?admin
stats realm "HAProxy Stats Page" \\認證提示
stats auth admin:admin \\stats頁面使用者訪問控制,使用者admin,密碼admin
stats admin if TRUE \\總是允許訪問stats的使用者管理stats頁面
default_backend websrvs
backend websrvs
balance roundrobin
server srv1 172.16.253.105:80 check weight 2
server srv2 172.16.252.1:80 check weight 1
單獨定義stats的管理頁面
frontend myweb
bind *:80
default_backend websrvs
backend websrvs
balance roundrobin
server srv1 172.16.253.105:80 check weight 2
server srv2 172.16.252.1:80 check weight 1
listen stats
bind *:9000 \\定義stats頁面的監聽埠為9000
stats enable \\開啟stats狀態介面
stats uri /myproxy?admin \\自定義stats的uri路徑
stats realm "HAProxy Stats Page" \\stats頁面的提示資訊
stats auth admin:admin \\ststs狀態介面的admin使用者認證
stats admin if TRUE \\允許所有登入stats的使用者管理stats介面
定義haproxy的工作模式為tcp,實現layer4層代理
listen sshsrvs
mode tcp
bind *:2222
balance leastconn
server sshsrv1 172.16.253.105:22 check
server sshsrv2 172.16.252.1:22 check
設定cookie
frontend myweb *:80
default_backend websrvs
backend websrvs
cookie WEBSRV insert indirect nocache \\WEBSRV為自定義的cookie鍵名
balance roundrobin
server srv1 172.16.253.105:80 check weight 2 cookie srv1 \\srv1為自定義的srv1伺服器的cookie資訊
server srv2 172.16.252.1:80 check weight 1 cookie srv2 \\srv2為自定義的srv2伺服器的cookie資訊
client
[[email protected] ~]# curl -I 192.168.194.148
HTTP/1.1 200 OK
Date: Fri, 26 May 2017 03:30:41 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 25 May 2017 11:26:46 GMT
ETag: "40801-1c-550577f03843e"
Accept-Ranges: bytes
Content-Length: 28
Content-Type: text/html; charset=UTF-8
Set-Cookie: WEBSRV=srv2; path=/ \\Cookie資訊為WEBSRV=srv2
Cache-control: private
[[email protected] ~]# curl -I 192.168.194.148/test3.html
HTTP/1.1 200 OK
Date: Tue, 29 Aug 2017 04:41:00 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Mon, 28 Aug 2017 14:02:09 GMT
ETag: "13-557d0bda20453"
Accept-Ranges: bytes
Content-Length: 19
Content-Type: text/html; charset=UTF-8
Set-Cookie: WEBSRV=srv1; path=/ \\Cookie資訊為WEBSRV=srv1
Cache-control: private