1. 程式人生 > >如何用Haproxy+nginx實現負載均衡

如何用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