WordPress構築(CentOS7 Nginx MariaDB PHP7)

この記事の目的

  • 初心者でもほぼコピペで構築できる
  • 筆者が再構築時に使う手順書

WordPressはWebサーバ(Nginx)、データベース(MariaDB)、プログラミング言語(PHP)をインストールして動作します。 WordPressの構築はよくハンズオンセミナーで教材として使われているくらい初心者が初めて構築するのに取り組みやすいので、ぜひこれを機会に試してみたはいかがでしょうか。

LAMPとは

昔はLinux,Apache,MySQL,PHPの頭文字をとってLAMPと言われる環境でしたが、MySQLがオラクルに吸収されたり、Nginxが台頭してきたりしてメジャーと言われる構成が変わってきています。

コマンドについて

環境に応じてrootユーザ、sudoでコマンドを実行してください。

OSのセットアップは完了済みとします。SELINUXはdissableにしています。

PHP7.1のインストール

CentOS7.2ではデフォルトのレポジトリではPHP7をインストールすることができません。 そこで、PHP7をインストールできるレポジトリを設定します。

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

コマンド解説

1行目:epelレポジトリを登録します。 2行目:remiレポジトリを登録します。 3行目:remiレポジトリを指定してPHP7、PHPモジュール関係をインストールします。

PHPのモジュールは環境によって不要なものもありますが、導入をおすすめします。 WordPressのテーマによってはモジュールがインストールされていないと正常に動作しないものがあるからです。

インストールしたらバージョンを確認しましょう。 7.1.10がインストールされています。

php -v
PHP 7.1.10 (cli) (built: Sep 27 2017 08:27:18) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

Webサーバ上でPHPのプログラムを動作させるために先ほどインストールしたphp-fpmを起動させます。

systemctl start php-fpm.service
systemctl enable php-fpm.service

コマンド解説

1行目:php-fpmサービスを起動します。 2行目:php-fpmサービスが自動起動するように設定します。 自動起動を設定していない場合、再起動時に手動でサービスを起動する必要が出てきます。 これを忘れると再起動時にブログが見れない状態になってしましますので忘れないようにしましょう。

最後にプロセスが起動しているか確認します。

ps aux | fgrep "php-fpm"
root       810  0.0  1.2 322108 12712 ?        Ss   Oct25   0:46 php-fpm: master process (/etc/php-fpm.conf)
nginx      846  0.0  6.6 458604 67004 ?        S    Oct25   1:03 php-fpm: pool www
nginx      847  0.0  5.8 451720 58868 ?        S    Oct25   1:02 php-fpm: pool www
nginx      848  0.0  6.2 456332 62964 ?        S    Oct25   1:05 php-fpm: pool www
nginx      849  0.0  6.2 454388 63536 ?        S    Oct25   1:05 php-fpm: pool www
nginx      850  0.0  5.6 451676 57236 ?        S    Oct25   1:04 php-fpm: pool www
nginx     1522  0.0  5.7 452380 58720 ?        S    Oct25   1:03 php-fpm: pool www
nginx     1526  0.0  5.8 451708 59700 ?        S    Oct25   1:05 php-fpm: pool www
nginx     1846  0.0  6.0 454352 61792 ?        S    Oct25   1:01 php-fpm: pool www
root      9200  0.0  0.0 112660   884 pts/0    R+   18:20   0:00 grep -F --color=auto php-fpm
nginx    30054  0.0  5.7 453264 58460 ?        S    Nov04   0:32 php-fpm: pool www

Nginxのインストール

今回はNginxの公開レポジトリをviでファイルに記述して設定を行います。

vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

PHPの時と同様にレポジトリを指定してNginxをインストールします。

yum -y --enablerepo=nginx install nginx

インストールしたらバージョンを確認しましょう。

nginx -v
nginx version: nginx/1.12.2

バージョンを確認したら、サービスの起動、自動起動の設定をします。

systemctl start nginx.service
systemctl enable nginx.service

プロセスが起動しているか確認します。

ps aux | fgrep "nginx" | fgrep -v "php-fpm"
root      1789  0.0  0.1  58724  1216 ?        Ss   Oct25   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     1790  0.0  0.4  60228  4816 ?        S    Oct25   0:03 nginx: worker process
root      9204  0.0  0.0 112660   876 pts/0    R+   18:22   0:00 grep -F --color=auto nginx

構築のパターンの一つ

