使用Varnish来让你的网站“起飞”

想要更好的阅读体验,以及更多干货,请直接移步个人站点进行阅读:

www.pilishen.com/posts/speed…css

假设你用PHP和nginx搭建了本身的一个博客,这很棒。从服务器角度,每当有人访问了你的文章页面时,你的网站就会作一系列的、重复的任务,好比说获取一个几乎不怎么变化的文章内容。html

假设访客A访问了这个文章页面,文章内容从数据库里获取了,包括图片、css、js等,都要从服务器加以获取。当访客B, C, D等访问了这一样一个没有作过内容改动的文章,一样的内容就会被服务器重复地获取,每次都要访问数据库,都要去找图片、css、js那些。linux

如今假设一天里那个页面有1,000,000 访问者,那么你的服务器就得处理1,000,000次访问,去供应那么多的资源,处理那么多的数据库查询,最终你的站点就会愈来愈慢,甚至中止响应,当服务器用光了工做进程或者链接的时候。nginx

要避免这种状况,你就须要用上Varnish了。laravel

准备工做

在进行下面的测试以前,你须要先有个linux系统,固然能够是本地的虚拟机,好比咱们的vagrant homestead,也能够是线上服务器,固然若是是生产服务器,就须要提醒你特别当心咯。这里的测试用的是ubuntu,其它linux版本的细小差别在此不作赘述。web

其次呢,你的这个服务器上最好有个nginx站点能够用来测试,固然了,用任何一个你的本地开发站点来测试就行了。数据库

在继续进行以前,你能够用http-header-checker工具来查看一下你的站点,能够获得相似信息:ubuntu

file

固然了,你也能够用任何喜欢的工具来查看header,这里咱们varnish尚未运行,因此就看不到一个 “X-Varnish”的header,这个header暗示着当前网站是跑在varnish后面的。后端

安装Varnish

再简单不过了缓存

sudo apt-get install -y varnish
复制代码

就行了,安装完之后,能够在下面两个目录里找到相应配置文件:

  1. /etc/default/varnish
  2. /etc/varnish/default.vcl

配置Varnish来监听80端口

默认呢,varnish监听的是6081端口,但咱们的网站通常是在80端口,因此咱们得改一下。

固然了,改以前,你能够用你的网站ip访问一下6081 端口,能够看到相似的varnish报错页面:

file

首先呢,咱们改一下nginx的站点配置,让它再也不使用80端口,以免端口冲突。这里个人测试站点配置文件在/etc/nginx/sites-available/default里,你能够相应更改你本身的nginx配置:

server {
        listen 8080 default_server;
        listen [::]:8080 default_server;

        # Leave the other configuration items intact...
    }
复制代码

咱们让nginx站点默认监听8080端口,如今记得从新加载一下nginx好让配置生效:sudo service nginx reload,而后你再用ip或站点域名去访问8080端口,应该还能看见以前的测试站点页面。

接下来该更改varnish配置了,找到这个文件:/etc/default/varnish

## Alternative 2, Configuration with VCL
    #
    # Listen on port 6081, administration on localhost:6082, and forward to
    # one content server selected by the vcl file, based on the request.
    #
    DAEMON_OPTS="-a :6081 \ -T localhost:6082 \ -f /etc/varnish/default.vcl \ -S /etc/varnish/secret \ -s malloc,256m"
复制代码

将其中的-a :6081 更改为 -a :80,这样呢就将varnish的前台监听端口设置到80端口了。

接下来呢,还要让varnish的后台去监听一下咱们的站点,毕竟它要替咱们从nginx站点里拉取内容,加以缓存,而后返回给前台。这个时候找到/etc/varnish/default.vcl这个配置文件

# Default backend definition. Set this to point to your content server.
    backend default {
        .host = "127.0.0.1";
        .port = "8080";
    }
复制代码

能够看到默认的varnish后端,监听的就是咱们的本地主机,并且端口就是8080,也即它可以从咱们8080的nginx站点拉取内容。因此这里咱们不须要更改什么,确认一下就行了。

