实现基于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图片信息:
欢迎浏览,如有疑问,欢迎留言。