1. 程式人生 > >Haproxy實現web的頁面的動靜分離

Haproxy實現web的頁面的動靜分離

一、Haproxy概述;
概述:Haproxy是一個開源的高效能的反向代理或者說是負載均衡服務軟體之一,由C語言編寫而成,支援會話保持、七層處理、健康檢查、故障修復後自動載入、動靜分離。HAProxy執行在當前的硬體上,完全可以支援數以萬計的併發連線;
Haproxy軟體引入了frontend,backend的功能,frontend(acl規則匹配)可以運維管理人員根據任意HTTP請求頭做規則匹配,然後把請求定向到相關的backend(server pools等待前端把請求轉過來的伺服器組)。
二、Haproxy原理實現;
代理模式:
1.四層tcp代理:例如:可用於郵件服務內部協議通訊伺服器、Mysql服務等;
2.七層應用代理:例如:HTTP代理或https代理。在4層tcp代理模式下,Haproxy僅在客戶端和伺服器之間雙向轉發流量。但是在7層模式下Haproxy會分析應用層協議,並且能通過執行、拒絕、交換、增加、修改或者刪除請求(request)或者回應(reponse)裡指定內容來控制協議。
四層代理:
ISO參考模型中的第四層傳輸層。四層負載均衡也稱為四層交換機,它主要是通過分析IP層及TCP/UDP層的流量實現的基於IP加埠的負載均衡。常見的基於四層的負載均衡器有LVS、F5等。以常見的TCP應用為例,負載均衡器在接收到第一個來自客戶端的SYN請求時,會通過設定的負載均衡演算法選擇一個最佳的後端伺服器,同時將報文中目標IP地址修改為後端伺服器IP,然後直接轉發給該後端伺服器,這樣一個負載均衡請求就完成了。從這個過程來看,一個TCP連線是客戶端和伺服器直接建立的,而負載均衡器只不過完成了一個類似路由器的轉發動作。在某些負載均衡策略中,為保證後端伺服器返回的報文可以正確傳遞給負載均衡器,在轉發報文的同時可能還會對報文原來的源地址進行修改。整個過程下圖所示。
haproxy4層.png


七層代理:
ISO參考模型中的最高層第七層應用層。七層負載均衡也稱為七層交換機,此時負載均衡器支援多種應用協議,常見的有HTTP、FTP、SMTP等。七層負載均衡器可以根據報文內容,再配合負載均衡演算法來選擇後端伺服器,因此也稱為“內容交換器”。比如,對於Web伺服器的負載均衡,七層負載均衡器不但可以根據“IP+埠”的方式進行負載分流,還可以根據網站的URL、訪問域名、瀏覽器類別、語言等決定負載均衡的策略。例如,有兩臺Web伺服器分別對應中英文兩個網站,兩個域名分別是A、B,要實現訪問A域名時進入中文網站,訪問B域名時進入英文網站,這在四層負載均衡器中幾乎是無法實現的,而七層負載均衡可以根據客戶端訪問域名的不同選擇對應的網頁進行負載均衡處理。常見的七層負載均衡器有HAproxy、Nginx等。
這裡仍以常見的TCP應用為例,由於負載均衡器要獲取到報文的內容,因此只能先代替後端伺服器和客戶端建立連線,接著,才能收到客戶端傳送過來的報文內容,然後再根據該報文中特定欄位加上負載均衡器中設定的負載均衡演算法來決定最終選擇的內部伺服器。縱觀整個過程,七層負載均衡器在這種情況下類似於一個代理伺服器。整個過程如下圖所示。
haproxy7層.png

排程演算法:
balance roundrobin:表示簡單的輪詢,負載均衡基礎演算法
balance static-rr:表示根據權重
balance leastconn:表示最少連線者先處理
balance source:表示根據請求源IP
balance uri:表示根據請求的URI;
balance url_param:表示根據請求的URl引數來進行排程
balance hdr(name):表示根據HTTP請求頭來鎖定每一次HTTP請求;
balance rdp-cookie(name):表示根據據cookie(name)來鎖定並雜湊每一次TCP請求。

