varnish加速web网站

简介

Varnish可以有效降低web服务器的负载,提升访问速度。根据官方的说法,Varnish是一个cache型的HTTP反向代理。

按照HTTP协议的处理过程,web服务器接受请求并且返回处理结果,理想情况下服务器要在不做额外处理的情况下,立即返回结果,但实际情况并非如此。本文将分析在web服务器处理请求的过程中,Varnish能起到什么作用。

web服务器的实现千差万别,但典型的处理过程是相同的,都要经过一系列的步骤来处理接收到的每个请求。有可能需要启动一个进程来处理请求,有可能需要从磁盘上载入文件,或者启动内部线程来编译执行一些脚本。在执行脚本的过程中,还会有进行很多别的动作,比如进行数据库查询,读取文件等等。当成百上千个请求并发访问时,服务器的负载会很快上升,出现系统资源不够的情况。一种更糟的情况是,很多请求是重复的,但web服务器无法记住曾经作出的响应,还会重复上面复杂的处理过程。

当把Varnish部署上之后,web请求的处理过程会有一些变化。客户端的请求将首先被Varnish接受。Varnish将分析接收的请求,并将其转发到后端的web服务器上。后端的web服务器对请求进行常规的处理,并将依次将处理结果返回给Varnish。

但Varnish的功能并非仅限于此。Varnish的核心功能是能能将后端web服务器返回的结果缓存起来,如果发现后续有相同的请求,Varnish将不会将这个请求转发到web服务器,而是返回缓存中的结果。这将有效的降低web服务器的负载,提升响应速度,并且每秒可以响应更多的请求。Varnish速度很快的另一个主要原因是其缓存全部都是放在内存里的,这比放在磁盘上要快的多。诸如此类的优化措施使得Varnish的相应速度超乎想象。但考虑到实际的系统中内存一般是有限的,所以需要手工配置一下缓存的空间限额,同时避免缓存重复的内容。

下面来看一下Varnish的安装过程。

varnish安装

https://packagecloud.io/varnishcache/varnish63/packages/el/7/varnish-6.3.2-1.el7.x86_64.rpm

https://pkgs.org/ 找包工具(jemalloc-3.6.0-1.el7.x86_64.rpm)依赖包

找不到的同学可在我的资源进行下载。

下载好后直接安装就可以

服务配置(每次修改都需要重启)

  • 修改varnish用户限制文件

[root@server2 ~]# vim /usr/lib/systemd/system/varnish.service

# Maximum number of open files (for ulimit -n)
LimitNOFILE=131072              #打开文件数

# Locked shared memory - should suffice to lock the shared memory log
# (varnishd -l argument)
# Default log size is 80MB vsl + 1M vsm + header -> 82MB    #内存锁定
# unit is bytes
LimitMEMLOCK=85983232

查看当前系统配置可打开文件数

[root@server2 ~]# sysctl -a | grep file
fs.file-max = 200904         #如果小于varnish需求就增加内存
fs.file-nr = 896    0    200904
fs.xfs.filestream_centisecs = 3000

修改系统限制文件

# End of file
varnish     -     nofile        131072
varnish        -    memlock        82000

  • 修改varnish服务端口

[root@server2 ~]# vim /usr/lib/systemd/system/varnish.service

ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6081 -f /etc/varnish/default.vcl -s malloc,256m

  • 配置后端web服务器
  • 告知varnish

[root@server2 ~]# cat /etc/varnish/default.vcl

backend default {
    .host = "172.25.254.3";
    .port = "80";
}

  • 测试:

[root@server2 ~]# curl 172.25.254.1

server3

varnish的cache

[root@server2 ~]# vim /etc/varnish/default.vcl

sub vcl_deliver {     #在缓存数据将要发送到客户端时调用

if (obj.hits > 0){
        set resp.http.X-Cache = "Hit from server2 cache";
}
else{
        set resp.http.X-Cache = "Miss from server2 cache";   #resp.http由varnish响应给客户端的报文首部
}
return (deliver);
}

  • 测试

