varnish的了解与常用配置使用

Varnish是一款高性能的开源HTTP加速器及反向代理服务器。

varnish架构图:

Varnish 与一般服务器软件类似,分为 master 进程和 child 进程。Master 进程读入存储配置文件,调用合适的存储类型,然后创建 / 读入相应大小的缓存文件,接着 master 初始化管理该存储空间的结构体,然后 fork 并监控 child 进程。Child 进程在主线程的初始化的过程中,将前面打开的存储文件整个 mmap 到内存中,此时创建并初始化空闲结构体,挂到存储管理结构体,以待分配。Child 进程分配若干线程进行工作,主要包括一些管理线程和很多 worker 线程。

接着,开始真正的工作,varnish 的某个负责接收新 HTTP 连接线程开始等待用户,如果有新的 HTTP 连接过来,它总负责接收,然后唤醒某个等待中的线程,并把具体的处理过程交给它。Worker 线程读入 HTTP 请求的 URI,查找已有的 object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。

分配缓存的过程是这样的:它根据所读到 object 的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个 object 的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据 LRU 机制,把最旧的 object 释放掉。

释放缓存的过程是这样的:有一个超时线程,检测缓存中所有 object 的生存期,如果超初设定的 TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。

整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的 object 都考虑是在内存中,如果系统内存不足,系统会自动将其换到 swap 空间,而不需要 varnish 程序去控制。

配置使用varnish

CentOS7上epel源上直接安装使用:varnish-4.0.5

[[email protected] dylan]# yum install varnish epel源

[[email protected] dylan]# cd /etc/varnish/

[[email protected] varnish]# cp varnish.params{,.bak}

[[email protected] varnish]# systemctl start varnish.service

示例:

一台web服务器安装httpd作为后端服务器

[[email protected] ~]# vim /var/www/html/index.html

<h1> Backend Server 1</h1>

varnish主机上编辑:

[[email protected] varnish]# vim default.vcl

backend default {

.host = "192.168.0.150";                 ###后端服务器地址

.port = "80"; ###端口

[[email protected] varnish]# systemctl reload varnish.service

举几个常用示例:

1、.测试缓存命中情况:

[[email protected] ~]# vim /etc/varnish/default.vcl

sub vcl_deliver {

# Happens when we have all the pieces we need, and are about to send the

# response to the client.

#

# You can do accounting or modifying the final object here.

if (obj.hits>0) { ###增加

set resp.http.X-Cache = "HIT";

}   else {

set resp.http.X-Cache = "Miss";

}

}

sub vcl_deliver {

# Happens when we have all the pieces we need, and are about to send the

# response to the client.

#

# You can do accounting or modifying the final object here.

if (obj.hits>0) {

set resp.http.X-Cache = "HIT via" + " " + server.ip;

}   else {

set resp.http.X-Cache = "Miss via" + " " + server.ip;

}

}

###使varnishadm工具来管理

[[email protected] ]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082    ###varnishadm命令

vcl.load test1 default.vcl

200

VCL compiled.

varnish> vcl.use test1

200

VCL ‘test1‘ now active

2、缓存对象修剪

acl purgers {     ###添加访问控制 varnish4.0

"127.0.0.0"/8;

"192.168.0.0"/16;

}

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.url ~"^/test.html$") {

return(pass);

}

if (req.method == "PURGE"){

if (!client.ip ~ purgers){ ###ip不属于定义端内的返回405错误

return(synth(405,"Purging not allow for" + client.ip));

}

return(purge);

}

}

sub vcl_purge {

return(synth(200,"Purged,")); ###修剪

}

管理端:

varnish> vcl.load test9 default.vcl         ###重新配置

200

VCL compiled.

vcl.use test9         ###使用新配置

200

VCL ‘test9‘ now active

3、###设定多个后端主机

backend default {

.host = "192.168.0.150";

.port = "80";

}

