LHMP(CentOS、H2O、MySQL、PHP)+Let's EncryptでWordPressを構築するまでの完全手順

LHMPとは

LAMP(Linux, Apache, MySQL, PHP)の構成をもじった私の造語です。 一般用語ではありませんのでご了承ください。

今回構築するWordPress環境

IaaSで調達したルート権限のあるサーバに以下の構成でインストールします。

OS
CentOS 7.5
Webサーバ
H2O 2.2
アプリケーションサーバ
PHP 7.2 (php-fpm)
データベースサーバ
MySQL 5.7
SSL証明書
Let's Encrypt

H2Oのインストール

インストール手順

過去記事参照(記事はCentOS7.3にインストールしたときの手順ですが全く同じです)

blog.boost-up.net

バージョン確認

h2o -v

実行結果

h2o version 2.2.5
OpenSSL: LibreSSL 2.4.5
mruby: YES

PHPのインストール

Webサーバにapacheを使う場合は割とmod_phpを使うことが多いのですが、 今回はphp-fpmを使ったサーバを構築します。

インストール手順

epelとremiリポジトリをインストールした後、yumで一括インストールします。

yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install --enablerepo=remi,remi-php72 php php-devel php-mbstring php-pdo php-gd php-mcrypt php-mysql php-fpm

バージョン確認

php -version

実行結果

