HTTP/2 対応の WordPress サイト設定メモ【Nghttp2 (nghttpx) + CentOS 7】

2015年4月30日  カテゴリー:Linux  タグ: , ,
Pocket
LINEで送る

Nghttp2 のプロキシー nghttpx を使って、HTTP/2 対応の WordPress サイトを設定した時のメモです。nghttpx は、HTTP/2 リクエストを HTTP/1.1 などのリクエストに変換してくれる、便利なプロキシーです。今回は、フロントエンドで HTTP/2 リクエストを nghttpx が受け取り、 バックエンドのWEBサーバ(Apache)に、HTTP/1.1リクエストを送信する構成で設定してみました。

(更新)2017年5月14日 各種インストール手順を最新版に更新しました。

nghttpx には色々な動作モードがあり、今回設定するリバースプロキシーとして使えますし、クライアントプロキシーとしても動作します。詳細は、Nghttp2 の開発者 tatsuhiro-t さんが「http2.0 - HTTP/2 & SPDY プロキシー nghttpx を使う - Qiita」で、分かりやすく解説されています。

構成図

nghttpx と Apache は、同じサーバで稼働させます。
nghttpx-01

開発ツールのインストール

サーバOSは CentOS7.3 (1611) です。Nghttp2(nghttpx) はソースからコンパイルしますので、基本コマンドと開発ツールをインストールしておきます。

yum -y groupinstall base
yum -y groupinstall development

OpenSSL 1.0.2 のインストール

ALPN(Application-Layer Protocol Negotiation)に対応している、OpenSSLバージョン1.0.2以上をインストールします。

Google Chrome バージョン51以降は、NPNが削除され、ALPNのみ対応となったようですので、WEBサーバでHTTP/2を使うには、事実上OpenSSL1.0.2以上が必須になります。
Transitioning from SPDY to HTTP/2 | Chromium Blog

 
まずはじめに OpenSSLのコンパイルに zlib を使うので、インストールしておきます。

yum -y install zlib-devel

OpenSSLのインストール(そこそこの時間がかかります)

cd /usr/local/src/
wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
tar xvzf openssl-1.0.2k.tar.gz
cd openssl-1.0.2k/
./config --prefix=/usr/local/openssl-1.0.2k shared zlib
make depend
make
make test
make install

OpenSSL1.0.2 のライブラリにパスを通しておきます。

echo /usr/local/openssl-1.0.2k/lib > /etc/ld.so.conf.d/openssl102k.conf
ldconfig

Nghttp2(nghttpx)のインストール

Nghttp2 が必要とするライブラリのインストール

yum -y install libev-devel c-ares-devel

Nghttp2 のダウンロード
※頻繁にバージョンアップされているようです。ダウンロードの前に最新リリースを確認しましょう。
https://github.com/tatsuhiro-t/nghttp2/releases/latest

cd /usr/local/src/
wget https://github.com/nghttp2/nghttp2/releases/download/v1.22.0/nghttp2-1.22.0.tar.gz

Nghttp2 のインストール。環境変数 OPENSSL_CFLAGS と OPENSSL_LIBS に先ほどインストールした、OpenSSL1.0.2 のディレクトリパスを指定してコンパイルします。また nghttpx をコンパイルするため「-enable-app」オプションを付けます。

tar xvzf nghttp2-1.22.0.tar.gz
cd nghttp2-1.22.0/
env OPENSSL_CFLAGS="-I/usr/local/openssl-1.0.2k/include" OPENSSL_LIBS="-L/usr/local/openssl-1.0.2k/lib -lssl -lcrypto" ./configure -enable-app
make
make install

/usr/local/bin/ 下に、「nghttpx」などの Nghttp2 のコマンド群がインストールされます。

SSLサーバ証明書(自己署名)の作成

Google Chrome や Firefox など、主要なWEBブラウザが、HTTP/2 接続には HTTPS 暗号化通信を必須としているため、SSLサーバ証明書が必要になります。

(2015年12月15日追記)正規の認証局が発行した、サーバー証明書を無料で取得できるようになりました。よければご参照ください → Let's Encrypt サーバー証明書の取得と自動更新設定メモ

・秘密鍵の作成

・CSR(証明書署名要求)の作成

・SSLサーバ証明書の作成(有効期限10年)

・秘密鍵とSSLサーバ証明書を適切な場所に移動

・セキュリティ確保のため nghttpx の実行ユーザ「nghttp2」を作成

・秘密鍵とSSLサーバ証明書のオーナーを「nghttp2」ユーザに変更

・CSRを削除

nghttpx の設定

・ログファイルの保存先を作成
mkdir /var/log/nghttpx

・nghttpx の設定ファイルを作成します。
mkdir /etc/nghttpx/
vi /etc/nghttpx/nghttpx.conf

※当然ですが行末にスペースが入っていると、正しく動作しません。これが原因で、小一時間ほど悩みました。

nghttpx の起動スクリプト作成

・nghttpx 用の systemd設定ファイルを作成します。
vi /etc/systemd/system/nghttpx.service

・上記設定を systemd に反映

・systemd に反映されているか確認

・起動

・自動起動設定

・「nghttp2」ユーザで、nghttpx が実行されているかを確認します。

nghttpx のログローテーション設定

・ログローテーションの設定ファイルを作成します
vi /etc/logrotate.d/nghttpx

・確認します

バックエンド WEBサーバ(Apache)の設定

Apache httpd をインストールします。

yum -y install httpd-devel

・「X-Forwarded-For」を、出力できるログフォーマット「x-combined」を追加します。
vi /etc/httpd/conf/httpd.conf

・WordPress 用のバーチャルホストを追加します。
ServerName や DocumentRoot は、ご自分の環境に合わせて設定してください。CustomLog のログフォーマットは、上で追加した「x-combined」を指定します。また、環境変数「HTTPS on」を設定しておきます。(WordPress がこの値を参照します)
vi /etc/httpd/conf/httpd.conf

WordPressのインストールは「WordPress インストールメモ(CentOS)」の記事をご参照ください。

動作確認

「https://<アドレス>:3000/」に、HTTP/2 対応のWEBブラウザで接続すると、HTTP/2 プロトコルを使って通信していることが確認できます。Safari など、HTTP/2 に対応していないWEBブラウザの場合は、自動的に nghttpx が HTTP/1.1 を使って通信してくれます。
nghttpx-02

※サーバに接続できない場合は、firewallでブロックされているかもしれません。以下のコマンドで3000/tcp の接続を許可しておきましょう。

(2015年5月18日追記)
WordPress の管理画面にも、問題なくログインできます。ありがとうございました!(^^)
nghttpx-05

終わりに

2015年4月27日、HTTP/2 のRFC番号が、RFC7540 (HTTP/2)、 RFC7541(HPACK) に決まったようです。RFCの文章化が目前ですね!

スポンサーリンク
Pocket
LINEで送る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です