【前端项目-部署必备】使用Varnish缓存静态资源文件在内存中

 

前言

        现在都块2020年了,这年代,随便建个网站,动不动就是前后端分离的架构。我始终觉得,最合适业务场景的才是最好的架构。像一些初创公司、没啥业务量的中小型公司,也跟风前后端分离的架构.....实在是无力吐槽。不过也不能这么以偏概全、一概而论吧。天晓得人家网站有多大的高并发呢。

        咳咳...有点扯远了,前后端分离的架构呢,能加快网站响应速度。此时的前端项目,打包上线后,基本都是些静态资源文件,放在服务器的某个目录下。

        那么如何尽可能以最快的速度让用户访问这些静态资源文件?这时可以用varnish  把静态资源文件 缓存在内存中,外面再加一层Nginx做负载均衡即可。其实Nginx+memcache的方式也能把静态资源文件缓存在内存中,但需要写额外代码把 静态资源文件存入memcache。

 

应用场景:

先参考以下两篇文章:

Varnish、Squid、Ngx_cache性能对比  https://blog.csdn.net/weixin_33979745/article/details/92114264
Varnish VS Nginx测试报告   https://www.cnblogs.com/littlehb/archive/2012/02/11/2346349.html

总结成一句话:在机器资源有限、并发不过3000的中小企业,选用Varnish,否则选用Nginx

个人感觉把:虽然Nginx在低并发量没发挥出优势,但是在低并发量时比Varnish的性能差不了多少啊。所以为了长远的性能考虑、减少一层中间层的维护,去掉varnish能够减轻架构复杂度和单点故障的几率,直接用Nginx吧。看到很多资料使用Nginx来做响应和负载均衡,varnish来做缓存。

另外还有一点,在搜索varnish的相关资料时,发现很多的博客网站中关于varnish的资料大部分是11年、12年、13的。

 

应该让哪些资源被缓存

1:静态资源中的公共资源缓存

2:静态资源中的私有资源不缓存

3:动态资源中的公共资源缓存

4:动态资源中的私有资源不缓存

 

varnish优缺点:

 varnish这几年已经应用比较广泛且成熟了,与squid相比,它具有以下优点:

1、Varnish采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,访问速度更快,性能要比Squid高。

2、通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存,这一点是Squid不能具备的

3、稳定性更好,在处理相同的负载情况下,squid发生故障的概率要高于varnish

4、varnish支持并发能力比squid要强,它释放tcp链接要比squid快,所以可以支持更多的链接

5、varnish在管理方面比squid强,他可以通过管理端口使用正则来清理部分缓存,squid是做不到的

6、varnish可以起多个进程,而squid是单cpu单核处理的

varnish的缺点:

1、重启服务后,内存数据清除,需要到后端服务器重新获取数据

2、超过3000的并发量是,错误率开始上升,详情见本文的参考文档,有相关的性能测试链接

 

官方网站:

http://varnish-cache.org

 

安装方式:

1、RPM包 :yum install -y varnish

2、编译安装(注意:以下操作是在CentOS7上执行的:

 

下面主要介绍下源码编译安装的方式:

首先,需要安装一些varnish需要依赖包:

yum install -y gcc gcc-c++ make  libtool  ncurses-devel  pcre pcre-devel
#注意:ncurses-devel ,如果这个不装,varnishstat不会安装,这个rhel5的一个bug

yum inistall python-docutils ncurses-devel libedit-devel  python-sphinx

# 因为我的系统中是python2和python3共存的,而且python3是用源码编译安装的。在对vanish 使用 make && make install 后,发现报错信息:
File "/usr/bin/rst2man"  ModuleNotFoundError: No module named 'docutils'
估计还是python-docutils这个包安装的不对引起的。

# 然后想起了哪个大神说过来着,yum list 里面能搜索到可用的安装包,于是就在yum源里找相关的包:
yum list|grep python 

# 其中有几个关键的行引起了我的注意:

.........    
python3-docutils-doc.noarch             0.14-1.el7                     epel
.........    
python34-docutils.noarch                0.14-1.el7                     epel
.........
python36-docutils.noarch                0.14-1.el7                     epel
.........

#瞬间明白了:因为我的系统是python2(默认)和python3共存,yum inistall python-docutils 是pthon2的#版本

yum uninstall python-docutils

# 因为我是用的python3.7,于是安装了(最接近的版本):
yum install python36-docutils

重要的事情说三遍:

如果系统中有多个版本的python的,必须、一定、千万得注意python-docutils的版本问题!!!!!!!

如果系统中有多个版本的python的,必须、一定、千万得注意python-docutils的版本问题!!!!!!!

如果系统中有多个版本的python的,必须、一定、千万得注意python-docutils的版本问题!!!!!!!

官方推荐要安装的依赖有这些:https://varnish-cache.org/docs/6.3/installation/install_source.html

 

如果安装依赖过程中有报错信息:Error:  Multilib version problems found,表示可能重复安装了部分包,
需要移除,查看pcre包是否重复:

rpm -qa | grep pcre 


移除其中一个即可:

yum remove pcre-8.32-15.el7_2.1.i686

其次,下载安装varnish

cd /home/software
wget  http://varnish-cache.org/_downloads/varnish-6.3.1.tgz
tar -zxvf varnish-6.3.1.tgz
cd varnish-6.3.1

# 检查系统环境
./autogen.sh

# 配置

./configure --prefix=/usr/local/varnish --enable-debugging-symbols --enable-developer-warnings
#  make && make install后,如果依赖包有问题、版本不对的,特别是(python-docutils包),始终通不过,详情请见安装依赖的部分

# 编译、安装
make && make install

# 创建软连接
cd /usr/local/varnish/
ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/
ln -s /usr/local/varnish/bin/* /usr/local/bin       

# 拷贝配置文件模板出来用 
cp /usr/local/varnish/share/doc/varnish/example.vcl /usr/local/varnish/default.vcl

 

 

再次,配置varnish的配置文件:

如何配置、使用、重启等,官方文档:https://varnish-cache.org/docs/6.3/tutorial/index.html

例如我的配置是:

/usr/local/varnish/sbin/varnishd  

# 配置下对外访问的ip和端口
-a 0.0.0.0:9100

# 配置文件中,可以指定静态资源文件服务器的ip和端口
-f /usr/local/varnish/default.vcl  
# 分配32Mb内存,便于测试
-s malloc,32m

# 如果不想手动输入这一大堆的命令,可以把上述命名放到到sh文件中:
cd  /usr/local/varnish
vi startup.sh
# 输入内容:
/usr/local/varnish/sbin/varnishd  -a 0.0.0.0:9100 -f /usr/local/varnish/default.vcl  -s malloc,32m
# 然后保存
:wq
#改成能执行的权限:
chmod -R 777 ./startup.sh

更多参数请使用一下命名进行查阅:

/usr/local/varnish/sbin/varnishd  -help  
或者  
/usr/local/varnish/sbin/varnishd  -?

 

在/usr/local/varnish/default.vcl配置文件中(默认8080端口),需要改下后端配置,修改了成了9000端口,与静态资源文件的web服务器端口一致

 

然后搭建静态资源文件的web服务器,如果是静态资源文件服务端渲染的,则可省略这一步:

yum install -y httpd
 
# yum安装的httpd后,其默认的静态资源文件目录在:/var/www
# 可以尝试新建页面
vi /var/www/html/index.html
<h1>hello world from httpd server</h1>

# 另外还可以改httpd的端口(默认是80,我这里改成9000 用于实验),
vi /etc/httpd/conf/httpd.conf

# 启动
systemctl start httpd
 

ok, 静态资源文件的web服务其已经起来,能访问了,如下图:

 

 

最后,启动varnish,并查看缓存的效果:

cd  /usr/local/varnish
./startup.sh

访问varnish暴露出来的9100端口:

第一次访问:

首次请求时,varnish在响应头中返回的一些参数特征:

1、请求的“Age”为0

2、X-Varnish头信息的后面只有一个数字,就表明varnish在缓存中没有发现这个请求,这个数字的含义是varnish为这个请求所做的标记ID

 

 

第二次访问、第N次访问、第N次强刷浏览器:

 

        需要注意的是varnish返回的响应,varnish会增加三个相应头信息,分别是“X-Varnish”、“Via”和“Age”。这些头信息在Varnish的处理过程中非常有用。

X-Varnish头信息的后面会有一个或两个数字,如果是一个数字,就表明varnish在缓存中没有发现这个请求,这个数字的含义是varnish为这个请求所做的标记ID。如果X-Varnish后是两个数字,就表明varnish在缓存中命中了这个请求,第一个数字是请求的标识ID,第二个数字是缓存的标识ID。

Via”头信息表明这个请求将经过一个代理。

Age”头信息标识出这个请求将被缓存多长时间(单位:秒)。首次请求的“Age”为0,后续的重复请求将会使Age值增大。如果后续的请求没有是“Age”增加,那就说明varnish没有缓存这个响应的结果

这样,varnish就已经生效啦!

 

一些注意事项:

        varnish的默认配置可以适应多数情况。例如,默认的default_ttl缓存过期时间是120秒。配置文件的详细解释可以阅读varnishd的man page。如果你想改变某些默认设置,一种方式是通过命令行varnishd加上-p参数,这将重启varnishd,并清空缓存。另外一种方式是使用varnish的管理接口,要使用varnish的管理接口需要以-T参数启动varnish,这个参数指定了,varnish管理接口的监听端口。然后使用varnishadm命令连接到varnish的管理接口上,然后实时的查询varnish的运行参数,或者更改新的参数,这些都不需要重启varnish。

        想要了解详细的情况,可以参阅varnishd、varnishadm和varnish-cli的man page。

        一般情况下我们会改变varnish的缓存行为,定制自己的缓存策略。可以将配置写入默认的default.vcl文件,VCL(Varnish Configuration Language)是varnish的配置文件的格式,像一种简单的脚本语言。可以通过vcl的man page来了解详细的格式,推荐阅读。

 

参考文档:

varnish源码安装与操作 https://blog.csdn.net/weixin_33974433/article/details/91693041

Varnish是一款高性能的开源HTTP加速器  https://www.cnblogs.com/liu1026/p/7588121.html

使用varnish来做静态文件缓存加速: https://blog.51cto.com/longmu/941234

使用 Varnish 加速你的 Web 网站  https://blog.csdn.net/q6196310920/article/details/47299781

web cache server方案比较: varnish、squid、nginx  https://www.cnblogs.com/kevingrace/p/6188123.html
Varnish、Squid、Ngx_cache性能对比  https://blog.csdn.net/weixin_33979745/article/details/92114264
Varnish VS Nginx测试报告   https://blog.csdn.net/weixin_30813225/article/details/96808403

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值