添加varnish到系统服务中

接下来咱们须要将varnish.service这个文件添加到系统服务中,这样咱们能够用systemd 相关命令来在80端口开启varnish服务

$ sudo cp /lib/systemd/system/varnish.service /etc/systemd/system/
$ sudo nano /etc/systemd/system/varnish.service
复制代码

上面,咱们将varnish.service服务文件拷贝到了系统服务目录下,而后第二个命令是打开这个服务文件,默认是这样的:

ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
复制代码

一样的,将里面-F -a :6081改为-F -a :80,里面的localhost:6082不用动,保存退出,而后执行下面的一系列命令,来从新加载一下系统服务,重启varnish和nginx:

$ sudo systemctl daemon-reload
$ sudo systemctl reload varnish.service
$ sudo service varnish restart
$ sudo service nginx restart
复制代码

测试一下header,确保varnish正常运行

{id="performance"}

这个时候再访问咱们的站点,检查header部分,应该能看到相似结果:

file

能够看到多了几个header:X-VarnishAgeVia,这些是varnish引入进来的,说明咱们的varnish在运行了。

这个时候你再访问你的站点,你会发现,第一次访问事后,接下来的页面访问都会极其极其地快。固然这也取决于你的站点设置,若是你某个页面明确设置了不能缓存的Cache-Control header,那么默认varnish就不给你缓存这个页面,固然这些后期均可以具体更改调试。

那么正常状况下,你在开发者工具栏里会看到以下的性能表现:

file

能够看到传输数据很小,后面的资源直接从cache中加载,不须要请求时间了。

结论和进阶

{id="concolusion"}

Varnish是一个很伟大的开源缓存软件,使用恰当的话可让你的网站极其、极其地快。固然了,缓存层永远是一把双刃剑,若是你使用不恰当,也会搞乱不少东西,让你茫然不知所措。Varnish呢既然是个强大的缓存代理软件,它确定也就不仅仅咱们上面展现的那么简单,是,你能够上面那样默认安装配置,就已经能给你带来很多性能提高,可是你要是想真正掌握好它,想真正发挥它的强大之处,那这些确定是远远不够的,这里呢咱们只是让你们初步体验,感觉一下,便于进一步进阶。

想深刻了解varnish的原理和机制,用最短的时间成为varnish高手,让你的生产环境的站点尽快体验上varnish,这里进一步推荐的资源就是咱们的《【laravel国际会议】使用Varnish来构建应用“缓存层”和负载均衡》,这个是在laravel的国际会议laracon上,咱们的主讲嘉宾Mattias分享了varnish相关的方方面面,让本来复杂恐怖的varnish缓存层,一会儿变得简单和可操做起来。

  • 好比说你想学习如何清空varnish中的缓存,当你某个内容更新了之后;
  • 或者说你想更改varnish缓存的时间,或者想让你的网站即便挂掉了,用户依然无感知,依然能看到varnish缓存里的版本,这样你就有足够的时间去停机维护什么的;
  • 或者说你想单纯看看你的缓存命中率怎么样,是否大部分页面都重复用起了缓存;
  • 或者你某个页面,虽而后端的应用程序好比laravel,设置了说不要缓存,但你如何在varnish里仍是缓存它呢?
  • 再或者,如何把一个页面,好比你的站点首页,分红不少个部分来缓存呢,好比你的页面导航栏,并不怎么常常改变,如何单独缓存这块呢?也即一个html页面,varnish均可以帮你拆分红不一样部分来缓存,很神奇,不是吗?

固然了,更多的,请自行学习这个专场吧,别担忧,虽然是英文大佬,可是咱们都给你静心翻译,带上中文字幕了。

file

《【laravel国际会议】使用Varnish来构建应用“缓存层”和负载均衡》

末了,欢迎到个人站点https://www.pilishen.com/来作客哦,也欢迎加入咱们的公开群【公开课@pilishen.com】:109256050,等你哦~

相关文章
相关标签/搜索