2015年10月13日にリリースされた Apache httpd 2.4.17 に mod_http2 が導入され、いよいよ Apache も HTTP/2 対応になりました。5月の HTTP/2のRFC 発表から約半年での実装になります。現時点(2015年10月18日)では yum などのパッケージ管理ツールは Apache 2.4.17 のインストールに対応していませんので、自前で依存関係を考慮しつつ、ソースコードからインストールする必要があります。そこで今回は、CentOS7.1 (1503) に Apache 2.4.17 と mod_http2 をインストールする手順をまとめてみました。
Apache 2.4.17 (mod_http2) が依存するライブラリ
mod_http2 は、以前「HTTP/2 WEBサーバ設定メモ」の記事でもご紹介した Nghttp2 のライブラリ libnghttp2 に依存していますので、Nghttp2 のインストールが必要です。
また、ALPNに対応している OpenSSL バージョン1.0.2以上 も必要になります。ALPNは、クライアントとサーバ間で、どのアプリケーションプロトコル(HTTP/1.1やHTTP/2)を使ってやりとりをするかを、決めるための仕組みです。詳しくは、Nghttp2 の作者 tatsuhiro-t さんの「OpenSSL の ALPN/NPN API の使い方」の記事が参考になると思います。
開発ツールのインストール
上記以外にも色々なライブラリや、Cコンパイラなどが必要になります。CentOS7.1を「最小限のインストール」でインストールしている場合は、基本コマンドと開発ツールをインストールしておきましょう。
yum -y groupinstall development
OpenSSL 1.0.2 のインストール
OpenSSLのコンパイルに zlib を使うので、インストールしておきます。
OpenSSLのインストール
wget https://www.openssl.org/source/openssl-1.0.2d.tar.gz
tar xvzf openssl-1.0.2d.tar.gz
cd openssl-1.0.2d/
./config --prefix=/usr/local/openssl-1.0.2d shared zlib
make
make test
make install
OpenSSL1.0.2d のライブラリにパスを通しておきます。
ldconfig
Nghttp2 のインストール
Nghttp2 が必要とするライブラリのインストール
Nghttp2 のダウンロード
※頻繁にバージョンアップされているようです。ダウンロードの前に最新リリースを確認しましょう。
https://github.com/tatsuhiro-t/nghttp2/releases/latest
wget https://github.com/tatsuhiro-t/nghttp2/releases/download/v1.3.4/nghttp2-1.3.4.tar.gz
Nghttp2 のインストール、環境変数 OPENSSL_CFLAGS と OPENSSL_LIBS に先ほどインストールした、OpenSSL1.0.2d のディレクトリパスを指定してコンパイルします。
cd nghttp2-1.3.4/
autoreconf -i
automake
autoconf
env OPENSSL_CFLAGS="-I/usr/local/openssl-1.0.2d/include" OPENSSL_LIBS="-L/usr/local/openssl-1.0.2d/lib -lssl -lcrypto" ./configure
make
make install
/usr/local/lib 以下に「libnghttp2」がインストールされますので、こちらもライブラリのパスに追加しておきます。
ldconfig
Apache インストールの下準備
Apache 2.4系を、ソースコードからインストールする場合は、APR と APR-util が必要になりますので、インストールしておきます。
APR
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.5.2.tar.gz
tar xvzf apr-1.5.2.tar.gz
cd apr-1.5.2/
./configure
make
make install
APR-util
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.5.4.tar.gz
tar xvzf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4/
./configure --with-apr=/usr/local/apr
make
make install
また、PCREライブラリも必要になるので、インストールします。
Apache 2.4.17 (mod_http2) のインストール
ようやく本題 Apache のインストールです。yum の便利さが実感できますね(^^;)
Apache 2.4.17 ソースコードのダウンロード
wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.17.tar.gz
ダウンロードしたソースコードを解凍して、ディレクトリを移動します。
cd httpd-2.4.17/
HTTP/2 を使うために必要なモジュール mod_http2 と mod_ssl を有効にし、--with-ssl オプションで、OpenSSL1.0.2d のディレクトリパスを指定してインストールします。
--enable-http2 \
--enable-ssl \
--with-ssl=/usr/local/openssl-1.0.2d \
--enable-so \
--enable-mods-shared=all
make
make install
以上で Apache 2.4.17 が /usr/local/apache2/ 以下にインストールされました。続いてSSL証明書の作成と、Apacheの設定を行います。
SSL証明書の作成(自己署名)
HTTP/2 は事実上 HTTPS が必須になりますので、Apacheの設定の前に、SSL証明書を作成しておきます。
秘密鍵の作成
CSR(証明書署名要求)の作成
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:<空エンター>
Locality Name (eg, city) [Default City]:<空エンター>
Organization Name (eg, company) [Default Company Ltd]:<空エンター>
Organizational Unit Name (eg, section) []:<空エンター>
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:<空エンター>
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<空エンター>
An optional company name []:<空エンター>
SSLサーバ証明書の作成(有効期限10年)
秘密鍵とSSL証明書を移動
mv -i server.crt /usr/local/apache2/conf/
パーミッションを変更
chmod 400 /usr/local/apache2/conf/server.crt
CSRを削除
Apache の HTTP/2 設定
デフォルトの状態では、HTTP/2 が有効になっていませんので、有効になるように設定します。
vim /usr/local/apache2/conf/httpd.conf
以下のモジュールを有効にします。
#LoadModule http2_module modules/mod_http2.so
#LoadModule ssl_module modules/mod_ssl.so
↓
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule http2_module modules/mod_http2.so
LoadModule ssl_module modules/mod_ssl.so
起動時にアラートが出るので、ServerName のコメントを外しておきます。
↓
ServerName www.example.com:80
SSLの設定ファイルをインクルードします。
↓
Include conf/extra/httpd-ssl.conf
続いて、SSLとHTTP/2の設定です。
vim /usr/local/apache2/conf/extra/httpd-ssl.conf
SSLの暗号化方式を変更します(かなり長いです)。デフォルトの設定(HIGH:MEDIUM:!MD5:!RC4)では、HTTP/2 (もしくはALPN) が正しく動作しません。※この設定方法は how to h2 in apache を参考にさせて頂きました。
↓
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
脆弱性のある SSLプロトコルを無効にします。
↓
SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2
HTTP/2 を有効にするため「Protocols h2 http/1.1」ディレクティブを追加します。どこに書くか迷うところですが、バーチャルホスト設定の先頭あたりで良いかと思います。Protocols は、Apache 2.4.17 から追加されたディレクティブのようです。
Protocols h2 http/1.1 ←追加
Apache を起動します。
firewalld設定
firewalldが有効な場合は、80/tcp(http) と 443/tcp(https) ポートを開けておきましょう。
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
動作確認
HTTP/2対応ブラウザから「https://<アドレス>/」に接続して動作を確認します。主要なブラウザ(Firefox、Chromeなど)から、HTTP/2 プロトコルでやりとりするには 、HTTPS 接続が必須です。HTTP/2の仕様では、HTTPSは必須ではありませんが、HTTP/2は「安全な接続」も目的としているため、各種ブラウザがこのような仕様にしていると思われます。
Firefox41でアクセスしてみると(自己署名のSSL証明書のため警告が出ます)、プロトコルのバージョンが HTTP/2 になっていることが確認できました。
注意点
Apache バージョン2.4.17では、mod_http2 は「実験的」扱いになっています。今後のバージョンアップで、ディレクティブやデフォルト値が変わる可能性があります。
This module is experimental. Its behaviors, directives, and defaults are subject to more change from release to release relative to other standard modules. Users are encouraged to consult the "CHANGES" file for potential updates.
mod_http2 - Apache HTTP Server Version 2.4 より引用
おわりに
HTTP/2 対応の Apache をインストールするのは少し手間がかかるので、今のところは HTTP/2 を使うプロジェクトは限られるかと思います。ただ、今後 yum などのパッケージ管理ツールから、手軽にインストール出来るようになれば、一気に HTTP/2 が普及しそうな気がします。
コメント