backend appsrv { ###定义一个后端主机

.host = "192.168.0.113";

.port = "80";

}

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.url ~"(?i)\.php$") {

set req.backend_hint = appsrv;

}  else {

set req.backend_hint = default;

}

}

vcl.load test10 default.vcl

200

VCL compiled.

vcl.load

varnish> vcl.use test10

200

VCL ‘test10‘ now active

4、设定负载均衡效果:

Directors:

import directors; ###首先import

backend websrv1 { ###定义两个后端主机

.host = "192.168.0.150";

.port = "80";

}

backend websrv2 {

.host = "192.168.0.115";

.port = "80";

}

sub vcl_init {

new websrvs = directors.round_robin();

websrvs.add_backend(websrv1);

websrvs.add_backend(websrv2);

}

sub vcl_recv {

set req.backend_hint = websrvs.backend();

}

管理端使用:

varnish> vcl.load test13 default.vcl

200

VCL compiled.

vcl.use test13

200

VCL ‘test13‘ now active

5、健康状态检测:

backend websrv1 {

.host = "192.168.0.115";

.host = "80";

.prode = {

.url = "/";

.interval = 1s;

.window = 8;

.threshold = 5;

.timeout = 2s;

}

}

.request =

"GET /HTTP/1.1"

"Host: 192.168.0.115"

"connection:Close"

.expected_response=200;

完整性示例:

vcl 4.0;

import directors;

# Default backend definition. Set this to point to your content server.

backend websrv1 {

.host = "192.168.0.150";

.port = "80";

.probe = {

.url = "/";

.interval = 2s;

.window = 5;

.threshold = 4;

}

}

backend websrv2 {

.host = "192.168.0.115";

.port = "80";

.probe = {

.url = "/";

.interval = 2s;

.window = 5;

.threshold = 4;

}

}

sub vcl_init {

new websrvs = directors.round_robin();

websrvs.add_backend(websrv1);

websrvs.add_backend(websrv2);

}

sub vcl_recv {

#    if (req.url ~"(?i)\.php$") {

# set req.backend_hint = appsrv;

#    }  else {

set req.backend_hint = websrvs.backend();

#    }

if (req.url ~"^/login") {

return(pass);

}

if (req.method == "PURGE"){

if (!client.ip ~ purgers){

return(synth(405,"Purging not allow for" + client.ip));

}

return(purge);

}

}

sub vcl_purge {

return(synth(200,"Purged,"));

}

acl purgers {

"127.0.0.0"/8;

"192.168.0.0"/16;

}

sub vcl_backend_response {

if (beresp.http.cache-control !~ "s-masage") {

if (bereq.url ~ "(?i)\.jpg$") {

set beresp.ttl = 7200s;

unset beresp.http.Set-Cookie;

}

if (bereq.url ~ "(?i)\.css$"){

set beresp.ttl = 3600s;

unset beresp.http.Set-Cookie;

}

}

}

sub vcl_deliver {

if (obj.hits>0) {

set resp.http.X-Cache = "HIT via" + " " + server.ip;

}   else {

set resp.http.X-Cache = "Miss via" + " " + server.ip;

}

#    if (beresp.backend.name ~  "appsrv") {

# set resp.htttp.X-Server = "appsrv";

#   }

}

varnish几个常用的命令工具:

varnishadm

varnishtop

varish log entry ranking

varnishlog

varnishlog.service

varnishncsa

varnishncsa.service

varnishstat

Varnish Cache statistics

varnish的运行时参数:                                配置文件中修改全局生效

[[email protected] ~]# vim /etc/varnish/varnish.params

DAEMON_OPTS="-p thread_pools=4"                     ###设置线程池为4

[[email protected] ~]# systemctl restart varnish.service    ###不能随便重启,否则缓存全部失效

[[email protected] varnish]# varnishstat      ###查看状态

附:

变量

內键变量:

req.*:由客户端发来的http请求相关

req.http.*:请求报文各首部

bereq.*:由varnish向backend主机发出的http请求

bere.http.*

beresp.*:由backend主机发来的http响应报文

resp.*: 由varnish响应给client的http响应报文

resp.http.*:响应报文各首部

obj.*:存储在缓存空间的缓存对象属性,只读

client.*,server.*,storage.*:可用在所有的client side 的sub riutines中

自定义: set

常用的变量:

bereq:

bereq.http.HEADERS

bereq.request:请求方法

bereq.url:请求的url

bereq.proto:协议版本

bereq.backend:指明要调用的后端主机

beresp:

beresp.proto

beresp.status:响应的状态码

beresp.reason

beresp.backend.name

baresp.http.HEADERA:

beresp.ttl:后端服务器响应中的内容余下的生存时长

obj:

obj.hits:此对象从缓存中命中的次数;

obj.ttl:对象的ttl值

server:

server.ip

server.hostname

req.method:请求方法

req.url:请求的url

时间: 2024-10-11 04:28:46

varnish的了解与常用配置使用的相关文章

Varnish常用配置详解

实现负载均衡 varnish所支持的调度方式有以下几种: 1.round-robin        #加权轮询,因为每个backend都有它的权重 2.random             #随机 3.dns                #基于DNS名称解析之后进行调度 例: 定义多个backend directorNAME  scheduler {     .retries = 2;     {          .backend = b1;          .weight = 2;   

logback logback.xml 常用配置详解

一:根节点 包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒.当scan为true时,此属性生效.默认的时间间隔为1分钟. debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态.默认值为false. 例如: <configuration scan="true" scan

华为5700系列交换机常用配置示例

华为S5700系列交换机,是我们项目中用的较多的一款,其中24与48口应用较多.现在将华为交换机的一些常用配置整理一下,进行记录.如有错误,请指正. 1 允许telnet(远程登录) 允许华为交换机能telnet,设置密码为[email protected] telnet server en # aaa authentication-scheme default authorization-scheme default accounting-scheme default domain defau

笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <filter>     <filter-name>struts2</filter-name>     <filter-class>org.apache.struts2.di

配置文件入门 - WebConfig.config常用配置节点介绍

一.配置文件入门 .Net提供了一种保存项目配置信息的办法,就是利用配置文件,配置文件的后缀一般是.config.在WinForm程序中配置文件一般是App.config.在Asp.net中一般默认是web.config. 一个.config配置文件都是基于XML的文本文件,并且可以保存到Web应用程序中的任何目录中.在发布Web应用程序时web.config文件并不编译进dll文件中.将来如果客户端发生了变化,仅仅需要使用记事本打开Web.config文本编辑相关的设置就可以重新正常使用,而无

logback logback.xml常用配置详解(三) &lt;filter&gt;

转自:logback logback.xml常用配置详解(三) <filter> logback 常用配置详解(三) <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一.返回DENY,日志将立即被抛弃不再经过其他过滤器:返回NEUTRAL,有序列表里的下个过滤器过接着处理日志:返回ACCEPT,日志会被立即处理,不再经过剩余过滤器. 过滤器被添加到<Appender> 中,为<

logback logback.xml常用配置详解(二)&lt;appender&gt;

logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的组件. <appender>有两个必要属性name和class.name指定appender名称,class指定appender的全限定名. 1.ConsoleAppender: 把日志添加到控制台,有以下子节点: <encoder>:对日志进行格式化.(具体参数稍后讲解 ) &

logback 常用配置详解(二) &lt;appender&gt;

logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的组件. <appender>有两个必要属性name和class.name指定appender名称,class指定appender的全限定名. 1.ConsoleAppender: 把日志添加到控制台,有以下子节点: <encoder>:对日志进行格式化.(具体参数稍后讲解 ) &

logback 常用配置详解&lt;appender&gt;

logback 常用配置详解 <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的组件. <appender>有两个必要属性name和class.name指定appender名称,class指定appender的全限定名. 1.ConsoleAppender: 把日志添加到控制台,有以下子节点: <encoder>:对日志进行格式化.(具体参数稍后讲解 ) <