HTTP/2 に対応した Apache を yum でインストール

HTTP/2 に対応した Apache を yum でインストール
あぱーブログ
2017年10月22日  カテゴリー:Linux  タグ: , , ,
Pocket
LINEで送る

これまで 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パッケージはラックスペースのサービスではないこと強調しています)

History - IUS

IUS リポジトリの哲学

IUCリポジトリを使う前にその哲学を理解しておく必要があります、少し簡単に確認してみましょう。

  • 上流のプロジェクト(Apache HTTP Server プロジェクトや PHP Development チーム など)がリリースする最新バージョンに追従する。
  • 既存のパッケージ(Stock Packages)を上書きしない。
  • IUSパッケージは、まずテストリポジトリでリリースされ問題が報告されなければ、約2週間後に正式リリースされる。
  • IUSパッケージは「{name}{major_version}{minor_version}u」の命名規則に従う。(「u」を付けることで、既存のパッケージを上書きしてしまうのを防いでいるそうです)

Philosophy - IUS

OpenSSL のバージョン確認

まずはじめに OpenSSL のバージョンが「1.0.2」であることを確認します。

openssl version
 
OpenSSL 1.0.2k-fips 26 Jan 2017

OpenSSL のバージョンが 1.0.1 の場合は、CentOS7.4(1708)にアップグレードしてください。

yum -y update

IUS リポジトリのインストール

IUSリポジトリが依存する EPELリポジトリをインストールします。

yum -y install epel-release

IUSリポジトリをインストールします。

rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm

HTTP/2 対応 Apache のインストール

現時点(2017年10月22日)では、HTTP/2 対応した Apache httpd は テストリポジトリからインストールできます。(本番環境での使用は推奨されていませんので、ご注意ください)

yum install httpd24u-devel --enablerepo=ius-testing

nghttp2 など HTTP/2 の処理に必要なパッケージもインストールしてくれます。

 
mod_ssl も テストリポジトリからインストールしておきます。

yum install httpd24u-mod_ssl --enablerepo=ius-testing

以上で HTTP/2 に対応した Apache のインストール完了です。Apache をソースからインストールする手順と比べてみるとかなり簡単になりましたね。

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

正規の認証局が発行したサーバー証明書を、無料で取得することもできます。よければご参照ください → Let's Encrypt サーバー証明書の取得と自動更新設定メモ

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

秘密鍵の作成(ECDSAの256ビット鍵を生成)

openssl ecparam -name prime256v1 -genkey -out server.key

CSR(証明書署名要求)の作成(入力するのは2箇所だけです)

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 /etc/pki/tls/private/
mv -i server.crt /etc/pki/tls/certs

パーミッションを変更

chmod 600 /etc/pki/tls/private/server.key
chmod 600 /etc/pki/tls/certs/server.crt

SELinux を有効にしている場合は、秘密鍵とSSL証明書にセキュリティコンテキストをつけておきましょう。(Apache 起動時にエラーが発生することがあります)

restorecon -v /etc/pki/tls/private/server.key
restorecon -v /etc/pki/tls/certs/server.crt

CSRを削除

rm server.csr

Apache の HTTP/2 設定

vim /usr/local/apache2/conf/httpd.conf
ServerName のコメントを外してホスト名を指定します。

#ServerName www.example.com:80
 ↓
ServerName www.example.com:80

ServerName の下あたりに(場所はどこでも構いません) HTTP/2 を有効にするための「Protocols h2 http/1.1」ディレクティブを追加します。このディレクティブはバーチャルホストブロックに書くこともできますので、サイトごとに HTTP/2 を有効にすることもできます。

Protocols h2 http/1.1

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_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/localhost.crt
 ↓
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)

起動

systemctl start httpd

自動起動設定

systemctl enable httpd

firewalld設定

HTTP(80/tcp) と HTTPS(443/tcp) を開けておきます。

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload

・確認
firewall-cmd --list-all

public (default, active)
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports: 443/tcp 80/tcp ←この表示があればOK
(略)

HTTP/2 の動作確認

Apache のドキュメントルートに適当なファイルを作成します。

echo 'HTTP/2 works!' > /var/www/html/index.html

WEBブラウザで「https://<アドレス>/」に接続してみると(自己署名のSSL証明書の場合は警告が出ます)、通信プロトコルのバージョンが HTTP/2 になっていることが確認できると思います。

WEBブラウザの開発ツール画面で通信プロトコルを表示

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 をインストールします。

yum install php71u-fpm-httpd

PHP-FPM を Apache と同じ実行ユーザ/グループで動作するように設定します。
vim /etc/php-fpm.d/www.conf

user = php-fpm
group = php-fpm
 ↓
user = apache
group = apache

PHP-FPM を起動し、Apache を再起動します。

systemctl start php-fpm
systemctl restart httpd

おわりに

ここ最近、HTTP/2など新しい機能やバージョンが求められるプロジェクトが増えた気がします。IUSリポジトリが活用できそうですね。

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

コメントを残す

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