January 16, 2011
Varnishは標準でvarnishadmコマンドとtelnetによる管理が実装されていますが、VCLを少し記述するとHTTPで操作することもできます。認証がかけられないという問題はありますが、IPアドレスによる制限は可能ですし、Webアプリに組み込むのであればHTTPのほうが楽な気がします。
今回はWebアプリで使う頻度が高いであろうpurgeをHTTPから実行してみます。
methodがPURGEのリクエストが送られてきた場合にはreq.urlをパスの正規表現と解釈してpurgeを行うように記述します。また、以下の例ではHostヘッダで対象とするVirtualHostを指定できるようにしています。
backend app { .host = "127.0.0.1"; .port = "9000"; .connect_timeout = 30s;}// Access Control List// 接続を許可するホストの一覧を記述しているacl purge { "localhost";}sub vcl_recv { if (req.request == "PURGE") { // ~ 演算子を使うとACLに含まれるかどうかを判定できる if (!client.ip ~ purge) { error 405 "Not allowed."; } // パターンにマッチするキャッシュを削除する purge("req.http.host == " req.http.host " && req.url ~ " req.url); error 200 "Purged."; } elsif (req.http.host == "app.example.com") { // purge以外の処理 set req.backend = app; } return(lookup);}
curl -X PURGE -H 'Host: app.example.com' 'http://localhost:6081/posts/' -I
HTTP/1.1 200 Purged.Server: VarnishRetry-After: 0Content-Type: text/html; charset=utf-8Content-Length: 451Date: Sun, 16 Jan 2011 06:35:25 GMTX-Varnish: 528212595Age: 0Via: 1.1 varnishConnection: close
require 'net/http'class Net::HTTP class Purge < Net::HTTPRequest METHOD = 'PURGE' REQUEST_HAS_BODY = false RESPONSE_HAS_BODY = true endendNet::HTTP.start('localhost', 6081) do |http| req = Net::HTTP::Purge.new('/posts/') req['Host'] = 'app.example.com' p http.request(req)end
#&lt;Net::HTTPOK 200 Purged. readbody=true&gt;
EventMachineのほかにEM-HTTP-Requestを使っています。
require 'eventmachine'require 'em-http'class EventMachine::HttpRequest def purge(options = {}, &block) setup_request(:purge, options, &block) endendEventMachine.run do http = EventMachine::HttpRequest.new('http://localhost:6081/posts/').purge(:head => { 'Host' => 'app.example.com' }) http.callback do p http.response EventMachine.stop_event_loop end http.errback do p http.response EventMachine.stop_event_loop endend
&quot;\n&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;utf-8\&quot;?&gt;\n&lt;!DOCTYPE html PUBLIC \&quot;-//W3C//DTD XHTML 1.0 Strict//EN\&quot;\n \&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\&quot;&gt;\n&lt;html&gt;\n &lt;head&gt;\n &lt;title&gt;200 Purged.&lt;/title&gt;\n &lt;/head&gt;\n &lt;body&gt;\n &lt;h1&gt;Error 200 Purged.&lt;/h1&gt;\n &lt;p&gt;Purged.&lt;/p&gt;\n &lt;h3&gt;Guru Meditation:&lt;/h3&gt;\n &lt;p&gt;XID: 528212591&lt;/p&gt;\n &lt;hr&gt;\n &lt;address&gt;\n &lt;a href=\&quot;http://www.varnish-cache.org/\&quot;&gt;Varnish cache server&lt;/a&gt;\n &lt;/address&gt;\n &lt;/body&gt;\n&lt;/html&gt;\n&quot;