PHP 7.2.6 (cli) (built: May 23 2018 09:50:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

MySQLのインストール

インストール前にMySQLと親戚関係にあるMariaDBのライブラリと既存のディレクトリを削除します。

yum remove mariadb-libs
rm -rf /var/lib/mysql/

インストール手順

yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum -y install mysql-community-server

バージョン確認

mysqld --version

実行結果

mysqld  Ver 5.7.22 for Linux on x86_64 (MySQL Community Server (GPL))

ここまでで、ソフトウェアのインストール作業は終了です。

Wordpressのダウンロード

最新版の取得

cd /{path-to-download}
wget https://ja.wordpress.org/latest-ja.tar.gz
tar zxvf latest-ja.tar.gz

{path-to-download}は任意のインストールディレクトリに読み替えてください。

{path-to-download}以下にWordpressが解凍されましたので、 ここからはこのパスを前提に各種の設定を進めていきます。

Let's Encryptの導入

無料のSSLサーバ証明書サービスであるLet's Encryptを導入します。 こちらは過去記事を参照して導入します。 過去記事はRails環境を構築する際に書いたものですが、WordPressでも同じです。

blog.boost-up.net

h2oの設定

ユーザとグループの作成

サービスを実行するユーザとそのユーザが所属するグループを作成します。 ここではいずれも「h2o」にしていますが、名称は何でも構いません。

groupadd h2o
useradd -g h2o --shell /sbin/nologin h2o

h2o.confの設定

h2oをyumでインストールした場合、h2o.confは"/etc/h2o/h2o.conf"にあります。

細かい設定は色々ありますが、今回は重要な部分のみ抜粋します。 環境や要件によって見直しが必要な部分があるかも知れません。

以下については適宜読み替えを行ってください。

{path-to-cert-file}にはLet's Encryptで作ったSSL証明書のパスを指定します。

{path-to-key-file}にはLet's Encryptで作った秘密鍵のパスを指定します。

{fqdn}にはドメイン名を指定します。このブログであれば“blog.boost-up.net”になります。

{path-to-wordpress}にはWordPressのディレクトリを指定します。解凍してできた最上位フォルダを含めて指定してください。

user: h2o  #実行ユーザ
gzip: ON  #コンテンツを圧縮して通信量削減を図る
http2-casper: ON  #接続してきたクライアントがキャッシュを持っている場合にserver-pushを行わないようにする

# php-fpmを利用するための設定
file.custom-handler:
  extension: .php
  fastcgi.connect:
    port: /var/run/php-fpm/php-fpm.sock
    type: unix

# リクエストされたURLがディレクトリの場合、以下のファイルが指定されたものとして処理
file.index: [ 'index.php', 'index.html' ]


# ホストの設定 ※非SSLでのアクセスはSSLにリダイレクトします
hosts:
  "{fqdn}:443":
    header.add: "X-UA-Compatible: IE=Edge"
    listen:
      port: 443
      host: 0.0.0.0
      ssl:
        certificate-file: "{path-to-cert-file}"
        key-file: "{path-to-key-file}"
        # chpher-suiteは時代に合わせて見直す必要があります
        cipher-suite: "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"
        cipher-preference: server

    paths:
      "/":
        file.dir: {path-to-wordpress}
        redirect:
          url: /index.php/
          internal: YES
          status: 307

  "{fqdn}:80":
    listen:
      port: 80
      host: 0.0.0.0
    paths:
      "/":
        redirect:
          status: 301
          url: https://{fqdn}/

サービスの有効化と起動

systemctl enable h2o
systemctl start h2o
systemctl status h2o

画面にActive: active(running)と表示されれば正常に起動しています。 起動できない場合はh2o.confの文法や設定に誤りがあるので、"/var/log/message"などを確認しながら修正してください。

PHPの設定

php-fpm.confの設定

"/etc/php-fpm.conf"を見ると、以下のように他のconfファイルを読み込んでいることが分かります。

include=/etc/php-fpm.d/*.conf

今回は、読込先のフォルダにある"www.conf"を編集します。

実行ユーザとグループの変更

h2oユーザで実行するように変更します。 修正箇所は20行目辺りにあります。

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = h2o
; RPM: Keep a group allowed to write in log dir.
group = h2o

同様に、45行目辺りも以下のように変更します。

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = h2o
listen.group = h2o
;listen.mode = 0660

次に、同一サーバ内のh2oからのみ接続できるように、allowed_clientsを指定します。 該当箇所は59行目付近になります。

; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
listen.allowed_clients = 127.0.0.1

ここまで変更したら保存して閉じます。

サービスの有効化と起動

systemctl enable php-fpm
systemctl start php-fpm
systemctl status php-fpm

画面にActive: active(running)と表示されれば正常に起動しています。 起動できない場合はphp-fpm.conf(www.conf)の文法や設定に誤りがあるので、"/var/log/message"などを確認しながら修正してください。

MySQLの設定

初期パスワードの変更

まずはインストール時に自動生成されているパスワードを確認するため、"/var/log/mysqld.log"を開きます。 「temporary password」などでファイル内を検索すると以下のような記述が見つかると思います。

2018-06-04T14:40:32.797547Z 1 [Note] A temporary password is generated for root@localhost: {initial_password}

ここで、{initial_password}の箇所に記載されているのが初期パスワードになりますので、コピーするなどして記録しておきます。

MySQLの初期化

以下のコマンドを実行し、画面の指示に従って作業を進めます。

$ mysql_secure_installation

最初に「Enter password for user root:」と聞かれますので、ここで先ほど確認した初期パスワードを入力します。 以降は画面の指示に従って必要な情報を入力します(この部分は他のサイトで細かく解説しているところが沢山あるので省略します)。

データベースの作成

先ほど変更した新パスワードを使ってMySQLにログインします。 以下のコマンドを実行して「Enter password:」と表示されたら新パスワードを入力してください。

$ mysql -u root -p
Enter password:

ログインに成功すると以下が表示されます。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15681
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

以下のコマンドを発行してデータベースを作成します。

{database_name}は作成したい任意のデータベース名を入力してください。 絵文字なども扱えるように、文字コードセットには"utf8mb4"を指定します。

mysql> CREATE DATABASE {database_name} CHARACTER SET utf8mb4;

次にデータベースの管理者ユーザを作成するため、以下のコマンドを実行します。

{db_user_name}には任意のDB管理者ユーザ名を、{db_user_password}には任意のDB管理者パスワードを指定します。 パスワードの複雑さ要件を満たすよう注意してください。

mysql> GRANT ALL PRIVILEGES ON {database_name}.* TO {db_user_name}@localhost IDENTIFIED BY '{db_user_password}';

エラーなくコマンドが実行出来たら、最後に以下のコマンドを実行し、変更を確定させます。

mysql> FLUSH PRIVILEGES;

以上でMySQLの設定は完了です。

ここで作った「データベース名」、「DB管理者ユーザ名」、「DB管理者パスワード」はこの後のWordPressのインストールで使用しますので控えておいてください。

Wordpressのインストール

いよいよ最後のWordpressのインストールを行います。

インストールページのURL

ブラウザを起動し、次のURLにアクセスします。 https://{fqdn}/wp-admin/install.php

{fqdn}は取得したドメイン名と読み替えてください。

アクセスすると以下のページが表示されます。 「さあ、始めましょう!」を押してください。 f:id:boost-up:20180810205224p:plain

データベース情報の入力

次のページに進むと、データベースの情報を入力するように求められます。

f:id:boost-up:20180810205409p:plain

上から3つ、「データベース名」、「ユーザー名」、「パスワード」には、 先ほどMySQLの設定のところで確認した「データベース名」、「DB管理者ユーザ名」、「DB管理者パスワード」をそれぞれ入力してください。

データベースのホスト名は、今回のようにWordPressと同じサーバでMySQLを動かす場合は「localhost」のままで大丈夫です。 WordpressをインストールするサーバとMySQLがインストールするサーバが異なる場合は、MySQLサーバのIPアドレスなどを入力することになります。

テーブル接頭辞は「_wp」のままでも構いませんが、少しでもセキュリティを高めておきたい場合は任意の文字列に変更しておきましょう。

入力し終わったら「送信」を押します。

f:id:boost-up:20180810210154p:plain

「インストール実行」を押します。

サイト情報と管理者情報の入力

f:id:boost-up:20180810210532p:plain

上の画面が表示されたらもう一息です。 以下の情報を入力していきます。 ここで設定する情報は後から変更できます。

サイトのタイトル:ブログのタイトルです。 ユーザ名:サイトの管理者IDです。 パスワード:サイトの管理者IDのパスワードです。出来るだけ複雑なものを使いましょう。 メールアドレス:サイトの管理者のメールアドレスです。 検索エンジンでの表示:世の人に見て欲しい場合はチェックしません。

ここまで入力したら、「Wordpressをインストール」を押します。

f:id:boost-up:20180810211129p:plain

上のページが表示されたらWordPressの構築はすべて完了となります。 お疲れ様でした。

おわりに

ここまででサーバの構築は完了しましたが、WordPressで運営されているサーバを狙うクラッカーやBotが多数存在しており、日夜を問わず様々な不正アクセスのリスクがあります。 今回はセキュリティ面での対策には立ち入りませんが、WordPressサーバを自前で運営する場合は、セキュリティ対策を怠らないようにしましょう。