varnish-cli
varnish命令行接口
介绍
varnish具有命令行接口(cli),这个可以控制和修改大部分的操作参数以及varnish的配置信息,而不需要打断varnish的运行。 CLI可以用于进行下列任务:
- 配置configuration
你可以在CLI中上传、修改和删除vcl文件。
- 参数 parameters
你可以通过CLI检查并修改各个参数。各个参数在varnishd帮助页面都有介绍。
- bans
bans是用于过滤陈旧的内容。当你发出一个ban之后,varnish将不会从缓存中返回任何被禁掉的对象,但是可以重新从后端服务器拉取内容。
- 流程管理
你可以通过CLI停止或者开启缓存子进程。你也可以检索最新的跟踪堆栈,如果子进程崩溃掉的话。
如果使用-T, -M或者-d参数调用varnishd也是被允许的。在调试模式下(-d),CLI将会在前台,如果使用-T参数,你可以通过varnishadm或者telnet连接它。-M参数varnishd将会连接回监听服务。具体可以查看varnishd了解详情。
语法
长命令在这里可以使用sh风格语法。这里的文档格式是:
<< word
here document
word
当使用当前的文档风格的话,单词长度是不受限制的。当使用回车命令的话,就会受到varnish的cli_buffer参数限制的最大长度。
命令
- help [<command>]
展示命令帮助。
- ping [<timestamp>]
保持连接。
- auth <response>
认证
- quit
关闭连接
- banner
打印欢迎内容
- status
检查varnish缓存处理状态。
- start
开启varnish缓存进程。
- stop
关闭varnish缓存进程。
- vcl.load <configname> <filename> [auto|cold|warm]
编译和加载提供的vcl文件
- vcl.inline <configname> <quoted_VCLstring> [auto|cold|warm]
编译并加载vcl数据。
- vcl.use <configname>
切换到该命名下的配置文件
- vcl.discard <configname>
卸载该命名的配置(如果可能的话)
- vcl.list
列出所有加载的配置
- vcl.show [-v] <configname>
显示指定配置的源代码。
- vcl.state <configname> <state>
强制修改指定配置文件的状态。可以是auto, warm, cold等值。
- param.show [-l] [<param>]
显示参数及其值。
- param.set <param> <value>
设置参数值
- panic.show
如果有的话,返回最后的panic。
- panic.clear [-z]
清除最后的panic,如果有的话。-z将会清除所有相关的varnishstat计数器。
- storage.list
存储设备列表
- backend.list [-p] [<backend_expression>]
后端服务器列表
- backend.set_health <backend_expression> <state>
设置某个后端服务器的状态。值可以是auto,healthy或者sick。
- ban <field> <operator> <arg> [&& <field> <oper> <arg> ...]
当条件匹配时,标记所有的过期内容。
- ban.list
活动ban的列表。输出格式为:
- ban发布时间
- 引用计数
- c代表bans完成(被新的ban替代)或者-
- 如果
lucker
调试是开启的话:R代表请求属性或者-, O代表对象属性或者-。 - ban规范
后端表达式
后端表达式可以是一个后端名字或者是一个由名字、ip地址、端口组成的“name(IP:port)”形式的名字。所有的字段都是可选的。如果没有找到确切匹配的后端,将会基于提供的名字、IP、端口做部分匹配。
示例:
backend.list def*
backend.set_health default sick
backend.set_health def* healthy
backend.set_health * auto
Ban表达式
一个ban表达式可以包含一个或者多个条件。一个条件是由一个字段、一个运算符和一个参数组成。条件可以使用“&&”来进行逻辑与的连接。
一个字段可以是任何VCL变量,例如req.url, req.http.host, obj.http.set-cookie等等。
运算符可以是“==”直接比较,“~”的正则表达式匹配,以及“>”和“<”来做大小比较。同时也可以在前面加上“!”来做否定操作。
参数值可以是一个带引号的字符串,或者一个正则表达式,或者一个整数,整数还可以有“KB”, “MB”, “GB”或者“TB”等相关领域的单位。
VCL热度
一个VCL程序需要经过几个与不同命令相关联的状态:它可以被加载、使用和卸载。你可以加载几个VCL程序,然后在任何时候从一个切换到另外一个。同一时间只会有一个VCL程序是活动状态的,但是上一个活动状态的VCL仍然是有效的,知道它所有的处理都已经结束。
随着时间推移,如果你经常刷新你的VCL并保持之前的版本活动,消耗的资源就会增加,这是你无法逃避的。然而,大多数时候,你应该只需要一个活动状态的VCL即可,并保持旧的VCLs的情况下,你需要可以回滚到之前的版本。
VCL热度可以让你减少非活动VCLs的足迹。一旦VCL热度下降的话,varnish就会释放所有的资源。你可以手动设置VCL的热度,让varnish自动处理。
脚本
如果你打算写一个脚本来通过VCLI与varnishd进行交互的话,include/cli.h包含了相关的很多魔法数。
一个特别神奇的数字你需要知道,那就是状态码和长度字段行都是13个字符长,这里包含了NL字符。
可以供你参考的源文件是lib/libvarnish/cli_common.h,这里包含了用来读写CLI响应的函数。
-S/PSK认证是如何工作的?
如果给varnishd提供了-S secret-file参数的话,所有的网络CLI连接都必须进行认证,通过这个文件内容。
在认证命令发起并且文件内容没有被varnishd缓存时会读取这个文件的内容。
使用unix文件权限控制访问该文件。
认证会话看起来是这样的:
critter phk> telnet localhost 1234
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
107 59
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
Authentication required.
auth 455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a
200 193
-----------------------------
Varnish HTTP accelerator CLI.
-----------------------------
Type 'help' for command list.
Type 'quit' to close CLI session.
Type 'start' to launch worker process.
CLI的107状态表示身份验证是必须的。响应文本的前32个字符是"ixsl...mpg", 这个是为每一个cli连接随机生成的,并且会在每一次107状态时改变。
然后必须使用计算认证符“455c...c89a”来进行验证。
验证器通过SHA256函数来对下面的字节序列进行计算:
- 质询字符串,指“ixsl...mpg”
- 换行符(0x0a)
- 密钥文件内容
- 质询字符串
- 换行符(0x0a)
- dumping the resulting digest in lower-case hex
在上面的例子中,密钥文件包含foon和thus:
critter phk> cat > _
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
foo
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
^D
critter phk> hexdump -C _
00000000 69 78 73 6c 76 76 78 72 67 6b 6a 70 74 78 6d 63 |ixslvvxrgkjptxmc|
00000010 67 6e 6e 73 64 78 73 76 64 6d 76 66 79 6d 70 67 |gnnsdxsvdmvfympg|
00000020 0a 66 6f 6f 0a 69 78 73 6c 76 76 78 72 67 6b 6a |.foo.ixslvvxrgkj|
00000030 70 74 78 6d 63 67 6e 6e 73 64 78 73 76 64 6d 76 |ptxmcgnnsdxsvdmv|
00000040 66 79 6d 70 67 0a |fympg.|
00000046
critter phk> sha256 _
SHA256 (_) = 455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a
critter phk> openssl dgst -sha256 < _
455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a
示例
简单的例子: 所有请求的req.url匹配上字符串/news的时候就从缓存中限制服务:
req.url == "/news"
示例:禁止所有服务主机为example.com或者www.example.com,并从后台 收到Set-Cookie的头包含有"USERID=1663".
req.http.host ~ "^(?i)(www\.)example.com$" && obj.http.set-cookie ~ "USERID=1663"