Linux学习之Varnish

来源:互联网 发布:mac 移动硬盘 ntfs 编辑:程序博客网 时间:2024/06/11 06:32

Varnish可以有效降低web服务器的负载,提升访问速度。Varnish是一个cache型的HTTP反向代理。
当把Varnish部署上之后,客户端的请求将首先被Varnish接受。Varnish将分析接收的请求,并将其转发到后端的web服务器上。后端的web服务器对请求进行常规的处理,并将依次将处理结果返回给Varnish。
Varnish的核心功能是能能将后端web服务器返回的结果缓存起来,如果发现后续有相同的请求,Varnish将不会将这个请求转发到web服务器,而是返回缓存中的结果。这将有效的降低web服务器的负载,提升响应速度,并且每秒可以响应更多的请求。Varnish速度很快的另一个主要原因是其缓存全部都是放在内存里的,这比放在磁盘上要快的多。

二、Varnish 特点

基于内存进行缓存,重启后数据将消失。
利用虚拟内存方式,I/O性能好。
支持设置0~60秒内的精确缓存时间。
VCL配置管理比较灵活。
32位机器上缓存文件大小为最大2GB。
具有强大的管理功能,例如top,stat,admin,list等。
状态机设计巧妙,结构清晰。
利用二叉堆管理缓存文件,达到积极删除目的。

三、Varnish 与 Squid 对比

相同点
都是开源反向代理服务器。

不同点
Varnish的稳定性很高。因为Squid需要经常重启
Varnish缓存数据都直接从内存读取,而Squid是从硬盘读取缓存数据,因此Varnish在访问速度方面会更快。
Varnish的TCP连接释放要比Squid快,所以在高并发连接情况下可以支持更多TCP连接。
Varnish可以通过管理端口,使用正则表达式批量清除部分缓存,而Squid做不到。
当然,与传统的Squid相比,Varnish也有缺点。
Varnish在高并发状态下CPU、I/O和内存等资源开销都高于Squid。
Varnish进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有请求都会被发送到后端服务器,在高并发情况下,这会给后端服务器造成很大压力。

LB 负载均衡器
结构化数据放在关系型数据库中 非结构化数据放在文件系统上

PCI-E I/O能力强

反向代理能实现访问控制功能

两个组件间之间衔接不流畅 加中间层 速度不匹配 加缓存

缓存都是键值存储 键是哈希编码后存储的

缓存对象,有生命周期,需定期清理
缓存空间耗尽:LRU(最近最少使用缓存对象从缓存空间清理出去)

分布式缓存 CDN 内容分发网络
GSLB 全局负载均衡。作用:实现在广域网(包括互联网)上不同地域的服务器间的流量调配,保证使用最佳的服务器服务离自己最近的客户,从而确保访问质量。 在CDN系统中作为核心的流量调度系统

常见的缓存服务开源解决方案
varnish squid (类似 nginx–> apache)
nginx apache 也有缓存功能

nginx 和 haproxy 在性能上不分伯仲

execstart 定义如何启动守护进程

#node1环境:[root@node1 ~]# iptables -F[root@node1 ~]# setenforce 0[root@node1 ~]# yum install varnish -y[root@node1 ~]# vim /etc/varnish/test.vcl[root@node1 ~]# systemctl start varnish.service[root@node1 ~]# ss -tnl----------#node2,node3环境:[root@node2/3 ~]# iptables -F[root@node2/3 ~]# setenforce 0[root@node2/3 ~]# yum install -y httpd  [root@node2/3 ~]# for i in {1..10}; do echo "page $i on web1" > /var/www/html/test$i,html; done[root@node2/3 ~]# systemctl start httpd.service----------#node4 测试
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 # 登录管理命令行varnish> vcl.list                 # 列出所有的配置varnish> vcl.load test1 test.vcl  # 加载编译新配置,test1是配置名,test.vcl是配置文件varnish> vcl.use test1            # 使用配置,需指定配置名,当前使用的配置以最后一次vcl.use为准varnish> vcl.show test1           # 显示配置内容,需指定配置名

配置后端的web服务器

#编辑配置文件[root@node1 ~]# vim /etc/varnish/test.vcl                backend default {                    .host = "192.168.2.139";                    .port = "80";                }

为响应添加X-Cache首部,显示缓存是否命中

#编辑配置文件[root@node1 ~]# vim /etc/varnish/test.vcl                vcl_deliver {                        if (obj.hits>0) {                                set resp.http.X-cache="hit from"+server.ip;                        }else{                                set resp.http.x-cache="miss from"+server.ip;                        }                }#测试[root@node4 ~]# curl -I http://192.168.2.138:6081/test2.html

