nakayumcの技術ブログ

エンジニア2年目のブログです。

RHEL8でNginx1.18+PHP7.4+MariaDB10.3でWordPressをインストールする

はじめに

WordPressをRHEL8環境下でインストールしたので備忘録として手順をまとめます。

CentOS8が、2021年12月31日にサポートが終了してしまうので、代わりのOSを探していたところ、2月1日から個人開発者には本番環境を含む最大16システムまで無料でRed Hat Enterprise Linuxの利用が認められるようになりました。(個人でも商用でも1人で使用するサーバに限られるようです。)  

インストールした環境

- ホスト: ESXi 6.7
- OS: Red Hat Enterprise Linux 8
- nginx 1.18
- PHP 7.4
- MariaDB 10.3
- WordPress 5.7

今回はRed Hat CDNを使用して [サーバー] で進めました。

各パッケージのインストールと設定

RHEL8ではパッケージ管理に大きな変更がありました。 Red Hatからリリースされるコンテンツは BaseOS と Appstream の二つのリポジトリから配信されるようになり、特に Appstream では、従来のパッケージ形式のソフトウェア管理に加わる形で、新たにモジュールという概念が追加されました。 モジュールとは、小さなリポジトリの集合から構成されるもので、RPM をさらに拡張させた新たなパッケージ管理の仕組みです。yum コマンドの使用感をそのままに新たな概念が導入された結果、dnf コマンドにはパッケージ形式とモジュール形式という二つのインストール形式が共存することになりました。

nginx1.18のインストール

普通に dnf module install でインストールすると1.14のバージョンがインストールされます。 下記のコマンドを叩いてみてください。

dnf module list nginx

この画像を見てみると、Stream列のところの 1.14 に [d][e] となっていますね。これは、インストールされるデフォルト[d]のバージョンが1.14で、それが有効[e]になっていることを示しています。ですので、dnf module install で進めると1.14がインストールされるわけです。

なので、下記のコマンドで1.18のnginxをインストールします。

dnf module install nginx:1.18

nginxの起動&自動起動の有効化

下記のコマンドで起動と自動起動の有効化が同時にすることができます。

systemctl --now enable nginx
firewalld (ポート着信許可設定)

次に、firewall-cmd コマンドで http(80) と https(443) のポートを開けていきます。

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

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

firewall-cmd --reload
success

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: cockpit dhcpv6-client http https ssh <- ここに「http」と「https」が追加されたことを確認
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

次に、正しくポートが空いているか実際に確認します。

サイトにアクセスできるか確認

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

この画面が出れば、正しくポートが開いています。

PHP7.4のインストール

PHPも同様に、dnf module install を使用して、インストールしていきます。

dnf module install php:7.4

あと、WordPressを動かすのに足りないパッケージもインストールします。

dnf install php php-devel php-mysqlnd php-pdo php-gd

PHPのバージョン確認

バージョンが7.4であることを確認します。

# php -v
PHP 7.4.6 (cli) (built: May 12 2020 08:09:15) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
 
# php-fpm -v
PHP 7.4.6 (fpm-fcgi) (built: May 12 2020 08:09:15)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
PHPのバージョン非表示

続いて、PHPバージョンを非表示にしていきますWappalyzerという chrome拡張機能でバージョンが 7.4.6であることが分かってしまいます。このような状態だと、攻撃に有用な情報を取得される可能性がありますので念のため非表示にします。

変更するには /etc/php.ini ファイルを変更します。

vi /etc/php.ini

目安として380行目あたりにあると思われますが、expose_php = On を Off に変更します。

;;;;;;;;;;;;;;;;;
; Miscellaneous ;
;;;;;;;;;;;;;;;;;

; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = On <- Off に変更

/etc/php-fpm.d/www.conf のユーザ変更
vi /etc/php-fpm.d/www.conf

/etc/php-fpm.d/www.confをスーパーユーザーのテキストエディタで開き、下記のように2つの箇所を変更してください。

変更前
user = apache
group = apacheapache の部分をnginxに変更

変更後
user = nginx
group = nginx
変更前
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

↑コメントを外して、nobody を nginx に変更

変更後
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

編集が終わったら保存してエディタを終了します。

また、このままだとセッションを保存しておくディレクトリの所有者が apache になっていて、ユーザーのログインなどが出来なくなってしまうのでchownコマンドで変更します。

chown -R nginx:nginx /var/lib/php/session

これができたら起動します。