すでにお気付きの方も多いと思いますが、インストール>バージョン確認>起動・自動起動設定>プロセス確認 が基本の流れとなります。

MariaDBのインストール

公式サイト「https://downloads.mariadb.org/mariadb/repositories/」からレポジトリファイルに記入する内容を確認します。

[参考]

TIP

Stable、ALphaバージョン Stableは安定バージョン、ALphaは先行(不安定)版です。 今回はStableバージョンの最新版である10.2をインストールします。

vi /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
yum -y --enablerepo=mariadb install MariaDB-devel MariaDB-client MariaDB-server

バージョン確認をします。

mysql --version
mysql  Ver 15.1 Distrib 10.2.9-MariaDB, for Linux (x86_64) using readline 5.1

サービスの起動・自動起動を設定します。

systemctl restart mysqld.service
systemctl enable mysqld.service

もしくは

systemctl restart mariadb.service
systemctl enable mariadb.service

プロセスが起動していることを確認します。

ps aux | fgrep "mysqld"
mysql      844  0.0 17.1 1318996 173856 ?      Ssl  Oct25   5:32 /usr/sbin/mysqld

mysql.serviceでいいの?

CentOS7では問題ありません。 もちろんmariadb.serviceでコマンドを実行しても構いません。 なぜ大丈夫なのかと言いますとシンボリックリンクが貼られているからです。 そのため、どちらのコマンドを実行してもMariaDBが起動します。

シンボリックリンクの確認

ls -l /etc/systemd/system/mysql*
lrwxrwxrwx 1 root root 39 Oct 23 15:58 /etc/systemd/system/mysqld.service -> /usr/lib/systemd/system/mariadb.service
lrwxrwxrwx 1 root root 39 Oct 23 15:58 /etc/systemd/system/mysql.service -> /usr/lib/systemd/system/mariadb.service
systemctl enable mysqld.service
Failed to execute operation: Too many levels of symbolic links

こんなエラーに遭遇した人へ

systemctl enableはコマンド実行時にシンボリックを貼ります。しかしすでにシンボリックリンクのあるmysqld.serviceにはシンボリックリンクを貼ることができずにエラーになります。 その場合は一度シンボリックリンクを削除してから実行しましょう。

#シンボリックリンクを削除するコマンド
unlink /etc/systemd/system/mysqld.service
unlink /etc/systemd/system/mysql.service

ここまででミドルウェアのインストールが完了です。 次はアプリケーションのWordPressを配置していきます。

WordPressのインストール

公式サイトからURLを確認します。 https://ja.wordpress.org/ 画面右の「.tar.gz 形式をダウンロード」を右クリックし、リンクのURLを確認、コピーします。

今回は以下のURLを使用します。 https://ja.wordpress.org/wordpress-4.8.3-ja.tar.gz

