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的列表。输出格式为:

  1. ban发布时间
  2. 引用计数
  3. c代表bans完成(被新的ban替代)或者-
  4. 如果lucker调试是开启的话:R代表请求属性或者-, O代表对象属性或者-。
  5. 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"

results matching ""

    No results matching ""