1. 程式人生 > >實現基於Keepalived+Haproxy+Varnish+LNMP企業級架構

實現基於Keepalived+Haproxy+Varnish+LNMP企業級架構

實驗 keepalived+haproxy+varnish+lnmp

實現基於Keepalived+Haproxy+Varnish+LNMP企業級架構

Varnish知識儲備:

常見的狀態引擎之間的默認處理流程為:

技術分享

①如果緩存命中:默認流程

用戶請求–>vcl_recv–>vcl_hash–>vcl_hit–>vcl_deliver–>響應給用戶

②如果緩存未命中:默認流程

用戶請求–>vcl_recv–>vcl_hash–>vcl_miss–>vcl_backend_fetch–>後端服務器接受請求發送響應報文–>vcl_backend_response–>vcl_deliver

或:非默認流程

用戶請求–>vcl_recv–>vcl_hash–>vcl_miss–>vcl_pass–>vcl_backend_fetch–>後端服務器接受請求發送響應報文–>vcl_backend_response–>vcl_deliver–>響應給用戶

③如果不能從緩存中進行響應:默認流程

用戶請求–>vcl_recv–>vcl_hash–>vcl_pass–>vcl_backend_fetch–>後端服務器接受請求發送響應報文–>vcl_backend_response–>vcl_deliver–>響應給用戶

④如果請求報文無法理解:默認流程

用戶請求–>vcl_recv–>vcl_pipe–>交給後端服務器

說明:如果配置文件中沒有指明狀態引擎之間的跳轉,那麽對應使用以上默認的流程

-----------------------------------------------------------------------------

vcl的內建變量的分類:

技術分享

req.*:由客戶端發來的http請求相關的變量。比如req.method 表示客戶端的請求方法。

bereq.* :varnish主機在向後端真實服務器發送http請求報文時的相關變量。

beresp.*:由後端真實服務器發來的http響應報文中的某些首部信息相關的變量,一般是在vcl_backend_response或vcl_backend_fenth引擎中調用。

resp.*:由varnish響應給客戶端的響應報文相關的變量。

obj.* :對存儲在緩存空間中的緩存對象屬性的引用變量,obj開頭的變量都是只讀的。

obj.hits: 某個緩存對象的緩存的命中次數。

client.,server.,storage.*:可用在所有面向客戶端一側的引擎中。

用戶還可自定義:使用set及unset,具體用法在實驗中有體現

---------------------------------------------------------------------------------------

實驗:實現基於Keepalived+Haproxy+Varnish+LNMP企業級架構:

要求:

1.修改/etc/varnish/default.vcl配置文件內容

2、定義後端服務器組,以及檢測機制和配置後端集群事件

3、配置檢測機制為http檢測,配置後端兩臺web server,算法為輪詢。

4、配置varnish入口函數vcl_recv,定義GET請求類型被緩存

5、配置vcl_deliver函數,設定緩存頭部信息

6、配置後端緩存文件類型,對圖片緩存30天,對靜態文件緩存7天

7、配置Varnish程序功能的配置文件,使其以文件形式緩存,大小為1G,監聽端口為6081

-----------------------------------------------------------------------------

一、環境準備:

兩臺haproxy(一臺master,一臺backup,VIP:172.17.111.10)(對varnish實現負載均衡)

兩臺varnish(IP分別為:172.17.111.234 172.17.111.222)

兩臺後端服務器(已實現lnmp)(IP分別為:172.17.253.100 172.17.253.211)

二、安裝步驟:

1、在用作haproxy負載均衡的機器上安裝keepalived和haproxy

yum install keepalived

yum install haproxy

2、在用作varnish的服務器上安裝varnish

yum install varnish


三、修改配置文件及啟動服務

1、對主haproxy操作:主要代碼如下

①vim /etc/keepalived/keepalived.conf 實現高可用

#具體代碼含義請參看博客:http://13150617.blog.51cto.com/13140617/1979652

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost #收件人

}

notification_email_from [email protected]

smtp_server 127.0.0.1 #發件的服務器

smtp_connect_timeout 30

router_id LVS_DEVEL2

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 14

priority 100 #優先級

advert_int 1

authentication {

auth_type PASS

auth_pass 111111

}

virtual_ipaddress {

172.17.111.10 #VIP

}

啟動服務:systemctl start keepalived

②vim /etc/haproxy/haproxy.cfg 實現負載均衡

#具體代碼含義請參看博客:http://13150617.blog.51cto.com/13140617/1980419

global

log 127.0.0.1 local2

chroot /var/lib/haproxy

pidfile /var/run/haproxy.pid