systemctl enable --now php-fpm

MariaDB10.3 のインストール

MariaDBは dnf install を使用してインストールしていきます。

dnf install mariadb-server mariadb

起動&ユーザー作成

まずMySQLを起動と自動起動を有効化します。

systemctl enable --now mariadb

そしたら、mysql_secure_installationコマンドで、rootパスワード設定と初期設定をしていきます。

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):何も打たずにEnter
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] 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.

# 匿名ユーザを削除するか? [y]を選択
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.

# rootユーザのリモートログインをブロックするか? [y]を選択
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.

# テストDBを削除するか? [y]を選択
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.

# 権限テーブルをリロードするか? [y]を選択
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!
データベース作成

MySQL内でWordPress用のDB、ユーザ作成をします。
ユーザへ権限付与 MySQL 8.0から GRANT文でのユーザ作成ができないので、CREATE文でユーザ作成をして、権限付与しています。 また、MySQL 8.0からユーザ作成はcaching_sha2_password形式がデフォルトの設定になっていますが、PHP7.2以降は対応していないので従来のmysql_native_password形式指定をしています。

これらのコマンドでデータベースとユーザーを作成してください。パスワードに関しては、rootに設定したものとは別のものにすることをお勧めします。

mysql -uroot -ppassword <-オプションと文字列をくっつける

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.27-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 wp_database default character set utf8;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> grant all on wp_database.* to wp_admin@localhost identified by 'wp_admin用のパスワード';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye

Wordpressのインストール

wgetコマンドで WordPress をダウンロード、/var/www/html/wordperssに展開しました。さらにchownコマンドで 所有権をnginxに設定します。

cd /tmp/
wget https://ja.wordpress.org/latest-ja.tar.gz
tar zvxf latest-ja.tar.gz -C /var/www/html/
chown -R nginx:nginx /var/www/html/wordpress
ll /var/www/html/wordpress/

nginxの設定

以下の内容に書き換えてください。心配な方は必要に応じて元の記述内容をコメントアウトしてください。

vi /etc/nginx/conf.d/wordpress.confuser nginx;
worker_processes auto;
error_log /var/log/nginx/main_error.log warn;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 2048;
    multi_accept on;
    use epoll;
}

http {
    server_tokens off;  #これをどこかに追加

    server {
        listen 80;
        server_name _;

        location / {
                return 301 https://example.com$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name example.com;

        access_log  /var/log/nginx/ssl_access.log  main;
        error_log  /var/log/nginx/ssl_error.log warn;

        index index.php index.html;
        root /var/www/html/wordpress;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

        location ~* /wp-config.php {
                deny all;
        }

        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_pass   unix:/run/php-fpm/www.sock;
        }
    }
}

example.com となっている場所はすべてご自身のドメインに置き換えてください。編集が終わったら nginxを再起動してください。

systemctl restart nginx

SELinuxの設定

SELinuxが有効化された状態だと、PHPでのファイル書き込みとインターネット通信が制限されてしまうので、テーマやプラグイン、アップデートのインストールができません。なので、これらを許可する必要があるので、下記のコマンドを叩きます。

setsebool -P httpd_can_network_connect 1
chcon -R -h -t httpd_sys_script_rw_t /var/www/html/wordpress

WordPress のセットアップ

ブラウザからサーバーIPの /wp-admin/install.php にアクセスしてください。例えば、ドメインexample.com だとURLは https://example.com/wp-admin/install.php です。

アクセスすると、このような画面が表示されます。

次に進んで、データベースの設定の画面では以下のようにMariaDB で設定したデーターベース名・ユーザー名・パスワードを指定します。
ここでエラーが出る方は、上記の設定をもう一度見直してみてください。

この記事の通りにしているならばデータベース名は wp_database、ユーザー名は wp_admin 、パスワードはMariaDBのところで wp_admin用パスワードを設定したと思うので、そのパスワードを入力してください。

正しくできれば、「インストールを実行」という画面が表示されます。続いてボタンをクリックしてください。

あとはサイトのタイトルと管理者のユーザーを作って「Wordpressをインストール」押せば設定は完了です。

成功したら「ログイン」を押すとログイン画面に移動するので、先ほど作った管理者用のユーザーでログインしてください。

これでインストール完了です。

終わりに

以上でインストール完了ですが、現状ではWordpressを動かすのに必要最低限の設定しか行っていません。ので今後nginx の設定も書いていきたいです。