三、常見的代理了解
1、lvs和硬體F5,是基於IP的三層負載,硬體適配效能好,處理效能強。
2、haproxy,可以適配三層負載均衡,同樣可以適配七層。對於頁面明確有請求分離的時候,可以使用haproxy。
3、nginx,對於日PV小於500萬,對於需要進行高併發的站點,可以使用nginx代理

四、haproxy配置檔案講解

global:全域性配置區域引數是程序級的,通常是和作業系統相關。這些引數一般只設置一次,如果配置無誤,就不需要再次進行修改;
image.png

defaults:配置預設引數,這些引數可以被用到frontend,backend,Listen元件;
image.png
frontend:處理請求的虛擬節點,Frontend可以將匹配到本地區域的請求交給下邊的backend;
backend:後端服務叢集的配置,是真實伺服器,一個Backend對應一個或者多個實體伺服器;

五、案例:Haproxy+Nginx+Tomcat搭建高可用叢集

tuobu

系統型別 IP地址 主機名
Centos 7.5.1804 ens36-192.168.137.111/24: keepliv
Centos 7.5.1804 ens36-192.168.137.112/24: nginx1
Centos 7.5.1804 ens36-192.168.137.113/24: nginx2
Centos 7.5.1804 ens36-192.168.137.114/24: tomcat1
Centos 7.5.1804 ens36-192.168.137.115/24: tomcat2

例項步驟

用到的安裝包
image.png
安裝包連結

配置nginx節點nede1、node2,準備網頁,測試節點
配置參照lnmp配置
測試[[email protected] init.d]# curl 192.168.137.112
node1
[[email protected] init.d]# curl 192.168.137.113
node2

配置tomcat節點,準備網頁啟動服務,測試節點(
倆臺tomcat)

安裝配置haproxy程式

1、配置tomcat伺服器

[[email protected] ~]# ls
anaconda-ks.cfg  apache-tomcat-9.0.14.tar.gz  jdk-11.0.1_linux-x64_bin.tar.gz
tar zxvf jdk-11.0.1_linux-x64_bin.tar.gz 
mkdir /usr/localjava
mv jdk-11.0.1 /usr/local/java
ls /usr/local/java
cat <<END >> /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:/usr/local/java/bin
END
source /etc/profile
java -version
tar zxvf apache-tomcat-9.0.14.tar.gz 
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.14 /usr/local/tomcat
ls /usr/local/tomcat/
/usr/local/tomcat/bin/startup.sh 
netstat -lntup |grep java
[[email protected] ~]# netstat -lntup |grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      4062/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      4062/java           
tcp6       0      0 :::8080                 :::*                    LISTEN      4062/java    
##tomcat2和tomcat1配置思路相同
##配置倆個的站點目錄和內容
mkdir -p /web/webapp
[[email protected] ~]# cat /web/webapp/index.jsp 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
  <head>
     <title>JSP TEST PAGE1 </title>
  </head>
  <body>
     <% out.println("Welcome to test site;http://tomcat1");%>
  </body>
</html>
[[email protected] ~]# cat -n /usr/local/tomcat/conf/server.xml
...
150       <Context docBase="/web/webapp" path="" reloadable="false"></Context> #添加了站點根目錄
...
##測試
[[email protected] init.d]# curl 192.168.137.114:8080

<html>
  <head>
     <title>JSP TEST PAGE1 </title>
  </head>
  <body>
     Welcome to test site;http://tomcat1

  </body>
</html>
[[email protected] init.d]# curl 192.168.137.115:8080

<html>
  <head>
     <title>JSP TEST PAGE1 </title>
  </head>
  <body>
     Welcome to test site;http://tomcat2

  </body>
</html>

2、安裝haproxy

yum -y install pcre-devel bzip2-devel           ##安裝依賴軟體包
tar zxvf haproxy-1.7.9.tar.gz -C /usr/src/
cd /usr/src/haproxy-1.7.9/
uname -r #檢視核心版本
make TARGET=linux310 #編譯時需要指定核心版本
make install

3、配置haproxy服務:

mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
[[email protected] init.d]# cat /etc/haproxy/haproxy.cfg 
global
        log 127.0.0.1   local0 info                     ##定義日誌級別;
        log 127.0.0.1   local1 notice
        maxconn 4096            ##設定每個haproxy程序所接受的最大併發連線數
        uid 99                  ##指定執行服務的使用者和組
        gid 99
        daemon                  ##指定執行模式為daemon,以守護程序的方式工作在後臺
defaults
        log     global                          ##採取global中的日誌配置
        mode    http                            ##預設的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
        option  httplog                         ##採用http日誌格式記錄日誌
        option  dontlognull                     ##不記錄健康檢查的日誌記錄
        option httpclose                        ##關閉保持連線
        retries 3                               ##檢查節點最多失敗次數
        maxconn 2000                            ##最大連線數,定義不得大於global中的值
        contimeout      5000    ##連線超時時間,毫秒,在此期間,如若客戶端與服務端無法成功建立連線,則斷掉
        clitimeout      50000   ##設定連線客戶端傳送資料時的成功連線最長等待時間,單位為毫秒,如若在這期間無法請求成功,則斷掉
        srvtimeout      50000   ##設定伺服器端迴應客戶端資料傳送的最長等待時間,如果在這期間還無法傳送成功,則斷掉

##################無分離頁面需求的配置##############
#listen webcluster 0.0.0.0:80                   ##指定haproxy服務監聽地址和埠
#       option  httpchk GET /index.html         ##指定http請求方法和預設檔案
#       balance roundrobin                      ##指定輪詢排程演算法
#       server  inst1 192.168.100.155:80 check inter 2000 fall 3                ##定義web節點,檢測心跳頻率,單位為毫秒,定義檢查節點最多失敗次數
#       server  inst2 192.168.100.156:80 check inter 2000 fall 3

##################有分離頁面需求的配置##############
frontend http                           ##定義名稱為http
        bind *:80                       ##指定監聽地址和埠
        acl linuxfan1 hdr_end(host) -i 192.168.137.111                  ##指定型別為訪問路徑的域名,-i不區分大小寫
        acl linuxfan2 hdr_end(host) -i 192.168.137.111

        acl linuxfan3 path_end -i .jsp .do .css .js                     ##指定請求檔案格式為.jsp
        #acl linuxfan3 hdr_reg -i \.(css|png|jpg|jpeg|gif|ico|swf|xml|txt|pdf|do|jsp|js)$       ##呼叫正則表示式
        acl linuxfan4 path_end -i .html .css .png .jpg .jpeg .xml       ##指定請求檔案格式為.html

        acl linuxfan5 path_beg -i /WebRoot                              ##指定訪問URL中的路徑,如http://www.linuxfan.cn/WebRoot/index.jsp

        use_backend dongtai if linuxfan1 linuxfan3
        use_backend dongtai if linuxfan2 linuxfan3
        use_backend dongtai if linuxfan1 linuxfan5 linuxfan3
        use_backend dongtai if linuxfan2 linuxfan5 linuxfan3

        default_backend jingtai                                 ##預設的請求使用backend dongtai

backend jingtai         ##定義backend :jingtai
        mode http                       ##定義模式
        balance roundrobin              ##定義排程演算法為輪詢
        server jingtai01 192.168.137.112:80 check inter 2000 fall 3             ##定義節點
        server jingtai02 192.168.137.113:80 check inter 2000 fall 3

backend dongtai
        mode http
        balance roundrobin
        server dongtai01 192.168.137.114:8080 check inter 2000 fall 3
        server dongtai02 192.168.137.115:8080 check inter 2000 fall 3
##啟動haproxy服務
  148  cp /usr/src/haproxy-1.7.9/examples/haproxy.init /etc/init.d/haproxy
  149  chmod +x /etc/init.d/haproxy 
  150  ln -s /usr/local/sbin/haproxy /usr/sbin/
  151  /etc/init.d/haproxy start
  152  netstat -lntup 
  153  firewall-cmd --add-port=80/tcp --permanent 
  154  firewall-cmd --add-port=80/tcp 

4、測試叢集
點選重新整理.png
下一個.png
點選重新整理jsp.png
下一個.png

5、配置haproxy的日誌檔案分離(檢視haproxy日誌)

