CentOS 8.2 + Nginx 1.18 + MariaDB 10.3 + PHP 7.4 で WordPress を動かす

カテゴリー: 手順書,

インストールメモです。

CentOS 8.2

CentOSバージョン確認

cat /etc/redhat-release
arch

結果

CentOS Linux release 8.2.2004 (Core)
x86_64

パーティション確認

df -hT

結果

Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  7.8G     0  7.8G   0% /dev
tmpfs          tmpfs     7.8G     0  7.8G   0% /dev/shm
tmpfs          tmpfs     7.8G   17M  7.8G   1% /run
tmpfs          tmpfs     7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/vda1      ext4      315G  2.0G  297G   1% /
tmpfs          tmpfs     1.6G     0  1.6G   0% /run/user/0

日本語環境に

localectl set-locale LANG=ja_JP.UTF-8
source /etc/locale.conf
echo $LANG
install -y langpacks-ja

サーバのタイムゾーンを変更

timedatectl status
timedatectl set-timezone Asia/Tokyo

アップデート

dnf check-update
dnf update
dnf clean all

自動更新設定。「apply_updates = yes」にする

dnf install dnf-automatic
vi /etc/dnf/automatic.conf
systemctl enable dnf-automatic.timer
systemctl start dnf-automatic.timer
systemctl status dnf-automatic.timer

すべて反映

dnf clean all
reboot

ポート開放

Firewall。最初に ssh:10022 http:80 https:443 の3つを開けておく。SSHのポートだけは20番から10022番へ変更する。

firewall-cmd --add-port=10022/tcp --zone=public
firewall-cmd --add-port=80/tcp --zone=public
firewall-cmd --add-port=443/tcp --zone=public

ポート開放状況を確認

firewall-cmd --list-all

成功しているなら恒久的に設定する

firewall-cmd --add-port=10022/tcp --zone=public --permanent
firewall-cmd --add-port=80/tcp --zone=public --permanent
firewall-cmd --add-port=443/tcp --zone=public --permanent

再起動、最終確認の設定を確認

firewall-cmd --list-all
systemctl restart firewalld
systemctl enable firewalld
systemctl status firewalld
firewall-cmd --list-all

SELinux

SELinux モード確認。
※「Current mode」の値
※ SELinux が有効時のみモードを変更できるっぽい

sestatus
  • enforcing ⇒ 有効
  • permissive ⇒ ログのみ記録
  • disabled ⇒ 無効

※ SElinux を一時的に無効にするなら

setenforce 0

※ SElinux を有効にするなら

setenforce 1

SELinux ポート開放

dnf install -y policycoreutils-python-utils
semanage port -a -t ssh_port_t -p tcp 10022
systemctl restart sshd
semanage port --list | grep ssh

WEBサービス経由でDBアクセスを許可
※ httpd_can_network_connect がoffだと、管理ページの新規プラグイン追加画面でエラーが出る。httpd_can_network_connect_db は0でも不具合ないかもしれない。

setsebool -P httpd_can_network_connect_db 1
setsebool -P httpd_can_network_connect=on
getsebool httpd_can_network_connect_db
getsebool httpd_can_network_connect

FTP経由でアクセスしたい場合は許可にするらしい。SFTPなら不要

setsebool -P allow_ftpd_full_access 1
getsebool allow_ftpd_full_access
semanage port --list | grep ftp

タイプ変更、ファイル書き込み可

semanage fcontext -a -t httpd_sys_rw_content_t "/usr/share/nginx/example.com/public_html(/.*)?"
restorecon -R /usr/share/nginx/example.com/public_html/

ポート開放を確認

vi /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="cockpit"/>
  <service name="https"/>
  <service name="http"/>
  <service name="ssh"/>
  <port port="10022" protocol="tcp"/>
  <port port="80" protocol="tcp"/>
  <port port="443" protocol="tcp"/>
</zone>

ポート変更 sshd 10022 を"追加"

vi /etc/ssh/sshd_config
Port 22
Port 10022

再起動後に 10022 でSSH接続テスト、成功を確認してから 22 を削除する