[root@server4 ~]# curl -I bbs.westos.org
HTTP/1.1 200 OK
Date: Wed, 19 Feb 2020 10:36:28 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Wed, 19 Feb 2020 06:32:06 GMT
ETag: "17-59ee7f279264f"
Content-Length: 23
Content-Type: text/html; charset=UTF-8
X-Varnish: 32773 32771
Age: 7
Via: 1.1 varnish (Varnish/6.3)
X-Cache: Hit from server2 cache
Accept-Ranges: bytes
Connection: keep-alive

  • 清除varnish缓存

[root@server2 ~]# varnishadm ban req.url "~" /      #再次测试报文头部为MISS

[root@server2 ~]# varnishadm ban req.url "~" /index.html


varnish多个后端

[root@server2 ~]# vim /etc/varnish/default.vcl

backend web1 {
    .host = "172.25.254.3";
    .port = "80";
}
backend web2 {
    .host = "172.25.254.4";
    .port = "80";
}

sub vcl_recv {
        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));
}

}

vcl_recv

vcrl_recv是http请求到达后的第一个状态,在这个状态中,可以对请求进行以下的一些处理

1.修改client请求,以减少缓存决策时的差异性

2.根据client请求决定缓存策略

3.重定向请求

4.决定请求的backend

在缓存数据将要发送到客户端时调用

  • 测试(先要在测试主机进行本地解析)

[root@server4 ~]# curl  bbs.westos.org
server4
[root@server4 ~]# curl  www.westos.org
server3

  • varnish多个后端之间实现负载均衡

在server4上配置虚拟主机

[root@server4 ~]# vim /etc/httpd/conf.d/vhost.conf

<VirtualHost *:80>
        DocumentRoot /www
        ServerName www.wetos.org
</VirtualHost>
<Directory "/www">
        Require all granted
</Directory>

<VirtualHost *:80>
        DocumentRoot /bbs
        ServerName bbs.wetos.org
</VirtualHost>
<Directory "/bbs">
        Require all granted
</Directory>

[root@server4 ~]# cat /www/index.html
server4:www.westos.org
[root@server4 ~]# cat /bbs/index.html
server4:bbs.westos.org


配置varnish

[root@server2 ~]# vim /etc/varnish/default.vcl

vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";

sub vcl_init {
        new lb = directors.round_robin();      #轮询
        lb.add_backend(web1);
        lb.add_backend(web2);
}

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
        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@server2 ~]# vim /etc/varnish/default.vcl

sub vcl_recv {
        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@server4 ~]# curl  www.westos.org
server3
[root@server4 ~]# curl  www.westos.org
server4:www.westos.org
[root@server4 ~]# curl  www.westos.org
server3
[root@server4 ~]# curl  www.westos.org
server4:www.westos.org

varnish cdn 推送管理

  yum insatll php -y
  unzip bansys.zip -d /var/www/html/
  mv /var/www/html/bansys/* /var/www/html/

  cd /var/www/html/
  vim config.php

 

  更改apache端口为8080

更改varnish配置

acl westos {
"127.0.0.1";
"172.25.254.0"/24;
}

sub vcl_recv {
    if (req.method == "BAN") {
        if (!client.ip ~ westos){
            return(synth(405,"Not allowed"));
    }
    ban("req.url ~ " + req.url);
        return(purge);
    }

}

 

  重启服务

  • 测试

 

[root@server4 ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Date: Thu, 20 Feb 2020 03:24:57 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Wed, 19 Feb 2020 03:11:21 GMT
ETag: "8-59ee52486b54d"
Content-Length: 8
Content-Type: text/html; charset=UTF-8
X-Varnish: 10 32777
Age: 4
Via: 1.1 varnish (Varnish/6.3)
X-Cache: Hit from server2 cache
Accept-Ranges: bytes
Connection: keep-alive

[root@server4 ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Date: Thu, 20 Feb 2020 03:25:35 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Wed, 19 Feb 2020 03:11:21 GMT
ETag: "8-59ee52486b54d"
Content-Length: 8
Content-Type: text/html; charset=UTF-8
X-Varnish: 14
Age: 0
Via: 1.1 varnish (Varnish/6.3)
X-Cache: Miss from server2 cache
Accept-Ranges: bytes
Connection: keep-alive

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值