CentOS7 に Webサーバ H2O をインストールして HTTP/2 に対応させました(WordPress を動作させるまで)

CentOS8 も試しているのですが、あちらは Apache でも標準でHTTP/2に対応しているんですよね。しかしながら、CentOS7 収録の Apache では対応していないため Webサーバを入れ替えないと利用できない状態です。

以前に nginx で試したこともあるのですが、WordPress のパーマリンクが正常に動かない状況になってしまい、改善できなかったため移行を断念した経験があります。

今回、nginx と同等以上の性能を発揮するという噂の新進気鋭のWebサーバ H2O の導入を試して WordPress を動作させるところまでやってみました。

H2O のインストール

CentOS でのインストールに対応したリポジトリが公開されているため、手動でリポジトリを追加して yum でインストールしました。

# vi /etc/yum.repos.d/h2o.repo

リポジトリ情報を書き込みます。とりあえず常時利用はしないように enabled=0 にしましたが、1にしても問題ないかと。

[h2o]
name=bintray-tatsushid-h2o-rpm
baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/centos/$releasever/$basearch/
gpgcheck=0
repo_gpgcheck=0
enabled=0

パッケージ情報を検索してみます。

# yum search --enablerepo=h2o h2o
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                     | 4.1 kB     00:00
 * base: mirrors.cat.net
 * epel: ftp.iij.ad.jp
 * extras: mirrors.cat.net
 * remi-safe: ftp.riken.jp
 * updates: mirrors.cat.net
base                                                     | 3.6 kB     00:00
epel                                                     | 4.7 kB     00:00
extras                                                   | 2.9 kB     00:00
h2o                                                      | 1.3 kB     00:00
mariadb-main                                             | 2.9 kB     00:00
mariadb-maxscale                                         | 2.4 kB     00:00
mariadb-tools                                            | 2.9 kB     00:00
mondorescue                                              | 2.9 kB     00:00
remi-safe                                                | 3.0 kB     00:00
updates                                                  | 2.9 kB     00:00
(1/3): epel/x86_64/updateinfo                              | 1.0 MB   00:00
(2/3): epel/x86_64/primary_db                              | 6.9 MB   00:00
(3/3): h2o/7/x86_64/primary                                | 7.8 kB   00:00
h2o                                                                       65/65
=============================== N/S matched: h2o ===============================
h2o.x86_64 : H2O - The optimized HTTP/1, HTTP/2 server
h2o-debuginfo.x86_64 : Debug information for package h2o
libh2o.x86_64 : H2O Library compiled with libuv
libh2o-devel.x86_64 : Development interfaces for H2O
libh2o-evloop.x86_64 : H2O Library compiled with its own event loop

  Name and summary matches only, use "search all" for everything.

問題なさそうなのでインストール。

# yum install --enablerepo=h2o h2o

ログを取り損ねていたのですが必要なパッケージとまとめてインストールされます。

今までは Aapche を使っていたので、そちらを停止して H2O を起動します。ついでにサーバ起動時にも H2O が起動するように設定しました。

# systemctl stop httpd
# systemctl start h2o
# systemctl disable httpd
# systemctl enable h2o

以上でサーバの変更が終わり。Aapche の設定を引き継いで環境の移行を進めます。

WordPress を動かす設定 とか もろもろ

現在、このブログを動かしているサーバは、ほぼ WordPress の動作に専用化している向きもあるため、PHP-FPM と連携して WordPress を動かすための設定を行いました。

先日、サーバの PHP バージョンは 7.4 に上げているため、PHP 7.4.9 での動作になります。

設定ファイルは /etc/h2o/h2o.conf です。

http2-reprioritize-blocking-assets: ON
file.index: [ 'index.html', 'index.php' ]
file.custom-handler:
  extension: .php
  fastcgi.spawn: "PHP_FCGI_CHILDREN=10 exec /usr/bin/php-cgi"
hosts:
  "www.u-1.net:443":
    listen:
      port: 443
      host: 0.0.0.0
      ssl:
        minimum-version: TLSv1.2
        certificate-file: "/path/to/the/certificate-file"
        key-file: "/path/to/the/key-file"
        cipher-preference: server
        cipher-suite: "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:!DSS"
    paths:
      "/":
        file.dir: /var/www/html/www.u-1.net
        redirect:
          url: /index.php/
          internal: YES
          status: 307
  "www.u-1.net:80":
    listen:
      port: 80
      host: 0.0.0.0
    paths:
      "/":
        redirect:
          status: 301
          url: "https://www.u-1.net/"

細かい設定は省いていますが HTTPS 接続で WordPress を動かすならこの程度の設定ファイルの量で済むという。

今まで Apache では複数ファイルにまたいで設定ファイルを用意していたので、このすっきりさは驚きであります。

SSL 証明書の設定に注意

いわゆる中間CA証明書を使用している場合は、nginxと同様にサーバー証明書と結合して指定してやる必要があります。改行が含まれていないとエラーになるので、結合後、手動で修正する必要がありました。

私の場合は FUJISSL のサイト説明を参照して実施しました。

HTTP/2 でアクセスできているかのチェック

Firefox のアドオン HTTP/2 Indicator で動作チェックしてみました。

青い雷マークが表示されHTTP/2が有効になっていることが分かります

ついでに開発者ツールでレスポンスヘッダーを見てみます。設定を多少追加しているためいくつか情報が追加されていますが、1行目見れば分かります。

HTTP/2 200 OK
server: h2o/2.2.6
date: Sat, 05 Sep 2020 06:37:53 GMT
x-powered-by: PHP/7.4.9
expires: Wed, 11 Jan 1984 05:00:00 GMT
cache-control: no-cache, must-revalidate, max-age=0, max-age=86400
content-type: text/html; charset=UTF-8
link: <https://www.u-1.net/wp-json/>; rel="https://api.w.org/"
strict-transport-security: max-age=31536000
content-encoding: gzip
vary: accept-encoding
accept-ranges: none
X-Firefox-Spdy: h2

無事にWebサーバの切り替えに成功しました。

パフォーマンスはどうか?

体感としても結構速くなった気がします。PageSpeed Insights でも モバイルで 86、PC で 99 と高スコアです。モバイルの方は Google AdSense の広告コードがジャマをしている部分もあるので、致し方ない気もしますが、アドセンス表示の最適化などでもうちょっと詰められるかな?

Gmetrix では Add Expires headers が0点評価で残念無念。これはH2Oの設定ファイル内で mruby を使って適切にヘッダ情報を出力してやれば良さそうなのでそのうち対応したいと思います。

以上、やってみたらそんなに難しくなかった Webサーバの切り替え作業でした。