cd /tmp
wget https://ja.wordpress.org/wordpress-4.8.3-ja.tar.gz
tar xzvf wordpress-4.8.3-ja.tar.gz
mkdir /var/www/wordpress
cp -rp /tmp/wordpress/* /var/www/wordpress/

/var/www/wordpress/は好きなパスを設定してください。 今回はこの設定で導入していきます。 後ほどNginxの設定時にDocumentRootとしてこのパスを設定します。 私は/tmpディレクトリにwordpressの圧縮ファイルをダウンロード、解凍してその中身を実際の配置場所にコピーしています。

wgetが使えない?

CentOS7を導入時に最小構成でインストールした場合、wgetが使えないことがあります。 その場合はyumコマンドでインストールをしましょう。 yum -y install wget

各種ミドルウェアの設定

変更が必要箇所のみ記載しています。

PHPの設定

PHPの文字コード、タイムゾーン、言語を設定します。

vi /etc/php.ini
default_charset = "UTF-8"
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese

PHP-FPMの設定

vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx

設定反映のため、再起動します。

systemctl restart php-fpm.service

MariaDBの設定

vi /etc/my.cnf.d/server.cnf
[mysqld]
character-set-server = utf8
skip-character-set-client-handshake

[mysql]
default-character-set = utf8

MariaDBのセキュリティ設定

いろいろ英語で出力されますので、内容を記載します。 基本的にはYes(Y)で問題ありません。

mysql_secure_installation
Set root password? [Y/n]   # rootのパスワードを設定します。(Y)
パスワードを設定
Remove anonymous users? [Y/n]   # 匿名ユーザでのログインをできないようにします。(Y)
Disallow root login remotely? [Y/n]   # リモートからrootでのログインを禁止します。(Y)
Remove test database and access to it? [Y/n]   # testデータベースを削除します。(Y)
Reload privilege tables now? [Y/n]   # 設定反映のため、ユーザ権限テーブルをすぐにリロードします。(Y)

MariaDBでWordPressに使用するDBを作成

以下の項目でデータベースを作成していきます。

  • データベース名:wordpress
  • ユーザ名:wpadmin
  • パスワード:wppassword
mysql -u root -p
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

MariaDB [(none)]> CREATE DATABASE `wordpress` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
MariaDB [(none)]> CREATE USER `wpadmin`@`localhost` IDENTIFIED BY `wppassword`;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON `wordpress`.* TO `wpadmin`@`localhost`;

コマンド解説

1行目:UTF-8でwordpressという名前のデータベースを作成 2行目:localhostのサーバでwpadminユーザを作成しwppasswordのパスワードを設定 3行目:wordpressのデータベースを操作できる権限をwpadminユーザに設定

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

MariaDB [(none)]> CREATE DATABASE `データベース名` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
MariaDB [(none)]> CREATE USER `ユーザ名`@`localhost` IDENTIFIED BY `パスワード`;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON `データベース名`.* TO `ユーザ名`@`localhost`;

MariaDBを再起動します。

systemctl restart mysqld.service

最後に作成したDBが正しく権限設定されているか確認します。

mysql -u wpadmin -p
MariaDB [(none)]> show databases;

作成したDBが表示されることを確認します。

Nginxの設定

Nginxの共通設定の変更

Nginx経由でアップロードするファイルサイズの上限を変更します。 デフォルトでは上限が1MBなので5MBに上限を上げています。 WordPressのテーマをアップロードする際に上限に引っかかったので、設定を入れています。

vi /etc/nginx/nginx.conf
http {
    …
    client_max_body_size 5M; #アップロード制限
    …

バーチャルホストの設定

ドメインは取得済みで名前解決ができることを前提としています。 最終的にSSL化を行いHTTPS化しますが、最初はHTTPでの設定を行います。

/etc/nginx/conf.d/wordpress.conf
server {
    listen 80;
    server_name example.com; # 取得したドメインを指定してください
    root /var/www/wordpress; # WordPressのディレクトリを指定します。
    index index.php;

location / {
    if (!-e $request_filename) {
    rewrite ^.+?($/-.*) $1 last;
    rewrite ^.+?(/.*\.php)$ $1 last;
    rewrite ^ /index.php last;
    break;
  }
}
	
# wp-config.phpへのアクセスをすべて拒否します。
location ~* /wp-config.php {
    deny all;
    }

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME /var/www/wordpress$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    include fastcgi_params;
    }
}</code></pre>

コンフィグチェックとNginxを再起動します。

<pre><code class="language-bash">nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl restart nginx.service

WordPressのインストール

ついにWordPressをインストールしていきます。

まずはnginxがWordPressの操作ができるようにします。

chown -R nginx:nginx /var/www/wordpress

wp-config.phpを作成

  • データベース名:wordpress
  • パスワード:wppassword
  • DBのプレフィックス:wp
cp -p /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
vi /var/www/itinfra/wp-config.php

define('データベース名', 'database_name_here');

/** MySQL データベースのユーザー名 */
define('DBユーザ名', 'username_here');

/** MySQL データベースのパスワード */
define('パスワード', 'password_here');

/** MySQL のホスト名 */
define('localhost', 'localhost');

/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DBのプレフィックス', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

* 認証用ユニークキー
*
* それぞれを異なるユニーク (一意) な文字列に変更してください。
* {@link https://api.wordpress.org/secret-key/1.1/salt/

上記URLから取得した値をコピーして貼り付けします。
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

FireWallのアクセス許可設定

AWSならセキュリティグループで制御できるのでfirewallはオフでいいですが、VPSなどを利用している場合はしっかり制御しましょう。

firewall-cmd --list-all
services: dhcpv6-client ssh
    
firewall-cmd --permanent --add-service=http --zone=public
firewall-cmd --list-all
services: dhcpv6-client http ssh

ブラウザでアクセス

http://ドメイン名/wp-admin/install.php へアクセスし、画面に沿ってユーザを作成して進めれば完了です。

それではよきブログライフを。