實現基於Keepalived+Haproxy+Varnish+LNMP企業級架構
原理:快取,又稱加速器,用於加速執行速度較快的裝置與較慢裝置之間的通訊。基於程式的執行具有區域性性特徵其能實現加速的功能
一、環境準備
1.1 相關配置
機器名稱 | IP配置 | 服務角色 | 備註 |
---|---|---|---|
haproxy-server-master | VIP:172.17.120.120 RIP:172.17.66.66 | 負載均衡器主伺服器 | 配置keepalived |
haproxy-server-backup | VIP:172.17.120.120 RIP:172.17.251.66 | 負載均衡器從伺服器 | 配置keepalived |
varnish | 192.168.37.111 | 快取伺服器 | 開啟代理功能 |
rs01 | 192.168.37.222 | 後端伺服器 | 開啟lnmp的web服務 |
rs02 | 192.168.37.100 | 後端伺服器 | 開啟lnmp的web服務 |
1.2 安裝服務
我們需要在相應的機器上安裝我們的服務:
1)haproxy-server-master&haproxy-server-backup 上:
yum install haproxy -y
yum install keepalived -y
2)varnish 上:
varnish伺服器請用centos7來做。
yum install varnish -y
3)rs01&rs02 上:
安裝配置LNMP。詳情見我之前的部落格——Nginx詳解以及LNMP的搭建
1.3 關閉防火牆及selinux
iptables -F && setenforing
本步驟完成。
二、配置 Haproxy
我們需要把兩個機器的Haproxy都設定好。我們去修改一下Haproxy的配置檔案——/etc/haproxy/haproxy.cfg
global段和default段都是設定好的,我們就不需要修改,下面是我們需要修改的部分:
1)frontend段
frontend web
bind *:80
default_backend varnish-server
2)backend段
backend varnish-server
balance roundrobin
server varnishsrv 192.168.37.111:6081 check inter 3000 rise 3 fall 5
3)listen段
listen admin
bind :9527
stats enable
stats uri /haproxyadmin
stats auth admin:admin
stats refresh 20s
stats admin if TRUE
第一臺機器設定好了以後,直接使用scp
命令發到第二臺機器即可。
然後把兩臺機器的服務都開啟:
service haproxy start
本步驟完成。
三、配置keepalived
3.1 配置 haproxy-server-master (主伺服器)
配置檔案為/etcc/keeplalived/keepalived.conf
,我們編輯以下三段即可:
1)全域性段——設定傳送郵件
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id keepalived_haproxy
}
2)編輯健康監測指令碼
該指令碼作用是對haproxy進行健康監測,每隔2s監測一次haproxy程序。
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
fall 2
rise 2
weight -4
}
3)定義主從和VIP
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 170
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass keer
}
virtual_ipaddress {
172.17.120.120
}
track_script {
chk_haproxy
}
}
3.2 配置 haproxy-server-backup (從伺服器)
從伺服器和主伺服器的配置很是相似,我們可以直接使用scp
命令把主伺服器的配置檔案拷過來,然後,我們只需要把第二段刪掉,同時修改一下第三段的主從和優先順序即可:
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 170
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass keer
}
virtual_ipaddress {
172.17.120.120
}
}
本步驟完成。
四、配置Varnish
4.1 修改Management程序配置檔案
Management程序的配置檔案為/etc/varnish/varnish.params
。我們先來修改一下這個檔案,主要是修改埠和快取型別及大小:
VARNISH_ADMIN_LISTEN_PORT=6082
VARNISH_STORAGE="file,/data/cache,1G"
4.2 修改Varnish總配置檔案
Varnish的總配置檔案為/etc/varnish/default.vcl
,我們來修改一下這個配置檔案:
1)第一段
① 定義一個健康監測:
vcl 4.0; #指定版本
import directors; #載入後端的輪詢模組
probe backend_healthcheck { #設定名為backend_healthcheck的健康監測
.url = "/index.html";
.window = 5; #視窗
.threshold = 2; #門檻
.interval = 3s;
.timeout = 1s;
}
② 設定後端server:
backend web1 {
.host = "192.168.37.222";
.port = "80";
.probe = backend_healthcheck;
}
backend web2 {
.host = "192.168.37.100";
.port = "80";
.probe = backend_healthcheck;
}
③ 配置後端叢集事件
sub vcl_init {
new img_cluster = directors.round_robin();
img_cluster.add_backend(web1);
img_cluster.add_backend(web2);
}
acl purgers { # 定義可訪問來源IP,許可權控制
"127.0.0.1";
"172.17.0.0"/16;
}
2)第二段——定義引擎
① 定義vcl_recv
引擎
定義不認識的頭部請求直接扔後端的pass
sub vcl_recv {
if (req.method == "GET" && req.http.cookie) {
return(hash); //處理完recv 引擎,給下一個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); //除了上邊的請求頭部,通過通道直接扔後端的pass
}
定義index.php通過特殊通道給後端的server,不經過快取
if (req.url ~ "index.php") {
return(pass);
}
定義刪除快取的方法
if (req.method == "PURGE") { //PURGE請求的處理的頭部,清快取
if (client.ip ~ purgers) {
return(purge);
}
}
為發往後端主機的請求新增X-Forward-For首部
if (req.http.X-Forward-For) { //為發往後端主機的請求新增X-Forward-For首部
set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
} else {
set req.http.X-Forward-For = client.ip;
}
return(hash);
}
② 定義vcl_hash 引擎,後沒有定義hit和Miss的路徑,所以走預設路徑
sub vcl_hash {
hash_data(req.url);
}
③ 定義要快取的檔案時長
sub vcl_backend_response { //自定義快取檔案的快取時長,即TTL值
if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
set beresp.ttl = 30d;
}
if (bereq.url ~ "\.(html|css|js)$") {
set beresp.ttl = 7d;
}
if (beresp.http.Set-Cookie) { //定義帶Set-Cookie首部的後端響應不快取,直接返回給客戶端
set beresp.grace = 30m;
return(deliver);
}
}
④ 定義deliver 引擎
sub vcl_deliver {
if (obj.hits > 0) { //為響應新增X-Cache首部,顯示快取是否命中
set resp.http.X-Cache = "HIT from " + server.ip;
} else {
set resp.http.X-Cache = "MISS";
}
unset resp.http.X-Powered-By; //取消顯示php框架版本的header頭
unset resp.http.Via; //取消顯示varnish的header頭
}
本步驟完成。
五、開啟服務的順序
1)先開啟後端server事先搭建好的lnmp web服務
systemctl start nginx
systemctl start php-fpm
systemctl start mariadb
2)再開啟varnish快取伺服器
service varnish start
3)開啟主從的keepalived,提供VIP
service keepalived start
4)開啟haproxy服務
service haproxy start
本步驟完成。
六、測試
1)配置完成後,client訪問,http://172.17.120.120/ ,成功訪問web
2)訪問http://172.17.120.120:9527/haproxy?admin ,haproxy的web監測頁面,正常
3)當主haproxy 宕機時,VIP自動漂移到從上,且服務正常使用;
在主haproxy 上,server stop haproxy,VIP會漂到從上。
4)varnish 快取伺服器上,確實生成了快取檔案
F12開啟網頁的除錯頁面,檢視確實快取了:
5)測試清快取的功能,PURGE 傳送頭部資訊
6)後端有一臺server 宕機,服務照常使用
我們停掉一臺後端伺服器:
systemctl stop nginx
然後我們再去瀏覽器檢視一下:
bing~實驗完成
以上~如果有不足之處還請大家多多指教喏٩(๑>◡<๑)۶