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」になっていることを確認します。
以上で、設定は完了となります。