[[email protected] init.d]# cat /etc/rsyslog.conf |egrep -v '^#|^$'
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$ModLoad imudp  ##接收udp系統日誌
$UDPServerRun 514  ##開啟udp514埠
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log
local0.*                        /var/log/haproxy/haproxy-info.log #指定了倆個日誌級別的檔案,方便檢視
local1.*                        /var/log/haproxy/haproxy-notice.log
[[email protected] init.d]# cat /etc/sysconfig/rsyslog 
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS=""
SYSLOGD_OPTIONS="-r -m 0 -c 2"
#-r 接收udp 514號埠的系統日誌訊息;-m 0 為日誌訊息新增時間等的標記 ;-c 2表示使用相容模式
systemctl restart rsyslog
/etc/init.d/haproxy  restart
#重新整理測試頁面,檢視日誌
[[email protected] init.d]# tail -n 5 /var/log/haproxy/haproxy-info.log 
Dec 24 22:19:24 localhost haproxy[5489]: 192.168.137.1:55899 [24/Dec/2018:22:19:24.521] http dongtai/dongtai02 0/0/1/3/4 200 340 - - ---- 1/1/0/0/0 0/0 "GET /index.jsp HTTP/1.1"
Dec 24 22:19:24 localhost haproxy[5489]: 192.168.137.1:55900 [24/Dec/2018:22:19:24.679] http dongtai/dongtai01 0/0/0/3/3 200 340 - - ---- 1/1/0/0/0 0/0 "GET /index.jsp HTTP/1.1"
Dec 24 22:19:24 localhost haproxy[5489]: 192.168.137.1:55901 [24/Dec/2018:22:19:24.831] http dongtai/dongtai02 0/0/0/3/4 200 340 - - ---- 1/1/0/0/0 0/0 "GET /index.jsp HTTP/1.1"
Dec 24 22:19:25 localhost haproxy[5489]: 192.168.137.1:55902 [24/Dec/2018:22:19:25.000] http dongtai/dongtai01 0/0/1/2/4 200 340 - - ---- 1/1/0/0/0 0/0 "GET /index.jsp HTTP/1.1"
Dec 24 22:19:25 localhost haproxy[5489]: 192.168.137.1:55903 [24/Dec/2018:22:19:25.145] http dongtai/dongtai02 0/0/1/1/3 200 340 - - ---- 1/1/0/0/0 0/0 "GET /index.jsp HTTP/1.1"
[[email protected]epliv init.d]# tail -n 5 /var/log/haproxy/haproxy-notice.log.log 
tail: 無法開啟"/var/log/haproxy/haproxy-notice.log.log" 讀取資料: 沒有那個檔案或目錄
[[email protected] init.d]# tail -n 5 /var/log/haproxy/haproxy-notice.log
Dec 24 22:18:33 localhost haproxy[5160]: Proxy jingtai stopped (FE: 0 conns, BE: 22 conns).
Dec 24 22:18:33 localhost haproxy[5160]: Proxy dongtai stopped (FE: 0 conns, BE: 19 conns).
Dec 24 22:18:33 localhost haproxy[5488]: Proxy http started.
Dec 24 22:18:33 localhost haproxy[5488]: Proxy jingtai started.
Dec 24 22:18:33 localhost haproxy[5488]: Proxy dongtai started.

6、配置haproxy伺服器的日誌管理web介面

[[email protected] init.d]# firewall-cmd --add-port=9090/tcp
success
[[email protected] init.d]# firewall-cmd --add-port=9090/tcp --permanent 
success
[[email protected] init.d]# vim /etc/haproxy/haproxy.cfg 
##在最後追加
listen  admin 
    bind :9090
    server web6c 192.168.137.111:9090 check 
    stats enable  #開啟監聽
    stats uri /status #設定監聽的url
    stats auth admin:123   #認證資訊
    stats auth qq:123
    stats realm admin\ xxx  #設定認證的預設提示
    stats hide-version  #隱藏版本
    stats refresh 10s
    stats admin if TRUE #TRUE這個關鍵字表示只有經過認證成功後才能被管理
[[email protected] init.d]# /etc/init.d/haproxy restart
Restarting haproxy (via systemctl):                        [  確定  ]

測試
輸入使用者.png
美滋滋

看到以上介面實驗就做完了

END