WordPress用のサーバを構築する!(CentOS 7)

公開用のWordPressサーバをCentOS 7 + Apache 2.4 + PHP 7.1 + MariaDB 5.5の組み合わせで構築します。サーバは、設定や操作の自由度の高いVPSを使用します。VPSは「ConoHa」、DNSは「Sakura Internet」のサービスを利用します。

VPSとドメイン名の準備

作業開始前に、VPSの契約とドメイン名を取得しておきます。本サイトでは、以下のVPSとDNSのサービスを利用しています。

  • VPSの契約(ConoHa)
  • ドメイン名の取得(Sakura Internet)

設定項目と設定値の準備

主要な設定項目の設定値を決めておきます。

  • サイトのURL
  • サーバ設定用のパラメータ
  • WordPressのDB接続設定用パラメータ
  • WordPressのサイト設定用パラメータ

サイトのURL(例)

マルチサイトを考慮して、サイト全体のURLとサイト個別のURLを決定します。

設定項目 設定値
サイト全体のURL https://lab4ict.com/
サイト個別のURL https://lab4ict.com/system/

サーバ設定用のパラメータ(例)

サーバ名を決めておきます。IPアドレスは、サーバ作成後に確認して控えておきます。

設定項目 設定値
ホスト名 server001
IPアドレス 133.130.127.128(VPSでサーバ作成後に確認)

WordPressのDB接続設定用の設定値(例)

DB作成用および接続用の情報を決めておきます。

設定項目 設定値
データベース名 db01
データベースのユーザー名 db01admin
データベースのパスワード **********
データベースホスト localhost
データベースの接頭辞 wp_

WordPressのサイト設定用の設定値(例)

WordPressサイト作成用の情報を決めておきます。

設定項目 設定値
サイトのタイトル Laboratory for Personal ICT
サイトのユーザー名 admin001
サイトのユーザーのパスワード **********
サイトのメールアドレス admin001@lab4ict.com

VPSでCentOS 7サーバを作成

VPSでCentOS 7のサーバの作成を行います。本稿では、VPSとして「ConoHa」を使用しました。

VPSでSSH鍵生成

VPSのメニューからrootユーザ用のSSHの鍵生成を行い、秘密鍵をサイト管理用のPCダウンロードします。Linuxの場合、ダウンロードした鍵のファイルの権限は、600にします。

$ chmod 600 ~/.ssh/id_rsa_root.pem

VPSでサーバ作成

VPSのメニューから、作成したSSH用の鍵を使用可に設定して、CentOS 7のサーバを作成します。作成完了後、SSHでログインします。以下は、Linuxの例ですが、Windowsの場合は、Tera Term Pro等を使用してください。

$ ssh -l root -i ~/.ssh/id_rsa_root.pem 133.130.127.128

管理者ユーザの追加

rootユーザをリモートログイン不可にするため、作業用の管理者ユーザを2ユーザ作成しておきます。

# useradd -u 1001 -g wheel admin001
# passwd admin001
# useradd -u 1002 -g wheel admin002
# passwd admin002

サイト管理用のSSH接続設定

サイト管理用のPC上で、SSH接続のための鍵を生成します。以下は、Linuxの例ですが、Windowsの場合は、Tera Term Pro等を使用してください。

$ ssh-keygen -t rsa -b 2048 -C "admin001@server001 serialno=1"
$ mv id_rsa id_rsa_admin001
$ mv id_rsa.pub id_rsa_admin001.pub
$ ssh-keygen -t rsa -b 2048 -C "admin002@server001 susralno=1"
$ mv id_rsa id_rsa_admin002
$ mv id_rsa.pub id_rsa_admin002.pub

管理者ユーザそれぞれについて、公開鍵をSSHでサーバに転送し、各ユーザ用に配置します。(admin001の例)

# mkdir /home/admin001/.ssh
# chown admin001:wheel /home/admin001/.ssh
# chmod 700 /home/admin001/.ssh
# mv /root/id_rsa.pub_admin001 /home/admin001/.ssh/authorized_keys
# chmod 600 /home/admin001/.ssh/authorized_keys

SSHのセキュリテイ対策を行います。rootユーザのログインを禁止し、パスワード認証を不可に設定します。

# vi /etc/ssh/sshd_config
...
PermitRootLogin no
...
PasswordAuthentication no
...

SSHの設定を再読み込みし、鍵認証のみでログイン可とします。

# systemctl reload sshd

SSHで接続を試みると、サーバのパスワード無しでログインできます。

$ ssh -l admin001 -i 133.130.127.128

VPSの通信許可ポートの設定

通信制御は、CentOSで行うため、VPSの通信許可ポートの設定は、全て許可に設定します。

CentOS 7の初期設定

サーバへのログイン環境が整ったところで、CentOS 7の初期設定を行います。

CentOS 7のバージョン確認

インストールされているCentOS 7のバージョンを確認します。

$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

ネットワークの設定

ホスト名の設定を行います。

$ sudo hostnamectl set-hostname server001

ネットワークデバイスの状態を確認します。

$ nmcli device
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected eth0
lo loopback unmanaged --

IPアドレスの設定を確認します。

$ ip a
1: lo: ...
2: eth0: ...

SELinuxの設定

SELinuxによるセキュリティは設定を見極めるまで無効化しますが、セキュリティ違反があったことをログで確認できるように"Permissive"モードで動作させます。再起動して変更が有効であるか確認します。

$ sudo vi /etc/selinux/config
...
SELINUX=permissive
...

サーバを再起動します。

$ sudo systemctl reboot

再起動後ログインして、"Permissive"モードであることを確認します。

$ getenforce
Permissive

ドメイン名の取得とDNSの設定

ConoHaのVPSで作成したサーバのIPアドレスを確認し、Sakura InternetのDNS設定ページで、取得したドメインに対して以下のレコード(例)の追加を行います。

エントリ名 タイプ データ 説明
@ A 133.130.127.128 名前解決用
@ MX 10 mail.lab4ict.com. メール受信用
@ TXT "v=spf1 ip4:133.130.127.128 -all" SPF用
@ CAA 0 issue "letsencrypt.org" DNS CAA用
@ CAA 0 iodef "admin001@lab4ict.com" DNS CAA用
mail A 133.130.127.128 名前解決用

CentOS 7の外部リポジトリの登録

PHP等、標準リポジトリより新しいバージョンのソフトウェアをインストールするため、外部リポジトリを登録します。

yum-prioritiesのインストール

リポジトリ間の優先順位を設定するパッケージを、インストールします。

$ sudo yum -y install yum-priorities

EPELリポジトリの登録

EPELリポジトリを登録します。

$ sudo yum -y install epel-release

一時利用に設定します。

$ sudo vi /etc/yum.repos.d/epel.repo
[epel]
...
enabled=0

Remi's RPM repositoryの登録

Remi's RPM repositoryを登録します。

$ sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

一時利用に設定します。

$ sudo vi /etc/yum.repos.d/remi-safe.repo
[remi-safe]
...
enabled=0

CentOS 7のユーティリティのインストール

以後の作業等で必要になるユーティリティを、インストールします。

wgetコマンドのインストール

WordPress等のモジュールのダウンロードするため、wgetコマンドをインストールします。

$ sudo yum -y install wget

Apacheのインストールと初期設定

Apacheをインストールします。SSLが使用できるようにmod_sslもインストールします。

$ sudo yum -y install httpd mod_ssl
$ httpd -version
#Listen 80
Listen 133.130.127.128:80
#ServerName www.example.com:80
ServerName lab4ict.com:80
#ServerAdmin root@localhost
ServerAdmin root@lab4ict.com

Apacheの初期設定を行います。

$ sudo cp -p /etc/httpd/conf/httpd.conf ~/httpd.conf_org
$ sudo vi /etc/httpd/conf/httpd.conf
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</ifModule>

".htaccess"を使用可にする設定を行います。

$ sudo vi /etc/httpd/conf.d/htmldir.conf
<Directory "/var/www/html">
AllowOverride All
</Directory>

通信制御の設定変更を行い、80/tcpと443/tcpの通信を許可します。

$ sudo firewall-cmd --add-port=80/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=443/tcp --zone=public --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all --zone=public | grep tcp
ports: 80/tcp 443/tcp

Apacheを起動します。

$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2017-11-23 17:36:36 JST; 7s ago
...

ブラウザからアクセスして、トップページが表示されることを確認します。

http:/133.130.127.128/

サーバ証明書の取得

Let' Encryptをインストールします。

$ sudo yum -y install --enablerepo=epel certbot certbot-apache

Let' Encryptでサーバ証明書取得します。

$ sudo certbot certonly --webroot -w /var/www/html/ -d lab4ict.com
...
- Congratulations! Your certificate and chain have been saved at:
...

取得したサーバ証明書が存在するか確認します。証明書の有効期限は3ヶ月になります。

$ sudo ls -l /etc/letsencrypt/live/lab4ict.com
total 4
lrwxrwxrwx. 1 root root 35 Dec 29 19:50 cert.pem -> ../../archive/lab4ict.com/cert1.pem
lrwxrwxrwx. 1 root root 36 Dec 29 19:50 chain.pem -> ../../archive/lab4ict.com/chain1.pem
lrwxrwxrwx. 1 root root 40 Dec 29 19:50 fullchain.pem -> ../../archive/lab4ict.com/fullchain1.pem
lrwxrwxrwx. 1 root root 38 Dec 29 19:50 privkey.pem -> ../../archive/lab4ict.com/privkey1.pem
-rw-r--r--. 1 root root 543 Dec 29 19:50 README

サーバ証明書の自動更新のため、サーバ証明書を自動更新するコマンドが正常終了するか確認します。

$ sudo certbot renew --pre-hook "sudo systemctl stop httpd.service" --post-hook "sudo systemctl start httpd.service"

サーバ証明書を自動更新するため、上記で確認したコマンドをcronに登録します。以下は、週1回、月曜日の朝1:00に実行する例になります。

