Varnish4でエラーページをカスタマイズする

varnish

vcl_backend_errorvcl_synth の2種類のエラー

Varnish3 でエラーページをカスタマイズにはサブルーチン vcl_error 内でゴニョゴニョやればよかった。

Varnish4 では

  • バックエンドサーバで発生したエラーはサブルーチン vcl_backend_error で処理
  • VCL 内で synth キーワード(3.* 時代の error)を使って生成された synthetic object はサブルーチン vcl_synth で処理

するように変わった。

例えば、オリジンサーバで 500 番台系のシステムエラーが発生した場合のメッセージは、昔ながらの vcl_synth を修正しても何も変わらず、 vcl_backend_error でカスタマイズしなければいけない。

違いのわかる設定例

この2種類のエラーの違いを実際に確認してみる。

利用する default.vcl は次のもの。

オリジンサーバは localhost:8080 に設定。このサーバは落としておいて、backend fetch が失敗して 500 番台を返すようにしておく。
また、 http://HOST:PORT/404 という URL にアクセスすると、 synth(status_code, reason) で synthetic object を生成して 404 を返すことにしておく。

vcl 4.0;
import std;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    if (req.url ~ "^/404") {
        return (synth(999, "make 404 error explicitly"));
    }
}

sub vcl_backend_response {
}

sub vcl_deliver {
}

sub vcl_backend_error {
    set beresp.http.Content-Type = "text/html; charset=utf-8";
    synthetic( {"errors due to backend fetch"} );
    return (deliver);
}

sub vcl_synth {
    if (resp.status == 999) {
        set resp.status = 404;
        set resp.http.Content-Type = "text/plain; charset=utf-8";
        synthetic(std.fileread("/tmp/vcl_50x.html"));
        return (deliver);
    }
    return (deliver);
}

vcl_backend_error ではエラーメッセージをベタに書き、 vcl_synth ではファイルを読み込んでページ生成する。(ファイル読み込みに利用する import std; を忘れないこと!)
エラーページ用ファイル /tmp/vcl_50x.html の中身は

$ cat /tmp/vcl_50x.html
errors due to vcl

となっている。

レスポンスを確認

実際にリクエストを投げてレスポンスを確認する

まずはバックエンドサーバの障害に起因する vcl_backend_error エラーページを確認

$ curl -D - http://localhost:6081/
HTTP/1.1 503 Backend fetch failed
Date: Sun, 08 Feb 2015 09:26:35 GMT
Server: Varnish
Content-Type: text/html; charset=utf-8
X-Varnish: 2
Age: 0
Via: 1.1 varnish-v4
Content-Length: 27
Connection: keep-alive

errors due to backend fetch

次に vcl で発生させた synthetic エラーページを確認

$ curl -D - http://localhost:6081/404/foo
HTTP/1.1 404 Not Found
Date: Sun, 08 Feb 2015 09:26:39 GMT
Server: Varnish
X-Varnish: 5
Content-Type: text/plain; charset=utf-8
Content-Length: 18
Connection: keep-alive

errors due to vcl

References

Advertisements
Tagged with: , , , ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: