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にインストールしたときの手順ですが全く同じです)
バージョン確認
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でも同じです。
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
次に、38行目辺りを以下のように変更します。
; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. ;listen = 127.0.0.1:9000 listen = /var/run/php-fpm/php-fpm.sock
同様に、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}は取得したドメイン名と読み替えてください。
アクセスすると以下のページが表示されます。
「さあ、始めましょう!」を押してください。
データベース情報の入力
次のページに進むと、データベースの情報を入力するように求められます。
上から3つ、「データベース名」、「ユーザー名」、「パスワード」には、 先ほどMySQLの設定のところで確認した「データベース名」、「DB管理者ユーザ名」、「DB管理者パスワード」をそれぞれ入力してください。
データベースのホスト名は、今回のようにWordPressと同じサーバでMySQLを動かす場合は「localhost」のままで大丈夫です。 WordpressをインストールするサーバとMySQLがインストールするサーバが異なる場合は、MySQLサーバのIPアドレスなどを入力することになります。
テーブル接頭辞は「_wp」のままでも構いませんが、少しでもセキュリティを高めておきたい場合は任意の文字列に変更しておきましょう。
入力し終わったら「送信」を押します。
「インストール実行」を押します。
サイト情報と管理者情報の入力
上の画面が表示されたらもう一息です。 以下の情報を入力していきます。 ここで設定する情報は後から変更できます。
サイトのタイトル:ブログのタイトルです。 ユーザ名:サイトの管理者IDです。 パスワード:サイトの管理者IDのパスワードです。出来るだけ複雑なものを使いましょう。 メールアドレス:サイトの管理者のメールアドレスです。 検索エンジンでの表示:世の人に見て欲しい場合はチェックしません。
ここまで入力したら、「Wordpressをインストール」を押します。
上のページが表示されたらWordPressの構築はすべて完了となります。 お疲れ様でした。
おわりに
ここまででサーバの構築は完了しましたが、WordPressで運営されているサーバを狙うクラッカーやBotが多数存在しており、日夜を問わず様々な不正アクセスのリスクがあります。 今回はセキュリティ面での対策には立ち入りませんが、WordPressサーバを自前で運営する場合は、セキュリティ対策を怠らないようにしましょう。