CentOS8.1でWordPressを構築 (nginx + MariaDB + php-fpm)

2020年5月6日

環境

仮想マシン:CentOS Linux release 8.1.1911 (Core)

最小化パッケージ

固定IP(プライベートアドレス)

要件

CentOS8で最低限必要と思われるパッケージをインストール

WordPressをインストール・実行の要件

要件

CentOS8 +  NGINX で構成するので最低限必要と思われるパッケージをインストール
「nginx」「mariadb」「mariadb-server」「php-fpm」
  • WebServer:nginx.x86_64
  • DB:mariadb.x86_64 mariadb-server.x86_64
  • FastCGI:php-fpm.x86_64
# dnf install nginx.x86_64 mariadb.x86_64 mariadb-server.x86_64 php-fpm.x86_64
 CAUTION

結局「nginx」「mariadb」「mariadb-server」「php-fpm」+依存関係でインストールされるものではWordPressの実行には不足がありましたので後述するパッケージを追加しています。

サービスを起動してみる。

「nginx」「mariadb」「mariadb-server」「php-fpm」をそれぞれ起動サービスとして登録しかつ即時実行する。

「nginx」の起動

# systemctl --now enable nginx

「php-fpm」の起動

# systemctl --now enable php-fpm

「mariadb」の起動

# systemctl --now enable mariadb

Firewalld(ポート着信許可設定)

# firewall-cmd --permanent --add-service=http

# firewall-cmd --permanent --add-service=https

# firewall-cmd --reload

# firewall-cmd --list-all

これで自サーバのIPアドレスでNGINXでアクセスすると下記のような画面が表示されます。

WordPressのダウンロードと展開

WordPressを展開するディレクトリに移動します。

# cd /var/www/

WordPressの最新版をダウンロードします。

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

ダウンロードしたアーカイブを展開します

# tar zxf latest-ja.tar.gz

展開したディレクトリと配下のファイルのアクセス権を変更します。

# chown -R nginx. wordpress/

PHP-FPMの設定

ファイル編集

# vi /etc/php-fpm.d/www.conf

「www.conf」ファイルはインストール時に展開されているデフォルトのモノを使います。
最低限の変更内容はプロセスのユーザとSocketのファイルPATHで赤字で記載の箇所です。使っていくうちにいろいろ調整することもあります。

(前半部抜粋)
; 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 = apache                                  ##←ユーザをnginxに変更します。
; RPM: Keep a group allowed to write in log dir.
group = apache                                 ##←グループをnginxに変更します。

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /run/php-fpm/www.sock               ##←/etc/nginx/conf.d/wordpress.confの内容に合わせます。
・
・<中略>
・

nginxの設定

設定内容はNGINXの「要約された基本セットアップ」の項目に基づいて設定します。

ファイル編集

# vi /etc/nginx/conf.d/wordpress.conf

変更内容は赤字で記載

~]# vi /etc/nginx/conf.d/wordpress.conf
# Upstream to abstract backend connection(s) for php
upstream php {
        server unix:/tmp/php-cgi.socket;     ##←/etc/php-fpm.d/www.confに記述したpathと合わせないといけません。
        server 127.0.0.1:9000;
}

server {
        ## Your website name goes here.
        server_name 192.168.0.150;      ##←後で設定しますので(仮)で埋めておきます
        ## Your only path reference.
        root /var/www/wordpress;             ##←WordPressを展開したディレクトリを指定します
        ## This should be in your http block and if it is, it's not needed here.
        index index.php;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location / {
                # This is cool because no php is touched for static content.
                # include the "?$args" part so non-default permalinks doesn't break when using query string
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass php;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

MariaDBの初期設定

「mysql_secure_installation」ツールを実行します。

ツールを実行して各設定項目で選択肢を選択することで初期設定を実行します。

# mysql_secure_installation

~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]
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]
 ... 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]
 ... 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]
 - 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]
 ... 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の文字コード変更

# vi /etc/my.cnf.d/mariadb-server.cnf

ここで変更するのは文字コードのみです。

ファイルの編集後サービスを再起動します。

# systemctl restart mariadb

ファイル内容(赤字箇所のみ変更)

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld/mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
character-set-server = utf8

#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.3 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.3]

# systemctl restart mariadb

 

 CAUTION

ここでインストールしたWordPressにアクセスすると

「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」

と表示されます。

あれ?パッケージが足りない?

「php-mysqlnd.x86_64」をインストールしてみます。

# dnf install php-mysqlnd.x86_64

 CAUTION

サイトに重大なエラーがありました。WordPress でのデバッグをさらに詳しく見る。

まだ、アクセスできない!!

原因を特定するためログを参照します。

# view /var/log/nginx/error.log

2020/05/06 02:42:47 [error] 5109#0: *12 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function json_decode() in /var/www/wordpress/wp-includes/blocks/shortcode.php:25
Stack trace:
#0 /var/www/wordpress/wp-includes/class-wp-hook.php(287): register_block_core_shortcode('')
#1 /var/www/wordpress/wp-includes/class-wp-hook.php(311): WP_Hook->apply_filters(NULL, Array)
#2 /var/www/wordpress/wp-includes/plugin.php(478): WP_Hook->do_action(Array)
#3 /var/www/wordpress/wp-settings.php(540): do_action('init')
#4 /var/www/wordpress/wp-admin/setup-config.php(33): require('/var/www/wordpr...')
#5 {main}
  thrown in /var/www/wordpress/wp-includes/blocks/shortcode.php on line 25" while reading response header from upstream, client: 192.168.0.5, server: 192.168.0.150, request: "GET /wp-admin/setup-config.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock:", host: "192.168.0.150"

# dnf install php-json

アクセスできました。

DBの設定が済んでいないので[さあ、始めましょう!]はしません。

WordPressから利用するためのMariaDBの設定

 POINT

MariaDB(mysql)にログインするときのパスワードは「-p」の後ろにスペースなどを入れずに「mysql -u root -proootpassword」と入力します。

使い慣れた人には信じられないのでしょうが「mysqlにログインできない。」という申告のほとんどが「-p」の後にスペースを入れてしまっているものです。

 

wordpress用データベース作成

~]# mysql -u root -p■■■■■■■■■■
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.3.17-MariaDB MariaDB Server

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

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

MariaDB [(none)]> CREATE DATABASE wordpress;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]>

データベース管理ユーザ作成

MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress.* TO "wpadmin"@"localhost" IDENTIFIED BY "zxcvbnm,1";
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]>exit
Bye
~]#

WordPressのインストール

wp-config設定

ブラウザからWorPressにアクセスして設定

 

 

 

 

WordPressのインストールが完了しました。

サイトヘルスステータスの確認

対処① SElinuxの一時停止

まだ「1つ以上の必須モジュールが存在しません」と表示されます。

 CAUTION

<詳細情報>

1件の致命的な問題
1つ以上の必須モジュールが存在しません[パフォーマンス]
PHP モジュールはサイトの稼働に必要なほとんどのタスクをサーバー上で実行します。変更はサーバー管理者が実施する必要があります。
WordPress ホスティングチームでは、こうした推奨されていたり必須とされていたりするモジュールのリストをチームのハンドブック (新しいタブで開く)でメンテナンスしています。

  • 警告 オプションのモジュール dom がインストールされていないか、無効化されています。
  • 警告 オプションのモジュール mbstring がインストールされていないか、無効化されています。
  • 警告 オプションのモジュール imagick がインストールされていないか、無効化されています。
  • 警告 オプションのモジュール zip がインストールされていないか、無効化されています。
  • エラー 必須モジュール gd がインストールされていないか、無効化されています。

 CAUTION

「エラー 必須モジュール gd がインストールされていないか、無効化されています。」が解消せず残りました。

1件の致命的な問題

1つ以上の必須モジュールが存在しません

関連のありそうなPHPモジュールをテキトーにインストールします。

# dnf install php-gd.x86_64 php-xml.x86_64 php-mbstring.x86_64 php-pecl-zip.x86_64

「致命的な問題」については解消されました。

次は「4件のおすすめの改善」へ進みます。

CentOS 8 でImageMagickとPHP Imagickをインストールする方法