HitchとVarnish 6.4でHTTP/2なMagento環境を作る
この記事は公開から 1年以上が経過しています。現在の最新情報との整合性については弊社では一切の責任を負いかねます。
このエントリは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を使われているサイトは検討されてみてはいかがでしょうか。