1. varnish 进程的工作模式
varnish启动会产生两个进程:manager(管理managerment)主进程,然后fork一个worker子进程。
manager进程作用: 读入(更新)配置,vcl文件编译,varnish监控,初始化vainish及提供varnish管理接口。management进程会每隔几秒钟探测一下Child 进程以判断其是否正常运行,如果在指定的时长内未得到child进程的回应,management将会重启此 Child 进程。
ps -ef # 查看系统的所有进程
# varnish会产生两个进程
varnish 2120 1 0 21:58 ? 00:00:00 /usr/sbin/varnishd -a :8
varnish 2130 2120 0 21:58 ? 00:00:00 /usr/sbin/varnishd -a :8
2. 查看缓存命中情况
vim /etc/varnish/default.vcl #varnish 配置文件
其中:
vcl_recv 是 http 请求到达后进入的第一个状态,在这个状态中,可以对请求进行以下的一些处理。
- 修改 client 请求,以减少缓存决策时的差异性。
- 根据 client 请求,决定缓存策略。
- 重定向请求
- 决定处理请求的 backend(即后端 webserver )
vcl_deliver 在缓存数据将要发送到客户端时调用。
[root@server1 ~]# vim /etc/varnish/default.vcl
sub vcl_deliver {
# Happens when we have all the pieces we need, and are about to send the
# response to the client.
#
# You can do accounting or modifying the final object here.
if (obj.hits > 0){
set resp.http.X-Cache = "HIT from drn1 cache";
}
else{
set resp.http.X-Cache = "MISS from drn1 cache";
}
return (deliver);
}
[root@server1 ~]# systemctl restart varnish
测试: 在真机(172.25.42.250)上进行测试。
3. 手动清除缓存
方法一:命令清除
[root@server1 ~]# varnishadm ban req.url "~" / # 清除所有
# 清除之后再访问就是miss(即第一次访问)
方法二:页面缓存清除
# ban清理缓存中满足表达式条件的缓存对象
[root@server1 ~]# varnishadm ban req.url "~" /index.html
# 清除之后再访问就是miss(即第一次访问)
4. 两台服务器作为后端服务器
server2和server3作为后端服务器。(例如:10086的后台有多个)
步骤一:server 1
[root@server1 ~]# vim /etc/varnish/default.vcl
# Default backend definition. Set this to point to your content server.
backend web1 {
.host = "172.25.42.2";
.port = "80";
}
backend web2 {
.host = "172.25.42.3";
.port = "80";
}
步骤二:server 3
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# ls
[root@server3 html]# vim index.html
[root@server3 html]# cat index.html
server3
[root@server3 html]# systemctl start httpd
步骤三:server 1
[root@server1 ~]# vim /etc/varnish/default.vcl
if (req.http.host ~ "^(www.)?westos.org"){
set req.http.host="www.westos.org";
set req.backend_hint=web1;
} elsif (req.http.host ~ "^bbs.westos.org"){
set req.backend_hint=web2;
} else {
return (synth(405));
}
测试:真机(172.25.42.250)
先在真机里做地址解析,在进行测试。
在真机172.25.42.250中测试:
[root@foundation42 kiosk]# vim /etc/hosts
172.25.42.253 www.westos.org bbs.westos.org
[root@foundation42 kiosk]# curl www.westos.org
server2
5. 实现负载均衡和轮询机制
同一个ip对应两个域名请求,使用apache虚拟主机
步骤一:在server3上配置虚拟主机
[root@server3 conf.d]# pwd
/etc/httpd/conf.d
[root@server3 conf.d]# cat vhost.conf
<VirtualHost *:80>
DocumentRoot /www
ServerName www.westos.org
</VirtualHost>
<Directory "/www">
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot /bbs
ServerName bbs.westos.org
</VirtualHost>
<Directory "/bbs">
Require all granted
</Directory>
[root@server3 html]# mkdir /www
[root@server3 html]# mkdir /bbs
[root@server3 html]# cat /www/index.html
server3.www.westos.org
[root@server3 html]# cat /bbs/index.html
server3.bbs.westos.org
[root@server3 html]# systemctl restart httpd
步骤二:server1上定义负载均衡
[root@server1 ~]#vim /etc/varnish/default.vcl
# ‘在vcl4.1一行的下一行前面加上下面内容’
vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
# Default backend definition. Set this to point to your content server.
backend web1 {
.host = "172.25.42.2";
.port = "80";
}
backend web2 {
.host = "172.25.42.3";
.port = "80";
}
sub vcl_init{ # 定义负载均衡
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
}
if (req.http.host ~ "^(www.)?westos.org"){
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
}elsif (req.http.host ~ "^bbs.westos.org"){
set req.backend_hint = web2;
}else{
return (synth(405));
}
}
[root@server1 ~]# systemctl restart varnish
测试:
[root@foundation42 kiosk]# curl www.westos.org
server2
[root@foundation42 kiosk]# curl bbs.westos.org
server3.bbs.westos.org
为什么没有轮询的原因
client------varnish(cache)-------2/3 缓存的问题
有负载均衡就不能用缓存,缓存会破坏负载均衡的效果.
解决方法:
[root@server1 html]# vim /etc/varnish/default.vcl
if (req.http.host ~ "^(www.)?westos.org"){
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
return (pass);
} elsif (req.http.host ~ "^bbs.westos.org"){
set req.backend_hint = web2;
} else {
return (synth(405));
}
}
[root@server1 html]# systemctl restart varnish
测试