maxconn 4000

user haproxy

group haproxy

daemon

stats socket /var/lib/haproxy/stats

defaults

mode http

log global

option httplog

option dontlognull

option http-server-close

option forwardfor except 127.0.0.0/8

option redispatch

retries 3

timeout http-request 10s

timeout queue 1m

timeout connect 10s

timeout client 1m

timeout server 1m

timeout http-keep-alive 10s

timeout check 10s

maxconn 3000

listen stats

mode http #基於http協議

bind 0.0.0.0:1080 #監聽1080端口

stats enable #開啟統計報告服務

stats hide-version #隱藏統計報告版本信息

stats uri /haproxyadmin #統計報告訪問url

stats realm Haproxy\ Statistics #頁面登陸信息

stats auth admin:admin #驗證賬號信息

stats admin if TRUE #驗證模式

frontend http-in

bind *:80

default_backend cache

backend cache

balance roundrobin #負載均衡算法

server cache1 172.17.111.222:6081 check

server cache2 172.17.111.234:6081 check

啟動服務:systemctl start haproxy (打開了80和1080端口)

2、對從haproxy操作:

①vim /etc/keepalived/keepalived.conf

配置基本同上面主的,只需要修改下面兩行,然後啟動服務

state BACKUP

priority 90

②vim /etc/haproxy/haproxy.cfg

配置完全同上面主的,配置完成後啟動服務

3、兩臺varnish上進行同樣的操作:

①vim /etc/varnish/default.vcl

vcl 4.0; #版本

import directors; #導入模塊

probe backend_healthcheck { #定義健康狀態檢測

.url = "/index.html"; #檢測的頁面

.window = 5; #窗口

.threshold = 1; #門檻,1表示至少有一個正常工作

.interval = 3s; #檢測頻度

.timeout = 1s; #超時時長

}

backend web1 { #定義後端服務器

.host = "172.17.253.211";

.port = "80";

.probe = backend_healthcheck; #健康狀態檢測

}

backend web2 { #定義後端服務器

.host = "172.17.253.100";

.port = "80";

.probe = backend_healthcheck; #健康狀態檢測

}

sub vcl_init { #初始化

new web_cluster = directors.round_robin(); #定義後端服務器組,使用輪詢算法

web_cluster.add_backend(web1); #引用上面定義的服務器

web_cluster.add_backend(web2);

}

sub vcl_recv { #定義入口函數

if(req.url ~ "index.php"){ #不緩存index.php頁面,直接跳到pass

return (pass);

}

if(req.method == "GET"){ #請求方法為GET的就緩存

return (hash);

}

if (req.method != "GET" &&

req.method != "HEAD" &&

req.method != "PUT" &&

req.method != "POST" &&

req.method != "TRACE" &&

req.method != "OPTIONS" &&

req.method != "PURGE" &&

req.method != "DELETE"){

return (pipe); #如果不屬於以上列出的方法,那麽就通過管道直接傳遞到後端服務器

}

return (hash);

}

sub vcl_hash{ #定義hash

hash_data(req.url); #對請求的url進行hash處理

}

sub vcl_backend_response { #自定義緩存文件時長,即TTL值

if(bereq.url ~ "\.(jpg|jpeg|gif|png)$"){

set beresp.ttl = 30d; #緩存圖片30天

}

if(bereq.url ~ "\.(html|css|js)$"){

set beresp.ttl = 7d; #緩存靜態頁面7天

}

return (deliver);

}

sub vcl_deliver { #為響應添加首部,顯示緩存是否命中

if(obj.hits > 0){

set resp.http.X-Cache = "HIT from " + server.ip; #命中

}

else{

set resp.http.X-Cache = "MISS"; #沒命中

}

unset resp.http.Via; #取消顯示varnish版本號

}


②vim /etc/varnish/varnish.params

VARNISH_STORAGE="file,/var/lib/varnish/bin,1G" #以文件形式緩存,大小為1G

VARNISH_LISTEN_PORT=6081 #監聽端口為6081


啟動服務:systemctl start varnish (打開了6081端口)

四、檢測:

訪問http://172.17.111.10:1080/haproxyadmin 登陸查看兩臺varnish的狀態是否正常

技術分享

訪問http://172.17.111.10/ 按ctrl+F12可查看瀏覽器的抓包信息

技術分享

然後ctrl+F5強制刷新幾次頁面,頁面情況如下:

index.php頁面信息:

技術分享

.jpg圖片信息:

技術分享


歡迎瀏覽,如有疑問,歡迎留言。

技術分享

實現基於Keepalived+Haproxy+Varnish+LNMP企業級架構