Varnishのレスポンスヘッダーにサーバ情報を含める

varnish

Load Balancer – Varnish(複数台) – Origin Server(複数台) というような構成の時に

  • リクエストを処理した Varnish サーバ
  • Varnish にコンテンツを返したオリジンサーバ

と言った情報をデバッグ目的で Varnish のレスポンスヘッダーに含める方法をメモ。

server-architecture

ヘッダーに含められる情報

Varnish Server

Varnish サーバに関しては、以下の情報が取得可能

  • server.ip Varnish サーバの IP アドレス
  • server.port/std.port(server.ip) Varnish サーバのポート番号
  • server.hostname Varnish サーバのホストネーム
  • server.identity プロセス起動時に -i オプションで指定するID。デフォルトはホストネーム

最後の identify は CentOS の場合 /etc/sysconfig/varnishDAEMON_OPTS を修正すれば良い。

# # DAEMON_OPTS is used by the init script.  If you add or remove options, make
# # sure you update this section, too.
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
             -f ${VARNISH_VCL_CONF} \
             -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
             -t ${VARNISH_TTL} \
             -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
             -u varnish -g varnish \
             -i varnish-3.0.6 \
             -S ${VARNISH_SECRET_FILE} \
             -s ${VARNISH_STORAGE}"

-i varnish-3.0.6 の箇所が追加部分。

Origin Server

オリジンサーバに関しては、以下の情報が取得可能

  • backend.ip オリジンサーバのIPアドレス
  • backend.name オリジンサーバの VCL での名前

設定例

オリジンサーバ2台(192.168.11.11:8888(web1) と 192.168.11.12:8888(web2))をラウンドロビンするようにし Varnish が上述のオリジン/Varnishサーバ情報をレスポンスヘッダーに返すようにしたのが以下。

Varnish3 での設定例

backend web1 {
    .host = "192.168.11.11";
    .port = "8888";
}
backend web2{
    .host = "192.168.11.12";
    .port = "8888";
}

director web_director round-robin {
    { .backend = web1; }
    { .backend = web2; }
}

sub vcl_recv {
    # Called at the beginning of a request, after the complete request has been received and parsed.
    set req.backend = web_director;
}

sub vcl_fetch {
    # Called after a document has been successfully retrieved from the backend.
    # backend server
    set beresp.http.X-Backend-Ip       = beresp.backend.ip;
    set beresp.http.X-Backend-Hostname = beresp.backend.name;
    # varnish server
    set beresp.http.X-Varnish-Id       = server.identity;
    set beresp.http.X-Varnish-Hostname = server.hostname;
    return (deliver);
}

sub vcl_deliver {
    # Called before a cached object is delivered to the client
    # varnish server
    set resp.http.X-Varnish-Ip   = server.ip;
    set resp.http.X-Varnish-Port = server.port;
}

Varnish4 での設定例

vcl 4.0;
import directors;
import std;

backend web1 {
    .host = "192.168.11.11";
    .port = "8888";
}

backend web2{
    .host = "192.168.11.12";
    .port = "8888";
}

sub vcl_init {
    new web_cluster = directors.round_robin();
    web_cluster.add_backend(web1);
    web_cluster.add_backend(web2);
}

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    set req.backend_hint = web_cluster.backend();
}

sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    # backend server
    set beresp.http.X-Backend-Ip       = beresp.backend.ip;
    set beresp.http.X-Backend-Hostname = beresp.backend.name;
    # varnish server
    set beresp.http.X-Varnish-Id       = server.identity;
    set beresp.http.X-Varnish-Hostname = server.hostname;
}

sub vcl_deliver {
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    # varnish server
    set resp.http.X-Varnish-Ip   = server.ip;
    set resp.http.X-Varnish-Port = std.port(server.ip);
}

注意点としては Varnish4 から server.port が廃止され、データ型 server.ip から std.port 関数でポート部分だけを抽出するように変わっている。

https://www.varnish-cache.org/docs/trunk/whats-new/upgrading.html#client-port-and-server-port-replaced-by-respectively-std-port-client-ip-and-std-port-server-ip

Varnish にアクセスしてレスポンスヘッダーを確認

Varnish3 が応答したケース

]$ curl -D - http://LoadBalancer-IP/index.html
HTTP/1.1 200 OK
Server: SimpleHTTP/0.6 Python/2.6.6
Content-type: text/html
Last-Modified: Fri, 20 Feb 2015 16:02:18 GMT
X-Backend-Ip: 192.168.11.11
X-Backend-Hostname: web1
X-Varnish-Id: varnish-3.0.6
X-Varnish-Hostname: varnish3-cent6
Content-Length: 0
Accept-Ranges: bytes
Date: Fri, 20 Feb 2015 17:01:19 GMT
X-Varnish: 482877580
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Varnish-Ip: 192.168.11.25
X-Varnish-Port: 6081

Varnish4 が応答したケース

]$ curl -D - http://LoadBalancer-IP/index.html
HTTP/1.1 200 OK
Server: SimpleHTTP/0.6 Python/2.6.6
Date: Fri, 20 Feb 2015 17:03:26 GMT
Content-type: text/html
Content-Length: 0
Last-Modified: Fri, 20 Feb 2015 16:02:18 GMT
X-Backend-Ip: 192.168.11.11
X-Backend-Hostname: web1
X-Varnish-Id: varnish-4.0.3
X-Varnish-Hostname: varnish4-cent6
X-Varnish: 2
Age: 0
Via: 1.1 varnish-v4
X-Varnish-Ip: 192.168.11.29
X-Varnish-Port: 6081
Connection: keep-alive
Accept-Ranges: bytes

MEMO

プロダクション環境では IP アドレスなどでクライアントを絞った上で、このような付加情報を返したほうが好ましい。

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 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year 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: