【前端项⽬-部署必备】使⽤Varnish缓存静态资源⽂件在内存
前⾔
现在都块2020年了,这年代,随便建个⽹站,动不动就是前后端分离的架构。我始终觉得,最合适业务场景的才是最好的架构。像⼀些初创公司、没啥业务量的中⼩型公司,也跟风前后端分离的架构.....实在是⽆⼒吐槽。不过也不能这么以偏概全、⼀概⽽论吧。天晓得⼈家⽹站有多⼤的⾼并发呢。
咳咳...有点扯远了,前后端分离的架构呢,能加快⽹站响应速度。此时的前端项⽬,打包上线后,基本都是些静态资源⽂件,放在服务器的某个⽬录下。
那么如何尽可能以最快的速度让⽤户访问这些静态资源⽂件?这时可以⽤varnish  把静态资源⽂件 缓存在内存中,外⾯再加⼀层Nginx做负载均衡即可。其实Nginx+memcache的⽅式也能把静态资源⽂件缓存在内存中,但需要写额外代码把 静态资源⽂件存⼊memcache。
应⽤场景:
先参考以下两篇⽂章:
总结成⼀句话:在机器资源有限、并发不过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的并发量是,错误率开始上升,详情见本⽂的参考⽂档,有相关的性能测试链接
官⽅⽹站:
安装⽅式:
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
# 其中有⼏个关键的⾏引起了我的注意:
nginx部署前端项目.........
.........
.........
.........
#瞬间明⽩了:因为我的系统是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的版本问题
如果安装依赖过程中有报错信息: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  /_downloads/varnish-6.
tar -zxvf varnish-6.
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的配置⽂件:
例如我的配置是:
/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/f
# 启动
systemctl start httpd
ok,静态资源⽂件的web服务其已经起来,能访问了,如下图:
最后,启动varnish,并查看缓存的效果:
cd  /usr/local/varnish
./startup.sh
访问varnish暴露出来的9100端⼝:
第⼀次访问:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。