Loading... <p>Varnish是一款高性能的开源HTTP加速器(其实就是带缓存的反向代理服务),可以把http响应内容缓存到内存或文件中,从而提高web服务器响应速度。与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来</p> <p>Varnish程序结构</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703152210-83.jpg" title="1448712548481916.jpg" alt="wKiom1WdOjjQ8WCbAAFUjsrr5iY407.jpg" /></p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703152210-71.gif" alt="clip_image002" /></p> <p>管理进程:编译VCL并应用新配置、监控varnish、初始化varnish,并提供一个CLI,初始化缓存的内存结构,对缓存内存结构实现分成各个类型大小的内存块。</p> <p>Child/Cache线程有几类:</p> <p> Acceptor:接收新的连接请求;</p> <p> Worker:用于处理并响应用户请求;</p> <p> Expiry:从缓存中清理过期cache object</p> <p> </p> <p>日志:Shared Memory Log, 共享内存内存日志大小一般90MB;分为两部分:前一部分为计数器、后一部分为客户请求相关的数据。</p> <p>对varnish内的缓存数据的有效管理:</p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> Expires:定义一个缓存时长,过了缓存时长就认为缓存失效。</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-size: 10.5pt;line-height: 1.5">http validation</span></p> <p><span class="Apple-tab-span"> </span>If-Modified-Since/Last Modified : 每次客户端请求缓存内容,varnish会向后端主机询问这个缓存对象自它缓存的时间开始时有没有改变,没改变的话会返回一个304,证明可以返回varnish内的缓存内容,如果改变了,需要向后端请求该内容返回给客户端。</p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family:微软雅黑">If-None-Match/Etag:会对varnish的缓存内容一个标签和一个缓存时间,过了这个时间,向后端主机询问这个缓存内容的标签是否有改变,没改变的话这个缓存内容增加其缓存时间。</span></p> <p><span style="font-family:微软雅黑"><br /></span></p> <p>Vcl内置函数和处理流程(状态引擎)</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703152210-89.jpg" title="1448712664975251.jpg" alt="wKiom1WdOjrS1nfvAAHj5JDxUZ4356.jpg" /></p> <p>Vcl内置函数:vcl配置的缓存策略在此些内置函数发挥作用;</p> <p>vcl_recv:用于接受和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。例如如何响应、怎么响应、使用哪个后端服务器等。</p> <p>vcl_fetch:根据服务器端的响应作出缓存决策,如判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。</p> <p>vcl_pipe:对于无法理解的用户请求,将请求直接发往后端主机;</p> <p>vcl_hash:自定义hash生成时的数据来源</p> <p>vcl_pass:用于将请求直接传递至后端主机,后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存。</p> <p>vcl_hit:从缓存中查找到缓存对象时要执行的操作;</p> <p>vcl_miss:从缓存中款查找到缓存对象时要执行的操作;</p> <p>vcl_deliver:将用户请求的内容响应给客户端时用到的方法;</p> <p>vcl_error:在varnish端合成错误响应而时;</p> <p>vcl的配置语法:</p> <p> (1) //, #, /*comment*/用于注释;</p> <p> (2) sub $NAME 用于定义函数;</p> <p> (3) 不支持循环;</p> <p> (4) 有众多内置变量;</p> <p> (5) 支持终止语句,没有返回值;</p> <p> (6) “域”专用语言;</p> <p> (7) 操作符: =, ==, ~, !, &&, ||</p> <p> </p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703152210-71.gif" border="0" alt="wKiom1WdOjrS1nfvAAHj5JDxUZ4356.jpg" /></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span></p> <p>常用变量:</p> <p> 1、在任何引擎中均可使用:</p> <p> Now:获取当前系统当前时间</p> <p>.host:获取当前主机名和ip地址</p> <p>.port:后端服务器名称和端口</p> <p> </p> <p> 2、用于处理请求阶段:</p> <p> client.ip,server.hostname, server.ip, server.port :都不解释</p> <p> req.request:请求方法</p> <p> req.url:请求的URL</p> <p> req.proto:HTTP协议版本</p> <p> req.backend:用于服务此次请求的后端主机;</p> <p> req.backend.healthy:后端主机健康状态;</p> <p> req.http.HEADER:引用请求报文中指定的首部;</p> <p> req.can_gzip:客户端是否能够接受gzip压缩格式的响应内容;</p> <p> req.restarts:此请求被重启的次数;</p> <p> </p> <p> 3、varnish向backend主机发起请求前可用的变量</p> <p> bereq.request:请求方法</p> <p> bereq.url:请求url</p> <p> bereq.proto:HTTP协议版本</p> <p> bereq.http.HEADER:调用服务此次请求的后端主机的报文首部</p> <p> bereq.connect_timeout:等待与beckend建立连接的超时时长</p> <p> </p> <p> 4、backend主机的响应报文到达本主机(varnish)后,将其放置于cache中之前可用的变量</p> <p> beresp.do_stream:流式响应(接收一个请求,响应一个请求)</p> <p> beresp.do_gzip:是否压缩之后再存入缓存;</p> <p> beresp.do_gunzip:如果从后端收到压缩格式的报文,是否解压缩在存放下来</p> <p> beresp.http.HEADER:获取httpd的首部信息</p> <p> beresp.proto:HTTP协议版本</p> <p> beresp.status:响应状态码</p> <p> beresp.response:响应时的原因短语</p> <p> beresp.ttl:响应对象剩余的生存时长,单位为秒钟;</p> <p> beresp.backend.name:此响应报文来源backend名称;</p> <p> beresp.backend.ip:获取后端响应ip</p> <p> beresp.backend.port:获取后端响应端口</p> <p> beresp.storage:强制varnish将缓存存储到缓存后端</p> <p> </p> <p> 5、缓存对象存入cache之后可用的变量</p> <p> obj.proto:响应时使用的协议</p> <p> obj.status:响应时使用的状态码</p> <p> obj.response:服务器返回响应报文的状态码</p> <p> obj.ttl:缓存对象生存时长</p> <p> obj.hits:缓存对象被用作响应时的次数</p> <p> obj.http.HEADER:调用对应的响应报文</p> <p> </p> <p> 6、在决定对请求键做hash计算时可用的变量</p> <p> req.hash:指明把什么作为hash的键,作为缓存的键</p> <p> </p> <p> 7、在为客户端准备响应报文时可用的变量</p> <p> resp.proto:指明使用什么协议响应</p> <p> resp.status:执行响应状态吗</p> <p> resp.response:返回响应的状态码</p> <p> resp.http.HEADER:调用响应报文状态码</p> <p></p> <p>变量在各状态引擎使用情况:</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703152210-18.jpg" title="1448712759346588.jpg" alt="wKiom1WdOkLQKbelAAF0SUqSJgU337.jpg" /></p> <p>varnish配置实例:</p> <p>/etc/sysconfig/varnish 是定义varnish运行特性的配置文件;</p> <p>/etc/varnish/default.vcl 是定义varnish的默认状态引擎的工作配置文件(使用vcl语言定义)</p> <p>(1)定义varnish后端多主机的实例:</p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-size: 10.5pt;line-height: 1.5">backend bs1 {</span></p> <p> .host = "www2.bwei.com";</p> <p> .port = "80";</p> <p>}</p> <p> </p> <p> </p> <p>backend bs2 {</p> <p> .host = "www3.bwei.com";</p> <p> .port = "80";</p> <p>}</p> <p> </p> <p>director bs random {</p> <p>{ .backend = bs1; .weight=1; }</p> <p>{ .backend = bs2; .weight=2; }</p> <p>}</p> <p> </p> <p>sub vcl_recv {</p> <p> if (req.url ~ "index.html"){</p> <p> set req.backend = bs;</p> <p>}</p> <p>}</p> <p>这里的director是实现调度器的角色,实现把两个后端server合在一起,配置他们的权值及后端server的调度方式,这里有一重点,我们定义了后端server要在vcl_recv这个函数中调用,即定义那个资源要调配到那个后端server上。</p> <p>(2)实现给客户端的响应报文中,增加一个首部,给用户看是否缓存命中。</p> <p>sub vcl_deliver{</p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> if (obj.hit >0){</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> set resp.http.X-cache = "hit via"+" "+server.hostname;</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}else{</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> set resp.http.X-cache = "miss via"+" "+server.hostname;</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}</span></p> <p>}</p> <p>(3)实现让某些主机可以删除varnish主机上的缓存:</p> <p><span style="font-family:微软雅黑">acl purgers {</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> 127.0.0.1;</span><span style="font-family:微软雅黑"><br /></span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> 192.168.179.0; /24</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family:微软雅黑">}</span></p> <p><span style="font-family:微软雅黑">sub vcl_recv{</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> if (client.ip !~ purgers && req.request == "PURGE"){</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> error 405 "method not allowed";</span><span style="font-family:微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-size: 10.5pt;line-height: 1.5;font-family: 微软雅黑"> </span><span style="font-size: 10.5pt;line-height: 1.5;font-family: 微软雅黑"> </span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}</span><span style="font-family:微软雅黑"><br /></span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> return (lookup);</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family:微软雅黑">}</span></p> <p><span style="font-family:微软雅黑"><br /></span></p> <p><span style="font-family:微软雅黑">sub vcl_hit{</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> if (req.request == "PURGE"){</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> purge;</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> error 200 "cache has purge";</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}</span><span style="font-family:微软雅黑"><br /></span></p> <p><span style="font-family:微软雅黑">}</span></p> <p><span style="font-family:微软雅黑"><br /></span></p> <p><span style="font-family:微软雅黑">sub vcl_miss{</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> if(req.request == "PURGE"){</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> purge;</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> error 404 "not in cache";</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}</span><span style="font-family:微软雅黑"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">sub vcl_pass{</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> if(req.request == "PURGE"){</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> error 502 "purge object not allowed in pass"</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family:微软雅黑">}</span></p> <p><span style="font-family:微软雅黑"><br /></span></p> <p><span style="font-family:微软雅黑">实现给varnish解析不了的方法,送到pipe上:</span></p> <p>if ( req.request != "GET"&&</p> <p> req.request != "HEAD"&&</p> <p> req.request != "PUT"&&</p> <p> req.request != "POST"&&</p> <p> req.request != "TRACE"&&</p> <p> req.request != "OPTIONS"&&</p> <p> req.request != "DELETE"&&</p> <p> req.request != "PURGE" ){ return (pipe);</p> <p>实现让除GET,HEAD,PURGE的方法可以到达hash状态引擎,其余到达pass引擎</p> <p>if (req.request != "GET" && req.request != "HEAD" && req.request != "PURGE"){</p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> return (pass);</span></p> <p>}</p> <p>从后端主机获取资源后,设定其缓存时间和不缓存cookie信息</p> <p>sub vcl_fetch{</p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> set beresp.ttl = 15s;</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> if (beresp.http.Set-Cookie){</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> return (pass)</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">return (deliver);</span></p> <p>}</p> <p>从后端主机获取资源后,设置那些不能缓存的数据不进行缓存</p> <p>sub vcl_fetch{</p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> if(!beresp.cacheable){</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> return (pass);</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"><br /></span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> if(beresp.http.Pragma ~"no-cache" ||</span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> beresp.http.Cache-Control ~ "no-cache" || </span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> beresp.http.Cache-Control ~ "private"</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">){</span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> return (pass);</span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span></p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5">}</span></p> <p>}</p> <p>设置客户端请求我们的varnish出现认证和cookie时,把它们直接送去pass引擎</p> <p>if(req.http.Authorization || req.http.Cookie){</p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> return (pass);</span></p> <p>}</p> <p>设置对后端主机进行健康状态检查:</p> <p>probe healthcheck {</p> <p> .url = "/health.html";</p> <p> .interval = 60s;</p> <p> .timeout = 0.3s;</p> <p> .window = 8; </p> <p> .threshold = 3;</p> <p> .initial = 3;</p> <p> .expected_response = 200;</p> <p>}</p> <p>backend bs1 {</p> <p> .host = "www2.bwei.com";</p> <p> .port = "80";</p> <p> .probe = healthcheck;</p> <p>}</p> <p> </p> <p> </p> <p>backend bs2 {</p> <p> .host = "www3.bwei.com";</p> <p> .port = "80";</p> <p> .probe = healthcheck;</p> <p>}</p> <p>varnish的配置段需要我们对其进行编译才能运行,我们对其每次对其进行改变都需要重新编译和使用:</p> <p><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-size: 10.5pt;line-height: 1.5">varnishadm管理软件可以实现vcl语言编译:vcl.load <name> <filename>(加载vcl配置)</span></p> <p><span style="font-family:微软雅黑"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> </span><span style="font-family: 微软雅黑;font-size: 10.5pt;line-height: 1.5"> vcl.use <name> (使用vcl配置)</span></p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信