systemctl restart sshd
;Port 22
Port 10022

なお、SELinux のポリシーから22を削除しようとすると、できませんになった。

semanage port --list | grep ssh
semanage port --delete --type ssh_port_t --proto tcp 22
ValueError: ポート tcp/22 はポリシー内で定義されているため、削除できません

Nginx 1.18

AppStreamではなく、Nginx 公式のリポジトリを参照するようにする

vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

インストールパッケージ角煮

dnf --disablerepo=AppStream info nginx

「Repository : nginx」になっているならok、インストール

dnf --disablerepo=AppStream -y install nginx
systemctl start nginx
systemctl enable nginx
systemctl status nginx

WEBサーバ設定(1)デフォルト。
初期設定は残しておきたいので変更せず

vi /etc/nginx/nginx.conf

WEBサーバ設定(2)ドメインごとに設定を分けておく

vi /etc/nginx/conf.d/example.com.conf

# Nginx設定 参考URL
# https://scratchpad.jp/nginx-cache-controller-1/
# https://scratchpad.jp/wordpress-on-nginx-settings/

server {

    # wwwなしへリダイレクト
    listen 80;
    listen  [::]:80;
    server_name www.example.com;
    rewrite ^/(.*) http://example.com/$1 permanent;

}

server {

    listen  80;
    listen  [::]:80;
    server_name  example.com;
    root  /usr/share/nginx/example.com/public_html;

    # 他サイトからのインラインフレーム禁止
    add_header X-Frame-Options SAMEORIGIN;

    # WP での運用予定なので。
    charset  utf-8;

    # アクセスログ
    access_log  /var/log/nginx/example.com-access.log  main;
    error_log  /var/log/nginx/example.com-error.log;

    # is_mobile用
    set $is_mobile '';

    # キャッシュを作成する場合のスマートフォンの判定処理
    # theme や plugin で is_mobile() を作って合わせる
    if ($http_user_agent ~* '(iPhone|iPod|Android.*Mobile|Windows.*Phone|mobile.*firefox|dream|CUPCAKE|blackberry9500|blackberry9530|blackberry9520|blackberry9550|blackberry9800|webOS|incognito|webmate|Silk|Kindle|NetFront|PSP|Opera Mini|Opera Mobi|Googlebot-Mobile)') {
        set $is_mobile '@mobile';
    }

    # proxy_cacheを管理するためのキーを設定
    set $proxy_cache_key " $scheme$proxy_host$request_uri";

    # キャッシュ除外フラグ
    set $do_not_cache 0;

    # GET メソッド以外はキャッシュを作成しない
    if ($request_method != GET) {
        set $do_not_cache 1;
    }

    # 管理者クッキーがあるならキャッシュを利用しない
    if ($http_cookie ~ ^.*(wordpress_logged_in|wordpress_test_cookie|wordpress_no_cache|wp-postpass).*$) {
        set $do_not_cache 1;
    }

    # キャッシュ除外領域
    if ($request_uri ~* "/wp-admin/|/wp-includes/|/no-cache/|/_vote/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
        set $do_not_cache 1;
    }

    # インデックス設定
    location / {
        try_files $uri $uri/ @wordpress;
        index  index.html index.htm index.php;
        if ($uri ~* \.(?:css|js|ico|png|jpe?g|gif)$) {
            access_log off;
        }
    }

    # php-fpm 設定
    location ~ \.php$ {
        try_files      $uri @wordpress;
        fastcgi_index  index.php;
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_script_name;
        include        fastcgi_params;

        add_header            F-Cache $upstream_cache_status;
        fastcgi_cache         MYZONE;
        fastcgi_no_cache      $do_not_cache;
        fastcgi_cache_bypass  $do_not_cache;
        fastcgi_pass_header   "X-Accel-Redirect";
        fastcgi_pass_header   "X-Accel-Expires";
        fastcgi_cache_key     "$scheme://$host$request_uri$is_mobile";
        fastcgi_cache_valid   200 2h;
        fastcgi_cache_valid   301 302 1h;
        fastcgi_cache_valid   404 1m;
        fastcgi_cache_valid   500 1s;
        fastcgi_cache_valid   any 5m;
    }

    location @wordpress {
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass  unix:/run/php-fpm/www.sock;
        fastcgi_param SCRIPT_FILENAME  /usr/share/nginx/example.com/public_html/index.php;
        include       fastcgi_params;

        add_header            F-Cache $upstream_cache_status;
        fastcgi_cache         MYZONE;
        fastcgi_no_cache      $do_not_cache;
        fastcgi_cache_bypass  $do_not_cache;
        fastcgi_pass_header   "X-Accel-Redirect";
        fastcgi_pass_header   "X-Accel-Expires";
        fastcgi_cache_key     "$scheme://$host$request_uri$is_mobile";
        fastcgi_cache_valid   200 2h;
        fastcgi_cache_valid   301 302 1h;
        fastcgi_cache_valid   404 1m;
        fastcgi_cache_valid   500 1s;
        fastcgi_cache_valid   any 5m;
    }


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

    # Nginx のバージョンや使用している OS を隠蔽
    server_tokens off;

    # 誤って .htaccess が混入した場合を考え、読み取らせない
    location ~ /\.ht {
        deny  all;
    }

}

