CentOS7 + Apache2.4 + http2

「HTTP/2」がついに登場! 開発者が知っておきたい通信の仕組み・新機能・導入方法
概要としてはこんな感じで、この先数年後にはデフォルトスタンダードになってるんじゃないかと思います。

環境の下準備

CentOS7のインストール直後にやっておくとよいかと。yum upgradeでだいたい全部入ってしまうようで環境によっては蛇足かもしれません。

yum -y upgrade
yum -y update
yum groupinstall "Base"
yum groupinstall "Development tools"
yum groupinstall "Japanese Support"
yum install bind-utils
yum install nmap

FirewallとかSELinuxとかの設定をいったん切っておく

setenforce 0
setenforce: SELinux is disabled

いったん永久にとめておきます。

vi /etc/selinux/config
SELINUX=enabled
↓
SELINUX=disabled

最近のOSは最初からdisabledになっているか?
Firewallの設定も切っておきます。おそらくデフォルトでオンになっている筈です。

systemctl status firewalld
systemctl stop firewalld

opensslのインストール

opensslのインストールですが最新バージョンは公式ホームページで確認しておいた方がよかろうと思います。ここではopenssl-1.0.2d.tar.gzを使います。
https://www.openssl.org/source/
まずは依存ライブラリを入れておきます。

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

/usr/local/openssl-1.0.2dにインストールされます。

nghttp2のインストール

http2のコアモジュールになるんでしょうか。nghttp2のインストールします。まずは依存ライブラリをインストールしておく。

yum -y install libev-devel

nghttp2のビルド。githubからもってくる時代になりましたね。

cd /usr/local/src/
wget https://github.com/tatsuhiro-t/nghttp2/releases/download/v1.3.4/nghttp2-1.3.4.tar.gz
tar xvzf nghttp2-1.3.4.tar.gz
cd nghttp2-1.3.4/
autoreconf -i
automake (*1)
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
echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig

(*1)すごい時間かかる。
nghttp2ではhttpsだけでなくhttpもサポートしているのですが、現時点でhttp/2に対応しているブラウザはhttpsのみを前提にしているのでSSL環境の構築が必要ということらしいです。

ApacheでWebサーバー構築 + http2

Apacheもソースから最新のものをもってくるのがよいです。2017-04-05時点でhttpd-2.4.25が最新でした。またApacheの依存モジュールのaprとapr-utilもインストールします。

aprのインストール

これは問題なく入った。

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

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

httpd-2.4.25のインストール

本家で最新を確認してからインストールしましょう。古いのは使わない方がいいですよ。http2は。
http://httpd.apache.org/download.cgi#apache24
まずは依存モジュールのインストールをしておく。

yum -y install pcre-devel

やっと本体のインストール。configureのオプションにご留意ください。私はパスがあってなかったりして結構面倒なことになりました。opensslのバージョンと場所とかも確認。

cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache/httpd/httpd-2.4.25.tar.gz
tar xvzf httpd-2.4.25.tar.gz
cd httpd-2.4.25/
./configure --enable-http2 --enable-ssl --with-ssl=/usr/local/openssl-1.0.2d --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr/bin/apu-1-config --enable-so --enable-mpms-shared=all
make
make install

すんなりインストールできましたが、馴染みの/etc/httpd/は作成されません。
お好みでシンボリック貼ったりするのがよいかと思います。本体は/usr/local/apache2/*に入ってます。
起動も面倒です。ここらは説明すると面倒なので後から調整しましょう。まずはそのまま起動して動作確認。

/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/httpd -v
Server version: Apache/2.4.25 (Unix)
Server built:   Apr  3 2017 23:01:27

ここまで動けばOK。URLとかIPからアクセスすると例の「It’s work!」が表示されます。

Apacheの設定

ここは通常どおりなので一部端折ります。

http2関連のモジュールを有効にする

configファイルを設定します。mod_socache_shmcb、mod_http2、/mod_sslを有効にします。

vi /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

バーチャルホストの設定・ドメインの設定

バーチャルホストとかSSLとか有効にしておきます。バーチャルホストの設定自体は割愛。

# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
↓
Include conf/extra/httpd-ssl.conf
....
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
↓
Include conf/extra/httpd-vhosts.conf

SSLの設定

SSLはオレオレ証明書でもOKですが、ここはひとつ無料SSLを取得してみてはいかがでしょうか。以外に簡単に取得できました。いいですねこれ。
無料SSLを取得する Let’s Encrypt
SSLが取得できたら、いつものように

vi /usr/local/apache2/conf/extra/httpd-ssl.conf

DocumentRoot "/var/html/www"
<Directory "/var/html/www">
    Options All
    AllowOverride All
    Require all granted
</Directory>
ServerName example.com:443
SSLCertificateFile /etc/letsencrypt/archive/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/archive/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/archive/example.com/chain.pem

に証明書類を設定してあげます。
続いてSSLCipherSuiteを修正します。

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

ここまで設定できたら完了。Apacheの再起動をします。

/usr/local/apache2/bin/apachectl start

http2通信の確認

Chromeのaddonで「HTTP/2 and SPDY indicator」というのがあるのでそれをインストールするのが楽です。例によって雷マークが出て来るので、それが青になっていたらOKです。
雷マークをクリックするとhttp2のセッションが見れるので確認しましょう。



【初心者向け】CentOS 7 + Apache + 無料SSLによる HTTP/2 の導入方法

Last update: 2017.04.05 (水)