このエントリは2017年末にMagento Advent Calendar 2017の記事として書いた「Hitch 1.4とVarnish 5.2でHTTP/2なMagento環境を作る」の続編です。

当時、Hitch 1.4とVarnish 5.2でHttp/2な環境ができる、と書いたのですが・・・実際に本番サイトで運用してみたところ、Varnish 5.2の不具合でHttp/2に障害が出てしまいました。
やむなくHttp1.1に戻して運用をしていたのですが、

  • Magento2.3系がVarnish6.xに対応した
  • Githubのログを見ているとHttp/2関係の不具合は解消された(ように見える)
  • Lighthouse(Google Chromeに付属する分析ツール)ではHttp/2を使えと言われる

という状況を踏まえ、改めてVarnish6.4で検証してみることにしました。

Varnish5.xとVarnish6.xのVCLの違い

MagentoにはVarnishが使用するVCLを自動生成する機能がついています。
2.2系まではVarnish4.xと5.xのみでしたが、2.3系では6.xも対象になっています。
Varnishを入れ替える前に、5.xと6.xのVCLを比較してみましょう。
単純に比較をすると、以下の1行だけが異なっています。

Varnish5.x用

sub vcl_hit {
〜中略〜
        } else {
            # Hit after TTL and grace expiration
            return (miss);
        }
〜中略〜 }

Varnish6.x用

sub vcl_hit {
〜中略〜
} else { # Hit after TTL and grace expiration return (restart); }
〜中略〜 }

要は「return (miss);」か「return (restart);」かだけの違いです。
これくらいであれば対処は難しくなさそうです。

4/3追記:

Varnish公式では、6.2以降の環境で追加調整が必要とされています。
sub vcl_recvの先頭で以下の定義を追加する必要があるようです。

if (req.restarts > 0) { set req.hash_always_miss = true; }

Varnishの入れ替え

すでにpackagecloudにはVarnish6.4のリポジトリがあります。
Debian系、Redhat系両方に対応したリポジトリが用意されているので、ディストリビューションに合わせて選ぶと良いでしょう。

弊社は主にUbuntu Linuxを使っているので、「Quick Install instructions for」のところにあるDebianアイコンをクリックします。
コマンドが表示されるので、これをそのままサーバー上で実行します。
その後、

apt update

を実行してリポジトリが持っているパッケージ情報を取得しておきましょう。
とりあえずこれでVarnish6.4のリポジトリが追加でき、インストールする準備が整いました。

次に、今動いているVarnishを一旦アンインストールします。
サイトが止まるので、関係者には事前に周知しておきましょう。
Varnish5.xをアンインストールする理由としては、

  • 5.xと6.4では依存するパッケージが異なる
  • Ubuntu Linux標準のVarnishパッケージからは直接アップデートできない

からです。
そのため、

apt remove varnish
apt install varnish

を実行し、Varnishを入れ替えます。
入れ替え直後はVCLの違いによるエラーが出てしまうので、前述の変更点を反映します。

Varnishが起動すれば、とりあえず入れ替えは完了です。

HitchとVarnishの設定変更

最後にHitchとVarnishの設定変更を行い、Http/2を有効にします。
この手順は以前のエントリでも紹介していますが、以下の2つです。

  • /etc/systemd/system/varnish.serviceの編集
  • /etc/hitch/hitch.confの編集

/etc/systemd/system/varnish.serviceの編集

Ubuntu Linux前提ですが、Varnishを起動する際の設定は、/etc/systemd/system/varnish.serviceで定義します。
このファイルを編集することで、Varnishの調整ができます。
前回と変更する内容は変わりませんが、以下のように書き換えます。

変更前:ExecStart=/usr/sbin/varnishd -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
変更後:ExecStart=/usr/sbin/varnishd -a :80 -a :81,PROXY -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m -p feature=+http2

ポイントは末尾の「-p feature=+http2」というところで、これがないとHttp/2通信ができません。

ファイルの編集後は、

systemctl daemon-reload

を実行し、変更内容を反映しましょう。

/etc/hitch/hitch.confの編集

hitchの設定ファイルも変更が必要です。下記の1行を追記する必要があります。

alpn-protos    = "h2, http/1.1"

他は無理にいじらなくても良いでしょう。

hitchとvarnishの再起動

ファイル変更ができたら、hitchとvarnishを再起動します。
両方のプロセスが起動していることを確認したら、ブラウザでサイトにアクセスしてみましょう。

Varnish5.2の場合は、Chromeなどで読み込みエラーが頻発していましたが、Varnish6.4の場合は問題なく動作します。

まとめ

  • VarnishでHttp/2を使いたい場合はバージョン6.xを使うと安定動作する
  • Varnish6.4のパッケージはpackagecloudから入手可能
  • 設定ファイルの調整は5.2のときと同じものが利用可能
  • VCLのみ一部変更があるので、調整費が必要

比較的簡単な操作だけで対応ができるので、Magento2.3系でVarnishを使われているサイトは検討されてみてはいかがでしょうか。