CentOSにWordpressをインストールしてNginxで動かす方法【Virtual Host対応】

はじめに

仕事でVPSサーバー上にWordpressを構築する機会があったので手順に残したいと思います。VPSサーバーでは既にRuby on Railsで作成したWebアプリが稼働していたので、NginxのVirtual Host機能で複数ドメインの振り分けを行いました。
NginxのVirtual Host機能については以下の記事で説明しています。

Wordpress構築の手順については以下のページを大いに参考にさせていただきました。ありがとうございます。

  • CentOS 7.7
  • Nginx 1.16.1

PHP/PHP-FPM

WordpressはPHPでできているのでPHPをインストールします。さらに、NginxでPHPを動かすにはPHP-FPMが必要なのでインストールします。
PHP-FPMとは、PHPとNginxを繋ぐFastCGIと呼ばれるものです。CGIとは異なり、処理結果をキャッシュしておくことで高速処理が可能になっています。
PHPとNginxは内部的にTCPまたはソケットで通信します。後述のNginxの設定で通信方法などの設定を行っています。

インストール

PHP/PHP-FRMをインストールするにはremiというリポジトリをインストールする必要があります。さらに、remiをインストールするにはepelというリポジトリをインストールする必要があります。
ですので、以下の順番でインストールしていきます。

  1. epelリポジトリのインストール
  2. remiリポジトリのインストール
  3. PHP/PHP-FPMのインストール

epelリポジトリ

以下のコマンドでインストールします。

# yum -y install epel-release

次に、epelの設定ファイルを開き、各項目のenabled=1enabled=0に変更します。これは–enablerepoを指定しなければepelリポジトリを使用できなくする設定です。

# vi /etc/yum.repos.d/epel.repo
[epel]
...
enabled=0
...
[epel-debuginfo]
...
enabled=0
...
[epel-source]
...
enabled=0
...

remiリポジトリ

以下のコマンドでインストールします。

# rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

PHP/PHP-FPM

以下のコマンドでインストールします。PHP/PHP-FPM以外にもいろいろとインストールします。

# yum install --enablerepo=epel,remi-php72 php php-mbstring php-pear php-fpm php-mcrypt php-mysql

PHP-FPMの設定

PHP-FPMの設定をNginx向けに変更します。

# cd /etc/php-fpm.d/
# cp -p www.conf www.conf.org
# vi www.conf

apacheとなっているところをnginxに変更します。

...
user = nginx
...
group = nginx
...

PHP-FPMの起動

PHP-FPMを起動します。502 Bad Gatewayが表示されるほとんどの場合、PHP-FPMが起動していないことが原因です。

# systemctl start php-fpm

PHP-FPMの自動起動設定

サーバー起動時にPHP-FPMが自動起動するよう設定します。

# systemctl enable php-fpm

Wordpress

Wordpressのインストール・初期設定を行います。

インストール

まずドキュメントルートとなるディレクトリを作成します。

# cd /var/www
# mkdir example

以下のコマンドを実行してWordpressをダウンロードします。

# cd example
# curl -O https://ja.wordpress.org/latest-ja.tar.gz

ダウンロードした圧縮ファイルを解凍し、所有者を変更します。

# tar xzfv latest-ja.tar.gz
# chown -R nginx:nginx wordpress

データベース作成

Wordpress用のデータベースを作成します。なお、データベースは既にMySQLがインストールされており、初期設定や日本語化が済んでいることとします。

# mysql -uroot -p
...

mysql> CREATE DATABASE <DB名>;

作成したDBのユーザー権限を作成します。

mysql> GRANT ALL PRIVILEGES ON <DB名>.* TO <ユーザー名>@localhost IDENTIFIED BY <パスワード>;

設定

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

# cd wordpress
# cp -p wp-config-sample.php wp-config.php
# vi wp-config.php
...
// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', <DB名>);

/** MySQL データベースのユーザー名 */
define('DB_USER', <ユーザー名>);

/** MySQL データベースのパスワード */
define('DB_PASSWORD', <パスワード>);
...

「認証用ユニークキー」は既存の設定は全削除し、このリンクで生成されたユニークキーをそのまま貼り付けます。

Nginxの設定

Nginxの設定ディレクトリに移動し、Wordpress用の設定ファイルを作成します。

# cd /etc/nginx/conf.d
# touch wp.conf
# ls -l
total 8
-rw-r--r-- 1 root root 1391 Dec  9 12:28 app.conf # Railsアプリの設定
-rw-r--r-- 1 root root  434 Dec 10 13:15 wp.conf  # Wordpressの設定

以下のように設定します。ご自分の環境に合わせて適宜修正してください。

server {
  listen 80;
  server_name www.example.com;
  root /var/www/example/wordpress;
  index index.php;
  charset utf-8;
  try_files $uri $uri/ /index.php?q=$uri&$args;
  location ~* /wp-config.php {
    deny all;
  }
  # PHP-FPMの設定
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    include fastcgi_params;
  }
}

PHP-FPMの設定は、PHPとNginxの通信方法(今回はTCP)などを指定しています。

動作確認

ウェブブラウザからhttp://example.com/wp-admin/install.phpにアクセスしてみましょう。

このような画面が表示されたら完了です。

関連記事

WebサーバーのVirtual Host機能とは?Nginxで試せるサンプルコード付きで解説【ドメイン取得不要】
# はじめに ひとつのWebサーバーで複数のWebアプリが動かせたら便利ですよね。 今回はひとつのWebサーバーで異なるドメインのWebアプリを動かすVirtual Host機能について解説します。インストール済みのNginxがすでに構築済みで [...]
2019年12月9日 16:27
【完全無料でSSL化】RailsアプリをNginxで動かす!Nginxのインストール方法から最低限しておきたい設定まで
RailsアプリをNginxで動かすために、Nginxをサーバーに導入する方法と最低限これだけはしておきたいという設定をまとめます。 • ローカル環境:macOS Catalina • サーバー環境:CentOS 7.7 Nginxインストール [...]
2019年12月5日 11:06
「HTTP (TCP/80)/HTTPS (TCP/443)」「サブドメイン(www)あり/なし」の違いによるアクセスを一本化
ウェブサイトのURLは「HTTP (TCP/80)/HTTPS (TCP/443)」「サブドメイン(www)のあり/なし」を組み合わせた4パターンが考えられます。 当ポートフォリオサイトの場合、以下の4つのURLでアクセスされる可能性があるというこ [...]
2019年12月2日 23:37
SSL通信時にセッションを暗号化する方法
以前、「Let's Encryptを使用したWebサーバーのSSL化」という記事を書きました。 実はこの設定だけでは不十分だったので、今回はその続きを書きます。 セッションが保存されない このポートフォリオサイトでは管理者のみがログインできる機能 [...]
2019年10月24日 17:12