强制对某资源请求不检查缓存

#编辑配置文件[root@node1 ~]# vim /etc/varnish/test.vcl                vcl_recv {                        if (req.url ~ "^/test3.html$" || req.url ~ "(?i)^/admin" || req.url ~  "(?i)^/login") {                        return(pass);                        }                }#测试[root@node4 ~]# curl -I http://192.168.2.138:6081/test3.html[root@node4 ~]# curl -I http://192.168.2.138:6081/login/index.html[root@node4 ~]# curl -I http://192.168.2.138:6081/admin/index.html

对特定资源取消其私有Cookie标识,并强行设定其可以由varnish缓存的时长 即TTL值

#编辑配置文件[root@node1 ~]# vim /etc/varnish/test.vcl                sub vcl_backend_response {                        if (beresp.http.cache-control !~ "s-maxage") {                                if (bereq.url ~ "(?i)\.jpg$") {                                        set beresp.ttl=3600s;                                        unset beresp.http.Set-Cookie;                                }                                if (bereq.url ~ "(?i)\.css$") {                                        set beresp.ttl=600s;                                        unset beresp.http.Set-Cookie;                                }                        }                }#测试[root@node4 ~]# curl -I http://192.168.2.138:6081/1.jpg

设定使用多个后端主机响应资源

[root@node1 ~]# vim /etc/varnish/test.vcl                backend websrv1 {                    .host = "192.168.2.139";                    .port = "80";                    .probe = {                        .url = "/test1.html";                    }                }                backend websrv2 {                    .host = "192.168.2.137";                    .port = "80";                    .probe = {                        .url = "/test1.html";                    }                }                sub vcl_recv {                    if (req.url ~ "(?i)\.(jpg|png|gif)$") {                        set req.backend_hint = websrv1;                    } else {                        set req.backend_hint = websrv2;                }   

负载均衡

[root@node1 ~]# vim /etc/varnish/test.vcl                backend websrv1 {                    .host = "192.168.2.139";                    .port = "80";                    .probe = {                        .url = "/test1.html";                    }                }                backend websrv2 {                    .host = "192.168.2.137";                    .port = "80";                    .probe = {                        .url = "/test1.html";                    }                }                import directors;                sub vcl_init {                    new mycluster = directors.round_robin();                    mycluster.add_backend(websrv1);                    mycluster.add_backend(websrv2);                }                vcl_recv {                    set req.backend_hint = mycluster.backend();                }

小命令

[root@node1 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082                ping                status                vcl.load test1 default.vcl                vcl.use test1                vcl.use boot                vcl.discard test1                vcl.list                vcl.show boot                storage.list                panic.show                param.show                param.set thread_pools 4                param.show thread_pools                backend.list                ban.list[root@node1 ~]# varnishlog[root@node1 ~]# varnishncsa[root@node1 ~]# varnishtop[root@node1 ~]# varnishstat

1. Ehcache

在Java项目中应用非常广泛, 主要面向通用缓存,J2EE和轻量级容器。一级缓存在内存,二级缓存在磁盘。
优点:
1. 直接在jvm虚拟机中缓存,速度快,效率高;
2. 小巧,使用简单;

缺点:
缓存共享麻烦,不易维护;集群分布式应用不方便。
应用场景:
单个应用或者对缓存访问要求很高的应用。

2. Varnish

高性能、开源的反向代理服务器和内存缓存服务器。
优点:
1. 高性能;
2. 多核支持;
3. 支持0-60秒的精确缓存时间。
缺点:
1. 不具备自动容错和恢复功能,重启后数据丢失;
2. 在线扩容比较难。
3. 32位机器上缓存文件大小为最大2GB;
4. 不支持集群。

应用场景:
并发要求不是很大的小型系统和应用。

3. Memcache

一个高性能的分布式内存对象缓存系统。通过key-value形式缓存。
优点:
1. 高性能;
2. 多线程支持,安装简单;
3. 部分容灾;
4. 均衡请求。

缺点:
1. 不能持久化存储;
2. 存储数据有限;
3. 集群数据没有复制和同步机制;
4. 内存回收不能及时。

应用场景:
大型系统,缓存共享、分布式部署和集群应用。

4. Redis

基于内存的键-值存储数据库。
优点:
1. 高性能;
2. 丰富的数据类型;
3. 支持持久化;
4. 支持主从复制。

缺点:
1. 不具备自动容错和恢复功能;
2. 在线扩容比较难;
3.不支持多核多线程处理。

应用场景:
大型系统,缓存共享、分布式部署和集群应用。

原创粉丝点击