これまで HTTP/2 に対応した Apache httpd をインストールするには、関連するライブラリを含めソースからコンパイルしなければならないため、なかなかの手間がかかっていました。しかし CentOS7.4 (1708) から OpenSSL1.0.2 がサポートされたことにより、CentOSコミュニティ承認済みの IUSリポジトリから yum で簡単にインストールできるようになりました。そこで今回は、IUSリポジトリを使って HTTP/2 に対応した Apache httpd をインストールする手順をまとめてみました。
(参考資料)CentOSコミュニティ承認リポジトリ一覧
AdditionalResources/Repositories - CentOS Wiki
IUS プロジェクトについて
リポジトリを公開してくれている IUSプロジェクトの歴史は古く、米ホスティングサービス大手 ラックスペースの社内プロジェクトとして2006年に開始されました。ラックスペースは日本ではサービスを提供していないため、あまりなじみがありませんが NASA(アメリカ航空宇宙局)と共同で OpenStack プロジェクトを立ち上げるなど活動的な企業です。
現在の IUSプロジェクトはラックスペースの支援を受け、IUSリポジトリを誰でも利用できるように活動しています。(ただし IUSパッケージはラックスペースのサービスではないこと強調しています)
IUS リポジトリの哲学
IUCリポジトリを使う前にその哲学を理解しておく必要があります、少し簡単に確認してみましょう。
- 上流のプロジェクト(Apache HTTP Server プロジェクトや PHP Development チーム など)がリリースする最新バージョンに追従する。
- 既存のパッケージ(Stock Packages)を上書きしない。
- IUSパッケージは、まずテストリポジトリでリリースされ問題が報告されなければ、約2週間後に正式リリースされる。
- IUSパッケージは「{name}{major_version}{minor_version}u」の命名規則に従う。(「u」を付けることで、既存のパッケージを上書きしてしまうのを防いでいるそうです)
OpenSSL のバージョン確認
まずはじめに OpenSSL のバージョンが「1.0.2」であることを確認します。
OpenSSL 1.0.2k-fips 26 Jan 2017
OpenSSL のバージョンが 1.0.1 の場合は、CentOS7.4(1708)にアップグレードしてください。
IUS リポジトリのインストール
IUSリポジトリが依存する EPELリポジトリをインストールします。
IUSリポジトリをインストールします。
HTTP/2 対応 Apache のインストール
現時点(2017年10月22日)では、HTTP/2 対応した Apache httpd は テストリポジトリからインストールできます。(本番環境での使用は推奨されていませんので、ご注意ください)
nghttp2 など HTTP/2 の処理に必要なパッケージもインストールしてくれます。
======================================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量 ======================================================================================================================== インストール中: httpd24u-devel x86_64 2.4.28-1.ius.centos7 ius-testing 203 k 依存性関連でのインストールをします: apr15u x86_64 1.5.2-1.ius.centos7 ius 111 k apr15u-devel x86_64 1.5.2-1.ius.centos7 ius 193 k apr15u-util x86_64 1.5.4-3.ius.centos7 ius 92 k apr15u-util-devel x86_64 1.5.4-3.ius.centos7 ius 76 k c-ares x86_64 1.10.0-3.el7 base 78 k cyrus-sasl x86_64 2.1.26-21.el7 base 88 k cyrus-sasl-devel x86_64 2.1.26-21.el7 base 310 k expat-devel x86_64 2.1.0-10.el7_3 base 57 k httpd24u x86_64 2.4.28-1.ius.centos7 ius-testing 1.4 M httpd24u-filesystem noarch 2.4.28-1.ius.centos7 ius-testing 25 k httpd24u-tools x86_64 2.4.28-1.ius.centos7 ius-testing 86 k libdb-devel x86_64 5.3.21-20.el7 base 38 k libev x86_64 4.15-7.el7 extras 44 k libnghttp2 x86_64 1.21.1-1.el7 epel 66 k mailcap noarch 2.1.41-2.el7 base 31 k nghttp2 x86_64 1.21.1-1.el7 epel 520 k openldap-devel x86_64 2.4.44-5.el7 base 801 k トランザクションの要約 ======================================================================================================================== インストール 1 パッケージ (+17 個の依存関係のパッケージ) 総ダウンロード容量: 4.1 M インストール容量: 14 M Is this ok [y/d/N]: y ←入力してエンター
mod_ssl も テストリポジトリからインストールしておきます。
以上で HTTP/2 に対応した Apache のインストール完了です。Apache をソースからインストールする手順と比べてみるとかなり簡単になりましたね。
自己署名のSSLサーバー証明書の作成
HTTP/2 は事実上 HTTPS が必須になりますので Apache の設定の前に、SSLサーバー証明書を作成しておきます。
秘密鍵の作成(ECDSAの256ビット鍵を生成)
CSR(証明書署名要求)の作成(入力するのは2箇所だけです)
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 /etc/pki/tls/certs
パーミッションを変更
chmod 600 /etc/pki/tls/certs/server.crt
SELinux を有効にしている場合は、秘密鍵とSSL証明書にセキュリティコンテキストをつけておきましょう。(Apache 起動時にエラーが発生することがあります)
restorecon -v /etc/pki/tls/certs/server.crt
CSRを削除
Apache の HTTP/2 設定
vim /etc/httpd/conf/httpd.conf
ServerName のコメントを外してホスト名を指定します。
↓
ServerName www.example.com:80
ServerName の下あたりに(場所はどこでも構いません) HTTP/2 を有効にするための「Protocols h2 http/1.1」ディレクティブを追加します。このディレクティブはバーチャルホストブロックに書くこともできますので、サイトごとに HTTP/2 を有効にすることもできます。
Protocolsディレクティブ の初期値は「http/1.1」のため HTTP/2 が使われません。これを「h2 http/1.1」とすることで、WEBブラウザが対応していれば HTTP/2 を使い、対応していなければ HTTP/1.1 を使うようにできます。
動作モードを event MPM に変更
Apache バージョン 2.4.27 以降、prefork MPM で HTTP/2(mod_http2)を使うことはできません。Apache の動作モードを event MPM(もしくは worker MPM)に変更します。
vim /etc/httpd/conf.modules.d/00-mpm.conf
↓
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
↓
LoadModule mpm_event_module modules/mod_mpm_event.so
SSL/TLSの設定
先ほど作成した、証明書と秘密鍵を使うように設定します。
vim /etc/httpd/conf.d/ssl.conf
↓
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
↓
SSLCertificateKeyFile /etc/pki/tls/private/server.key
(関連記事)安全な SSL/TLS 設定にするための10のポイント(Apache httpd 2.4)
起動
自動起動設定
firewalld設定
HTTP(80/tcp) と HTTPS(443/tcp) を開けておきます。
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
・確認
firewall-cmd --list-all
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports: 443/tcp 80/tcp ←この表示があればOK
(略)
HTTP/2 の動作確認
Apache のドキュメントルートに適当なファイルを作成します。
WEBブラウザで「https://<アドレス>/」に接続してみると(自己署名のSSL証明書の場合は警告が出ます)、通信プロトコルのバージョンが HTTP/2 になっていることが確認できると思います。
PHP-FPM の設定
設定の所でもふれましたが Apache で HTTP/2(mod_http2)を動作させるには prefork MPM が使えません。ここで問題となるのが prefork MPM が必須のモジュール版 PHP(mod_php)が使えなくなってしまうことです。
そのため Apache で HTTP/2 を動作させている場合に PHP を使うには FastCGI で PHP を設定する必要がありますので PHP-FPM を使った設定方法を簡単にご紹介します。
IUCリポジトリから Apache httpd 用の PHP-FPM をインストールします。
PHP-FPM を Apache と同じ実行ユーザ/グループで動作するように設定します。
vim /etc/php-fpm.d/www.conf
group = php-fpm
↓
user = apache
group = apache
PHP-FPM を起動し、Apache を再起動します。
systemctl restart httpd
おわりに
ここ最近、HTTP/2など新しい機能やバージョンが求められるプロジェクトが増えた気がします。IUSリポジトリが活用できそうですね。
コメント