ログローテートの設定確認

vi /etc/logrotate.d/nginx

結果。ローテートするファイルはパーミッション640の nginx:adm で作成されるみたい。拡張子が「.log」のもののみが対象になっていた

/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

ログディレクトリの所有者をnginxへ変更

chown -R nginx: /var/log/nginx
chown -R nginx:adm /var/log/nginx/example.com-access.log
chown -R nginx:adm /var/log/nginx/example.com-error.log

ログローテートをデバッグモードで確認。ローテートの対象となっているか、また実行プロセスと結果シミュレートがわかる。詳細

logrotate -d /etc/logrotate.conf

設定ファイルに構文エラーなどないかチェックし、反映

nginx -t
systemctl restart nginx

WEBサーバ動作確認。PATHを通してファイル作成、ブラウザで確認。PHPファイルはまだ動かないが、PHPをインストール後に確認する

mkdir /usr/share/nginx/example.com
mkdir /usr/share/nginx/example.com/public_html
echo testhtml >> /usr/share/nginx/example.com/public_html/index.html
echo testphp >> /usr/share/nginx/example.com/public_html/test.php

サイトファイルディレクトリの所有者をnginxへ変更

chown -R nginx: /usr/share/nginx/example.com/public_html

これだけは先にやっておこう

worker_processes  auto;

PHP 7.4

dnf確認

dnf info php

結果

Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:08:34 ago on Sat Jul 11 08:00:01 2020.
Available Packages
Name         : php
Version      : 7.2.24
Release      : 1.module_el8.2.0+313+b04d0a66
Architecture : x86_64
Size         : 1.5 M
Source       : php-7.2.24-1.module_el8.2.0+313+b04d0a66.src.rpm
Repository   : AppStream
Summary      : PHP scripting language for creating dynamic web sites
URL          : http://www.php.net/
License      : PHP and Zend and BSD and MIT and ASL 1.0
Description  :

サードパーティ製リポジトリ3つ追加

  • epel-release
  • elrepo
  • remi
dnf install -y epel-release

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
dnf install -y https://www.elrepo.org/elrepo-release-8.0-2.el8.elrepo.noarch.rpm

dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm

PowerToolsを有効化。「enabled=1」にする

vi /etc/yum.repos.d/CentOS-PowerTools.repo

一覧確認

dnf repolist all

7.2ではなく7.4にしたいのでepel利用、インストール。
remiリポジトリには「remi」と「remi-safe」の2種類があった

dnf module list php
dnf info php74 --enablerepo=remi
dnf module install php:remi-7.4

dnf install php-fpm php-mysqlnd php-json php-xml php-gd php-mbstring php-pecl-zip php-pecl-imagick
dnf clean all

php-fpm でのユーザとグループは初期で apache なので nginx へ変更。
※ 「listen = /run/php-fpm/www.sock」のパスを目視しておく

vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
~~~
listen = /run/php-fpm/www.sock
~~~
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

権限確認。nginx:nginxに。

ls -l /run/php-fpm/www.sock
chown -R nginx: /run/php-fpm/www.sock

php.ini 設定

vi /etc/php.ini
memory_limit = 256M
~~~
post_max_size = 10M
~~~
upload_max_filesize = 10M
~~~
date.timezone = Asia/Tokyo
~~~
mbstring.language = Japanese

再起動で反映

systemctl restart php-fpm
systemctl enable php-fpm
systemctl status php-fpm

MariaDB 10.3

アーキテクチャを確認

arch

今回の結果

x86_64

MariaDBの何かしらがインストールされていないか確認

dnf list installed | grep maria

アンインストールする場合は

dnf remove mariadb

リポジトリ確認

dnf info mariadb-server

今回はAppStreamで10.3.17をインストール。10.4系になるとgalera-4とその他のインストールが必須になるので今回は避けた。

dnf install mariadb-server
dnf clean all

AppStreamを無視し、バージョン指定でインストールする場合は下記のステップを踏む。

=====ここから=====

GPGキー取得

rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

リポジトリ新規作成

※ 以下のURLで最新版を確認してください
https://downloads.mariadb.org/mariadb/repositories/#mirror=biznetgio
http://yum.mariadb.org/

vi /etc/yum.repos.d/MariaDB.repo

以下は例。今日時点で最新のリポジトリ

# MariaDB 10.5 CentOS repository list - created 2020-07-08 19:31 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos8-amd64
module_hotfixes=1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
dnf --disablerepo=AppStream info MariaDB-server
dnf --disablerepo=AppStream install MariaDB-server
dnf clean all

=====ここまで=====

文字コード変更。デフォルトが latin1 なので utf8 に

vi /etc/my.cnf.d/mariadb-server.cnf
[mariadb]
character-set-server=utf8
systemctl start mariadb
systemctl enable mariadb
systemctl status mariadb

バージョン確認

rpm -qa | grep -i mariadb

初期設定開始

mysql_secure_installation
  1. Enter current password for root (enter for none): ⇒ エンター
  2. Set root password? [Y/n] ⇒ イエス
  3. パスワード設定(2度目の確認あり)例⇒WPpassword1234
  4. 以降はすべて空エンター
    Remove anonymous users? [Y/n]
    Disallow root login remotely? [Y/n]
    Remove test database and access to it? [Y/n]
    Reload privilege tables now? [Y/n]

mysqlへログイン

mysql -u root -pWPpassword1234

WordPress用のデータベースを作成、権限ユーザーの作成
※ all privileges ・・・ GRANT(権限の付与)権限以外の 権限を全て付与

MariaDB [(none)]> create database if not exists wordpress default character set utf8mb4;
MariaDB [(none)]> grant all privileges on wordpress.* to wordpress@127.0.0.1 identified by 'WPpassword1234';
MariaDB [(none)]> show databases;
MariaDB [(none)]> select Host, User, Password from mysql.user;
MariaDB [(none)]> exit
Bye

これで下記の準備ができました。

  • HOST : 127.0.0.1
  • DB_NAME : wordpress
  • DB_USER : wordpress
  • DB_PASSWORD : WPpassword1234

WordPress

最新パッケージをゲット

cd /usr/share/nginx/example.com/public_html
wget http://ja.wordpress.org/latest-ja.zip
unzip latest-ja.zip
mv wordpress wp
rm latest-ja.zip
cd wp
cp wp-config-sample.php wp-config.php
chown -R nginx: /usr/share/nginx/example.com/public_html

wp-config.php に情報を記入しアップロード、WordPressがあるディレクトリへブラウザでアクセス、インストールを済ませて動作確認 これでおしまい。

追記

WPのバックグラウンド通信関連が上手く動かなかったので暫定対処した例

あと画像周りのプラグインに必要だったのでちょこっと


関連記事

関連記事はまだありません

手順書」のBookmark
「手順書」記事一覧