$ su - root
# crontab -e
0 1 * * 1 certbot renew --pre-hook "sudo systemctl stop httpd.service" --post-hook "sudo systemctl start httpd.service"
# crontab -l

ApacheのSSL/TLSの設定

SSL通信用の設定を行います。

$ sudo vi /etc/httpd/conf.d/rewrite.conf
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</ifModule>
$ sudo cp -p /etc/httpd/conf.d/ssl.conf ~/ssl.conf_org
$ sudo vi /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/letsencrypt/live/lab4ict.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/lab4ict.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/lab4ict.com/chain.pem

Apacheを起動します。

$ sudo systemctl stop httpd.service
$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2017-11-23 17:36:36 JST; 7s ago
...

ブラウザからアクセスして、httpsにリダイレクトされてトップページが表示されることを確認します。

http:/lab4ict.com/

PHPのインストールと初期設定

Remi's RPM repositoryより最新のPHP 7をインストールします。

PHP 7のインストールと初期設定

Remi's RPM repositoryとEPELリポジトリを使用してPHP 7.1をインストールします。

$ sudo yum -y install --enablerepo=remi-safe,remi-php71,epel php php-mbstring php-mcrypt php-mysql php-gd
$ php --version
php --version
PHP 7.1.12 (cli) (built: Dec 1 2017 13:53:12) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

PHPの初期設定を行います。タイムゾーン、PHPのバージョン出力、日本語に関連する設定を行います。

$ sudo cp -p /etc/php.ini ~/php.ini_org
$ sudo vi /etc/php.ini
expose_php = Off
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 0
mbstring.strict_detection = Off

動作確認を行います。

$ cd /var/www/html
$ sudo vi phpcheck.php
<?php phpinfo(); ?>
$ sudo chmod 755 phpcheck.php
$ sudo systemctl stop httpd.service
$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2017-11-23 17:36:36 JST; 7s ago
...

ブラウザからアクセスして、PHPのインストール情報のページが表示されることを確認します。

http://133.130.127.128/phpcheck.php

MariaDBのインストールと初期設定

MariaDBをインストールします。

$ sudo yum -y install mariadb mariadb-server
$ mysql --version
mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1

MariaDBを自動起動するように設定します。

$ sudo systemctl enable mariadb.service
$ sudo systemctl is-enabled mariadb.service
enabled

MariaDBを起動します。

$ sudo systemctl start mariadb.service
$ sudo systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2017-11-23 19:15:41 JST; 6s ago
...

MariaDBのインストール後の設定を行います。

$ cd
$ mysql_secure_installation
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
... Success!

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

MariaDBの設定を変更します。

$ sudo cp -p /etc/my.cnf.d/server.cnf ~/server.cnf_org
$ sudo vi /etc/my.cnf.d/server.cnf
...
[mysqld]
character-set-server=utf8

MariaDBを再起動します。

$ sudo systemctl stop mariadb.service
$ sudo systemctl start mariadb.service
$ sudo systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2017-11-23 19:15:41 JST; 6s ago
...

MariaDBにログインし、DBの一覧と文字コードの設定を出力してみます。

$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.05 sec)

MariaDB [(none)]> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

MariaDB [(none)]> exit

Bye

Postfixの設定

ドメイン名のメールアドレス(admin001@lab4ict.com等)で、メールの送受信を可能に設定します。WordPressで指定したメールアドレスからも受信可能なようにalias設定も行います。

通信制御の設定変更を行い、25/tcpの通信を許可します。

$ sudo firewall-cmd --add-port=25/tcp --zone=public --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all --zone=public | grep tcp
ports: 80/tcp 443/tcp 25/tcp

Postfixの設定

Gmailにメール送受信を可能にするため、Postfixの設定を変更します。
3行目:メールサーバ名
4行名:ドメイン名
5行目:ドメイン名
6行目:受信を許可するインターフェース
7行目:自ドメイン名のメールを受信可
8行目:存在しないユーザ宛のメールを受信拒否
9行目:メールの保存先をMaildirに変更

$ sudo cp -p /etc/postfix/main.cf ~/main.cf_org
$ sudo vi /etc/postfix/main.cf
myhostname = mx.lab4ict.com
mydomain = lab4ict.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
local_recipient_maps = unix:passwd.byname $alias_maps

SASLのインストールを行います。

$ sudo yum install cyrus-sasl-plain cyrus-sasl-md5

PostfixにSASLの設定を行います。

$ sudo vi /etc/postfix/main.cf
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

SMTP認証の設定を行います。

$ sudo vi /etc/postfix/sasl_password
[smtp.gmail.com]:587    XXXX@gmail.com:XXXXXXXX
$ sudo chmod 600 /etc/postfix/sasl_password
$ sudo postmap hash:/etc/postfix/sasl_password

Posfixを再起動します。

$ sudo systemctl stop postfix.service
$ sudo systemctl start postfix.service
$ sudo systemctl status postfix.service
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) 
...

Gmail側で「安全性の低いアプリの許可」を「有効」に設定します。

おわりに

以上で、WordPress用サーバのOSとDBのインストールと初期設定が完了しました。

次の記事

次は、以下の記事にお進みください。

関連記事