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
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 5 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 5 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: