varnish-配置-01

varnish程序

varnish程序环境:

  • /etc/varnish/varnish.params:

配置varnish服务进程的工作特性,例如监听的地址和端口,缓存机制;
Unit File: EnvironmentFile=""

  • /etc/varnish/default.vcl:

配置各Child/Cache线程的缓存策略;
VCL: dsl, subroutines, 子例程

  • 主程序:
    /usr/sbin/varnishd
  • CLI interface:
    /usr/bin/varnishadm
  • Shared Memory Log交互工具:

/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtop

  • 测试工具程序:
    /usr/bin/varnishtest

VCL配置文件重载程序:

  • /usr/sbin/varnish_reload_vcl
    Systemd Unit File:
  • /usr/lib/systemd/system/varnish.service

varnish服务

  • /usr/lib/systemd/system/varnishlog.service
  • /usr/lib/systemd/system/varnishncsa.service
    日志持久的服务;

varnish程序的选项:

程序选项:/etc/varnish/varnish.params文件

-a address[:port][,address[:port][...],默认为6081端口;

-T address[:port],默认为6082端口;

-s [name=]type[,options],定义缓存存储机制;

-u user

-g group

-f config:VCL配置文件;

-F:运行于前台;

...

运行时参数:/etc/varnish/varnish.params文件, DEAMON_OPTS

DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"

-p param=value:设定运行参数及其值; 可重复使用多次;
-r param[,param...]: 设定指定的参数为只读状

 

重载vcl配置文件

~ ]# varnish_reload_vcl

 

varnishadm工具命令

-S /etc/varnish/secret -T [ADDRESS:]PORT

  • help [<command>]
  • ping [<timestamp>]    #探测服务器存活性
  • auth <response>    #认证
  • quit    #退出
  • banner    #输出欢迎信息
  • status    #
  • start    #
  • stop    #
  • vcl.load <configname> <filename>     #重新加载vcl配置文件
  • vcl.inline <configname> <quoted_VCLstring>     #
  • vcl.use <configname>    #切换ucl
  • vcl.discard <configname>    #生成ucl
  • vcl.list     #列出正在使用的vcl
  • param.show [-l] [<param>]     #
  • param.set <param> <value>    #
  • panic.show    #排故障用的
  • panic.clear    #
  • storage.list    #列出用的存储系统
  • vcl.show [-v] <configname>    #查看配置信息
  • backend.list [<backend_expression>]    #列出后端服务器
  • backend.set_health <backend_expression> <state>    #
  • ban <field> <operator> <arg> [&& <field> <oper> <arg>]...    #
  • ban.list     #

配置文件相关:

vcl.list
vcl.load:装载,加载并编译;
vcl.use:激活;
vcl.discard:删除;
vcl.show [-v] <configname>:查看指定的配置文件的详细信息;

运行时参数:

param.show -l:显示列表;
param.show <PARAM>
param.set <PARAM> <VALUE>

缓存存储:

storage.list

后端服务器:

backend.list

 

varnish.params配置文件

  • RELOAD_VCL=1    #每次启动varnish重载vcl
  • VARNISH_VCL_CONF=/etc/varnish/default.vcl    #vcl配置文件
  • VARNISH_LISTEN_PORT=6081    #监听端口面向客户端
  • VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1    #管理地址
    VARNISH_ADMIN_LISTEN_PORT=6082    #管理端口
  • VARNISH_SECRET_FILE=/etc/varnish/secret    #双方域共享的密钥
  • VARNISH_STORAGE="malloc,256M"    #缓存大小
    VARNISH_STORAGE="file,/app/varnish.bin,20G"    ##磁盘缓存格式
  • VARNISH_USER=varnish
    VARNISH_GROUP=varnish

 

示例1:强制对某类资源的请求不检查缓存:

说明:要想不检查缓存一定是在vcl_hash之前

vim /etc/varnish/default.vcl

vcl_recv {
		if (req.url ~ "(?i)^/(login|admin)") {
			return(pass);
			}
	}

示例2:对于特定类型的资源,例如公开的图片等,取消其私有标识,并强行设定其可以由varnish缓存的时长; 定义在vcl_backend_response中;

if (beresp.http.cache-control !~ "s-maxage") {
			if (bereq.url ~ "(?i)\.(jpg|jpeg|png|gif|css|js)$") {
				unset beresp.http.Set-Cookie;
				set beresp.ttl = 3600s;
			}
		}

示例3:显示真实访问IP地址,定义在vcl_recv中

利用请求报文首部X-Forwarded-For

if (req.restarts == 0) {
		if (req.http.X-Fowarded-For) {
			set req.http.X-Forwarded-For = req.http.X-Forwarded-For + "," + client.ip;
		} else {
			set req.http.X-Forwarded-For = client.ip;
		}
	}

备注:后端服务器要更改下配置

vim /etc/httpd/conf/httpd.conf

LogFormat "%{X-Forwarded-For}i...

 

缓存对象的修剪:purge, ban

定义:也就是说,一些css,js等缓存几个小时或几十个小时,而这中间我们更改了css,js等文件,这时候我们把老的css,js缓存清掉,让读取新的缓存。

varnish缓存项清理方式:

  • purge:修剪,一次只能修剪一个url,适合针对3.2个,多个效率就低了。
  • ban:一次生效,支持正则表达模式定义过滤器以拒绝某些url对应的缓存项查缓存的请求,使而不得不去后端去取数据。

purge:添加此类请求的访问控制法则

#限定用户访问控制
acl purgers {
"127.0.0.0"/8;
"10.1.0.0"/16;
}

sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purgers) {
return(synth(405,"Purging not allowed for " + client.ip));
}
return(purge);
}
...
}
客户端测试
curl -X "PURGE" 172.18.131.242:6081/index.html
curl -I 172.18.131.242:6081/index.html

ban:方式(一次生效)

(1) varnishadm:

ban <field> <operator> <arg>

示例:

ban req.url ~ (?i)^/javascripts

ban req.url ~ (?i)^/test[123].html$    #清理test1、test2、test3.html文件缓存

(2) 在配置文件中定义,使用ban()函数

示例:
if (req.method == "BAN") {
	ban("req.http.host == " + req.http.host + " && req.url == " + req.url);
	# Throw a synthetic page so the request won't go to the backend.
	return(synth(200, "Ban added"));
}	
					
					
curl -X BAN http://www.liuxiaosi.com.cn/test1.html
					
ban req.http.host==www.liuxiaosi.com.cn && req.url==/test1.html

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注