Linux企业实战 --varnish(2)

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. 两台服务器作为后端服务器

server2server3作为后端服务器。(例如: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

在这里插入图片描述测试
在这里插入图片描述

发布了136 篇原创文章 · 获赞 1 · 访问量 1656

猜你喜欢

转载自blog.csdn.net/qq_45652989/article/details/104409477