實現基於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企業級架構