Apache 2.4.17 + mod_http2 インストールメモ【HTTP/2】

Apache 2.4.17 + mod_http2 インストールメモ【HTTP/2】
あぱーブログ
2015年10月18日  カテゴリー:Linux  タグ: , ,
Pocket
LINEで送る

 

(2017年7月18日追記)このバージョンの Apache httpd にはセキュリティ脆弱性が見つかっています。これらのセキュリティ脆弱性が修正されている「Apache httpd 2.4.27 + mod_http2 インストールメモ」をご参照ください。

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 base
yum -y groupinstall development

OpenSSL 1.0.2 のインストール

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

yum -y install zlib-devel

OpenSSLのインストール

cd /usr/local/src/
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 のライブラリにパスを通しておきます。

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

Nghttp2 のインストール

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

yum -y install libev-devel

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

cd /usr/local/src/
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 のディレクトリパスを指定してコンパイルします。

tar xvzf nghttp2-1.3.4.tar.gz
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」がインストールされますので、こちらもライブラリのパスに追加しておきます。

echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig

Apache インストールの下準備

Apache 2.4系を、ソースコードからインストールする場合は、ARP と ARP-util が必要になりますので、インストールしておきます。

ARP

cd /usr/local/src/
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

ARP-util

cd /usr/local/src/
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ライブラリも必要になるので、インストールします。

yum -y install pcre-devel

Apache 2.4.17 (mod_http2) のインストール

ようやく本題 Apache のインストールです。yum の便利さが実感できますね(^^;)

Apache 2.4.17 ソースコードのダウンロード

cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.17.tar.gz

ダウンロードしたソースコードを解凍して、ディレクトリを移動します。

tar xvzf httpd-2.4.17.tar.gz
cd httpd-2.4.17/

HTTP/2 を使うために必要なモジュール mod_http2 と mod_ssl を有効にし、--with-ssl オプションで、OpenSSL1.0.2d のディレクトリパスを指定してインストールします。

./configure \
--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証明書の作成(自己署名)

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

HTTP/2 は事実上 HTTPS が必須になりますので、Apacheの設定の前に、SSL証明書を作成しておきます。

秘密鍵の作成

openssl genrsa 2048 > server.key

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

openssl req -new -key server.key > server.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年)

openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

秘密鍵とSSL証明書を移動

mv -i server.key /usr/local/apache2/conf/
mv -i server.crt /usr/local/apache2/conf/

パーミッションを変更

chmod 400 /usr/local/apache2/conf/server.key
chmod 400 /usr/local/apache2/conf/server.crt

CSRを削除

rm server.csr

Apache の HTTP/2 設定

デフォルトの状態では、HTTP/2 が有効になっていませんので、有効になるように設定します。

vim /usr/local/apache2/conf/httpd.conf
以下のモジュールを有効にします。

#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#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

ServerName www.example.com:80

SSLの設定ファイルをインクルードします。

#Include conf/extra/httpd-ssl.conf

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 HIGH:MEDIUM:!MD5:!RC4

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 -SSLv3

SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2

HTTP/2 を有効にするため「Protocols h2 http/1.1」ディレクティブを追加します。どこに書くか迷うところですが、バーチャルホスト設定の先頭あたりで良いかと思います。Protocols は、Apache 2.4.17 から追加されたディレクティブのようです。

<VirtualHost _default_:443>
Protocols h2 http/1.1 ←追加

Apache を起動します。

/usr/local/apache2/bin/apachectl start

firewalld設定

firewalldが有効な場合は、80/tcp(http) と 443/tcp(https) ポートを開けておきましょう。

firewall-cmd --add-port=80/tcp --permanent
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-http2-01

注意点

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 が普及しそうな気がします。

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

コメントを残す

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