今時で高速なWordPressを楽に構築する(CentOS7 + HTTP/2 + Let’s Encrypt + HSTS + PHP7)
2月 25, 2018 — 15:47

速度的に欲を言えばNginxの方が良さそう?なのですが
利便性(やっぱりhtaccessは使いたい)を考えてApacheにしています。

下手にソースコードをビルドするとその後に脆弱性が見つかったなどでアップデートするのが面倒になったりするのですが、既にそんなことせずとも何とかなりそうだったのでメモしておきます。

リポジトリ(epel + IUS)を追加

$ sudo yum -y install epel-release
$ sudo rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm 

Apache2.4(HTTP/2対応)のインストール

$ sudo yum -y install httpd24u httpd24u-devel httpd24u-mod_ssl

設定方法は Webサーバー構築(Apache) (CentOSで自宅サーバー構築様) を参照

マルチプロセッシングモジュール (MPM)の確認

ApacheでHTTP/2を実現するためにはMPMがEVENTになっている必要がある。
以下の設定ファイルを開きMPMがEVENTになっているのを確認する。

$ sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so

HTTP/2用の設定ファイルを作成

設定ファイルを新規追加する。

パラメータ

  • h2(TLS接続)
  • h2c(非暗号接続)
  • H2Direct(HTTP/2でのダイレクト接続の許容の可否)
$ sudo vi /etc/httpd/conf.d/http2.conf
<IfModule http2_module>
    Protocols h2 h2c http/1.1
    H2Direct on
</IfModule>

MariaDBのインストール

$ sudo yum -y install mariadb-server

設定方法は データベースサーバー構築(MariaDB) (CentOSで自宅サーバー構築様) を参照

PHP7.1のインストール(PHP-FPM)

$ sudo yum -y install php71u-mysqlnd php71u-fpm-httpd \
  php71u-cli php71u-mcrypt php71u-gd php71u-xml \
  php71u-mbstring php71u-json php71u-devel php71u-pdo \
  php71u-process

PHP-FPMの設定

実行ユーザ、グループを適切なものに変更します。

実行ユーザをユーザ毎に変えたい(suPHPの様な事をしたい)場合は、その度に設定ファイルを追加してPHP-FPMを再起動してやる必要がありそうです(未確認)。

$ sudo vi /etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = apache
group = apache
$ sudo systemctl start php-fpm.service
$ sudo systemctl enable php-fpm.service

Apache24への設定反映

基本はデフォルトで特に問題ないはずです。

$ sudo cat /etc/httpd/conf.d/php-fpm.conf
# This configuration requires httpd 2.4 with support for UDS (Unix domain
# sockets).  This was added upstream in version 2.4.10, and was also backported
# to 2.4.6 in EL7.

# The following lines prevent .user.ini files from being viewed by Web clients.
<Files ".user.ini">
    Require all denied
</Files>

# Allow php to handle Multiviews.
AddType text/html .php

# Add index.php to the list of files that will be served as directory indexes.
DirectoryIndex index.php

# Enable http authorization headers.
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
    #SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>

Let’s Encryptで証明証を発行するためのコマンドをインストール

$ sudo yum -y install certbot python-certbot-apache

証明書発行時に利用する公開ディレクトリの作成と設定

Let’s Encryptがドメイン保有者からの発行依頼であることを確認するためにアクセスしにくるファイルを設置する公開ディレクトリを、サーバ内で共通の場所を使用するようにする(バラバラでも良いが、何かと面倒なので共通化)。

$ sudo mkdir -p /var/www/letsencrypt/.well-known
$ sudo vi /etc/httpd/conf.d/letsencrypt.conf
Alias /.well-known /var/www/letsencrypt/.well-known

証明書の発行と自動更新

証明書を発行する
途中、色々聞かれるが特に難しい事は無い

$ sudo certbot certonly --webroot -w /var/www/letsencrypt/ -d example.net -d www.example.net

証明書を自動で更新するためにcronに以下のように設定を追加する

$ sudo vi /etc/cron.d/certbot
0 5 * * * root certbot renew --quiet

WordPressのインストール
インストール方法は ブログサイト構築(WordPress) (CentOSで自宅サーバー構築様) を参照

※ php-mysqlインストールとApacheの設定は不要

WordPressを公開するVirtual Hostの設定
HTTPで接続してきた場合はHTTPSになるようにリダイレクトします。

HSTSを指定しているので、ブラウザが覚えて常にHTTPSで接続するようになります。

$ sudo vi /etc/httpd/conf.d/virtualhost-01.www.conf
<VirtualHost *:80>
    ServerName example.net
    ServerAlias www.example.net

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    </IfModule>
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.net/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.net/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.net/chain.pem

    ServerName example.net
    ServerAlias www.example.net
    DocumentRoot "/var/www/html"

    Header set Strict-Transport-Security "max-age=31536000"
</VirtualHost>

Apache24を再起動します。

$ sudo systemctl restart httpd.service

参考サイト