CentOS7.5 Webサーバ構築 HTTP/2でWebサイトを高速化

Webサイト制作では、Retinaディスプレイ対応やJS、CSSの肥大化などでファイルを圧縮してもデータ容量が大きくなりページ読み込みに時間がかかる事も散見されます。
ページの表示が遅いとユーザ離脱の要因となるため、できるだけページ読み込み時間は短縮したいところです。

最近では常時SSL化も多くなっており、SSLが導入されていれば、HTTP/2対応することでページ読み込みを速くすることが出来ます。
レンタルサーバでもさくらインターネットが対応しており今後対応するレンタルサーバはどんどん増えていくと思います。

Contents

HTTP/2とは

HTTP/2とは、SSL化したWebサイトで、通信効率を高めることで、ページ表示速度を速くする通信規格です。
従前のHTTP/1.1による通信ではサーバリクエストを順番にレスポンスする流れでしたが、HTTP/2通信では、複数のリクエストを同時に処理することができるので、ページ全体の読み込み時間が短くなります。
HTTP1.1とHTTP/2のリクエスト、レスポンスの流れは下図のようになります。

この図だけ見ると、HTTP/2は断然早いように見えますが、実際はあまり差が出ないことが多いです。
しかし、TwitterやFacebookなどのSNSやgoogle、Yahoo!、食べログなど大規模なWebサービスでも利用されているので今後に期待したいです!

HTTP/2の効果が有るサイト

  • SSLに対応しているサイト
  • 画像などのファイルが多いサイト
  • 細かいCSSやJavaScriptを大量に読み込むサイト
  • サイトのドメイン内にファイルが集約されている

HTTP/2の効果が無いサイト

  • SSLに未対応のサイト
  • 動画主体のサイト
  • ZIPファイルなど1ファイルの容量が大きいサイト

SCL(Software Collections)を利用したインストール

HTTP/2の設定では、httpdをソースからコンパイルしてインストールすることが多いのですが、yumコマンドで設定できたほうが、扱いやすいのでSCLパッケージを利用したyumコマンドで設定します。
SCLとはRed Hat が提供するhttpdやPHP、MariaDBなどのアプリケーションのパッケージです。
標準パッケージ(yumインストール)よりも新しいパッケージを利用することができ、標準パッケージとも共存可能なものとなります。

作業について

以下の作業はroot権限で作業しています。root権限以外で作業する場合はsudoを付けるなど読み替えてください。

標準パッケージのhttpdは削除

httpdがインストールされている場合は削除しておきます。

インストールされているか確認

# yum list installed | grep httpd
# yum list installed | grep php

インストールされていたらhttpdとphpを削除

# yum remove httpd*
# yum remove php*

SCL リポジトリの追加

# yum install centos-release-scl

httpdとPHPの必要パッケージを追加

PHPを使用する場合は、httpdと一緒にインストールしておきます。今回はHTTTP/2を利用するため、PHPはよく使用されているmod_phpではなく、FPM(FastCGI Process Manager)で動作させるようにします。

# yum install rh-php72 rh-php72-php-fpm rh-php72-php-json rh-php72-php-zip rh-php72-php-xml rh-php72-php-devel rh-php72-php-gd rh-php72-php-mbstring rh-php72-php-mysqlnd rh-php72-php-pdo httpd24-httpd httpd24-libnghttp2 httpd24-mod_proxy_html httpd24-mod_session httpd24-mod_ssl

ソフトウェアコレクションを有効化

# source scl_source enable httpd24 rh-php72

SCLをログイン時に有効化

httpdを有効化するため、以下のファイルを作成します。

# vi /etc/profile.d/httpd24.sh

以下内容を記載

#!/bin/bash
source scl_source enable httpd24

PHPを有効化するため、以下のファイルを作成します。

# vi /etc/profile.d/php72.sh

以下内容を記載

#!/bin/bash
source scl_source enable rh-php72

シンボリックリンクを作成

SCLではファイルの配置等が異なります。
このままだとわかりにくいので、標準パッケージと同様にパスを利用できるようにシンボリックリンクを作成します。

# ln -s {/opt/rh/httpd24/root,}/etc/httpd
# ln -s {/opt/rh/httpd24/root,}/var/www
# ln -s /etc/httpd/logs /var/log/httpd
# ln -s /usr/lib/systemd/system/{httpd24-,}httpd.service

php.iniのシンボリックリンクも作成しておきます。

# ln -s /etc/opt/rh/rh-php72/php.ini /etc/php.ini

MPM を Prefork から Event に変更

以下のファイルを編集します。

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

php-fpm.confの編集

以下のファイルを編集します。

# vi /etc/httpd/conf.d/php-fpm.conf

以下内容を記載

<FilesMatch \.php>
SetHandler application/x-httpd-php
SetHandler "proxy:fcgi://127.0.0.1:9000"
DirectoryIndex index.php
</FilesMatch>

仮想ドメイン設定と証明書設定

# vi /etc/httpd/conf.d/vhosts.conf

以下内容を記載
ドキュメントルートやログのディレクトリは適宜作成してください。
また、SSL証明書や秘密鍵も適宜配置してください。

<VirtualHost *:80>
ServerName example.com
ServerAdmin root@localhost
DocumentRoot /opt/rh/httpd24/root/var/www/vhosts/example_com/html
ErrorLog /opt/rh/httpd24/root/var/www/vhosts/example_com/log/error_log
CustomLog /opt/rh/httpd24/root/var/www/vhosts/example_com/log/access_log combined
<Directory "/opt/rh/httpd24/root/var/www/vhosts/example_com/html">
Options FollowSymLinks ExecCGI
AllowOverride All
allow from all
Options +Indexes
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerName example.com:443
Protocols h2 h2c http/1.1
ServerAdmin root@localhost
DocumentRoot /opt/rh/httpd24/root/var/www/vhosts/example_com/html
ErrorLog /opt/rh/httpd24/root/var/www/vhosts/example_com/log/ssl_error_log
CustomLog /opt/rh/httpd24/root/var/www/vhosts/example_com/log/ssl_access_log combined
SSLCertificateFile /etc/pki/tls/certs/example_com.crt
SSLCertificateKeyFile /etc/pki/tls/private/example_com.key
SSLCACertificateFile /etc/pki/tls/certs/example_com.ca-bundle
<Directory "/opt/rh/httpd24/root/var/www/vhosts/example_com/html">
Options FollowSymLinks ExecCGI
AllowOverride All
allow from all
Options +Indexes
</Directory>
</VirtualHost>

httpd起動時にpass phrasesを求められないように設定

以下内容を記載

Apacheでの、パスフレーズ入力なしでの起動方法を設定します。
以下を実行してパスフレーズを求められたらCSRを発行した際に作成した、秘密鍵のパスフレーズを入力します。

# cd /etc/pki/tls/private/
# openssl rsa -in example_com.key.pem -out example_com.key

mod_deflateでコンテンツを圧縮してサイトを高速化

圧縮設定はしなくても良いのですが、Webフォント利用などでデータも大きくなるので少しでも容量を抑えたいです。
10%~20%くらいは容量が減らせるので意外とページ読み込み速度の効果が出ます。

以下のファイルを作成します。

# vi /etc/httpd/conf.d/deflate.conf

以下内容を記載

<IfModule mod_deflate.c>
#mod_deflateを有効化
SetOutputFilter DEFLATE

#圧縮レベルを指定
DeflateCompressionLevel 1

#古いブラウザは圧縮対象から除外
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# jpg、gif、ZIPファイルは圧縮対象から除外
SetEnvIfNoCase Request_URI\.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
</IfModule>

【注記】
DeflateCompressionLevelは.htaccessでは設定できません。
.htaccessで圧縮レベル「DeflateCompressionLevel」を指定すると500 Internal Server Errorになります。

security.conf 追記

基本的なセキュリティ設定を行います。
以下のファイルを作成します。

# vi /etc/httpd/conf.d/security.conf

以下内容を記載

# バージョン情報の隠蔽
ServerTokens Prod
Header unset "X-Powered-By"
# httpoxy 対策
RequestHeader unset Proxy
# クリックジャッキング対策
Header append X-Frame-Options SAMEORIGIN
# XSS対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff
# XST対策
TraceEnable Off

ウェルカム画面を無効化

デフォルトで表示されるウェルカム画面を無効にするために。welcome.confは削除またはリネームします。

# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf_Off

httpdの起動と自動起動設定

# systemctl start httpd
# systemctl enable httpd

php-fpmの起動と自動起動設定

# systemctl start rh-php72-php-fpm
# systemctl enable rh-php72-php-fpm

OS設定

ネットワーク上にFirewallが設置されている場合は、firewalldを停止して自動機能を停止します。
VPSなどOS付属のFireplace Wall(ipable)を使用している場合は停止せずに設定する必要があります。

# systemctl stop firewalld
# systemctl disable firewalld

SE Linuxも無効化

# vi /etc/selinux/config

SELINUX=enforcing
↓ disabled に変更
SELINUX=disabled

動作確認

Chromeのdeveloperツールを開きnetoworkタブのprotocolが「h2」になっていることを確認します。


以上で、設定は完了となります。

(Visited 1,460 times, 1 visits today)