CentOS Stream 8 + Nginx + PHP + MariaDB + Postfixの環境を構築(2021年版)

新規VPSを借りて設定したときの覚書。

環境: さくらVPS、CentOS Stream 8

サーバー作成直後の初期設定は下記記事を参考に。
今回は同じ秘密鍵を使うのでインスタンス作成してすぐSSHログインできる。


目次

  1. 初期設定
  2. nginxのインストール
  3. PHPのインストール
  4. MariaDBをインストール
  5. phpMyAdminをインストール
  6. SSLの設定
  7. Postfix + DKIM(送信ドメイン認証)をインストール
  8. cron設定
  9. ネットワーク回線速度とベンチマーク測定


1.初期設定

SSHログインしたらまずはアップデート。
# dnf update

ホスト名変更
# hostnamectl set-hostname server02.webrec.co.jp
# hostnamectl status

タイムゾーン確認
# timedatectl status

SELinux確認
# getenforce

これで再起動
# reboot

さくらVPSの管理コンソールでパケットフィルタからsshの他にWeb(http, https)を許可。
DNS(管理用の名前解決)の設定もしておく。

EPELリポジトリ追加
# dnf install epel-release
# dnf update

certbotをインストール。
python3もインストールされる。
# dnf install certbot

pipを最新にする
# pip3 install --upgrade pip

pipモジュール一覧、アップデート可能な一覧
# pip list
# pip list -o

過去の経験からcertbot周りを最新にしておく。
# pip install -U certbot requests setuptools urllib3 

Gitの設定
# git config --global user.name "Hoge"
# git config --global user.email "hoge@company.co.jp"

GitLabの秘密鍵を登録しておく(他のサーバーからコピペ)。
# vi .ssh/id_rsa.gitlab.com
# vi .ssh/config 
# chmod 600 .ssh/id_rsa.gitlab.com


2.nginxのインストール

nginxのモジュール一覧
# dnf module list nginx

EPELのmainlineのバージョン確認
# dnf module info nginx:mainline

どのバージョンをインストールするか迷う。
偶数が安定版(stable)、奇数が開発版(mainline)。
nginxは前の安定版のアップデートを行わないので、毎年4月のStableアップデートについていく必要がある。

なので公式で配布しているStableバージョンのリポジトリを登録する(公式ページ)。
# vi /etc/yum.repos.d/nginx.repo

[nginx-stable]
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

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

インストール
# dnf install nginx

起動、自動起動ON、確認
# systemctl start nginx
# systemctl enable nginx
# systemctl list-unit-files -t service | grep nginx

CPU数の設定がautoになっているか確認
# less /etc/nginx/nginx.conf

GitLabから共通設定をcloneしておく(プライベートリポジトリです)。
# cd /etc/nginx/conf.d/
# git clone git@gitlab.com:dksg-settings/nginx-global.git global

ユーザーグループ「www」を作成。
nginxユーザーをwwwグループに追加。
# groupadd www
# usermod -G www nginx

nginx.confは前の記事を参考に設定する。

worker_rlimit_nofileは下記記事が参考になる。

OSが扱えるファイル数とCPU数の確認
# more /proc/sys/fs/file-max
# less /proc/cpuinfo

file-max /  CPU数 * 0.95 = worker_rlimit_nofileの値
(百の単位は切り捨てて登録することにした)

その他は公式サイトと他の本番サーバーを確認しながら設定する。

修正後、確認して反映させる。
# nginx -t
# systemctl reload nginx


3.PHPのインストール

phpのモジュール一覧
# dnf module list php

php7.4をインストール。
その他のPHPモジュールをインストール。
php-pecl-zipはphpMyAdminでzip圧縮したSQLファイルをインポートするときに使う。
# dnf module install php:7.4
# dnf install php-mysqlnd php-gd php-pecl-zip

起動、自動起動ON、確認
# systemctl start php-fpm
# systemctl enable php-fpm
# systemctl list-unit-files -t service | grep php-fpm
# php --version

実行ユーザーを変更する。ACLはコメントアウト。
# less /etc/php-fpm.d/www.conf

user = nginx
group = www

listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = www
listen.mode = 0660

 ;listen.acl_users = apache,nginx

タイムゾーンを設定する。
# less /etc/php.ini

date.timezone = "Asia/Tokyo"

再起動
# nginx -t
# systemctl reload nginx
# systemctl restart php-fpm

セッションの書き込みディレクトリ権限を変更。
# chown nginx.www -R /var/lib/php/*
※ PHP更新時に毎回変更しないといけない

timezoneが変わっているか確認。
# php -r 'echo date("Y/m/d H:i");'


4.MariaDBをインストール

MariaDBのモジュール一覧
# dnf module list mariadb

MariaDBサーバー10.5をインストール
# dnf module install mariadb:10.5/server

起動、自動起動ON、確認
# systemctl start mariadb
# systemctl enable mariadb
# systemctl list-unit-files -t service | grep mariadb

初期設定スクリプトを実行(10.5からコマンド名が変わった)。
# mariadb-secure-installation

デフォルトの文字コードを「utf8mb4」にする。とりあえずのチューニング設定も。
# less /etc/my.cnf.d/mysql-clients.cnf

[mysql]
default-character-set=utf8mb4

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

[server]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
thread_handling = pool-of-threads
max_connections = 500

# Tuning
key_buffer_size = 128M
sort_buffer_size = 1M
read_rnd_buffer_size = 1M
query_cache_type = 1
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 80M

再起動
# systemctl restart mariadb

確認
# mariadb -u root -p
MariaDB [(none)]> show variables like "chara%";


5.phpMyAdminをインストール

Git cloneすると1GBぐらい消費するのでダウンロードして設置する。
# mkdir /home/httpd
# mkdir /home/httpd/httpdocs
# cd /home/httpd/httpdocs
# curl -O https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-english.tar.gz
# tar -xzvf phpMyAdmin-5.1.1-english.tar.gz
# mv phpMyAdmin-5.1.1-english phpMyAdmin
# rm phpMyAdmin-5.1.1-english.tar.gz

nginxの設定。
まずはローカルの開発サーバーを参考に設定。
あとでSSL対応させる。
# cd /etc/nginx/conf.d/
# vi 01_phpMyAdmin.conf

ブラウザでアクセスして確認。
tmpフォルダを書き込み可にする。
# mkdir /home/httpd/httpdocs/phpMyAdmin/tmp
# chown nginx.www /home/httpd/httpdocs/phpMyAdmin/tmp


6.SSLの設定

前の記事を参考にssl_dhparamを設定する。
鍵ファイルを作る。30分ほど掛かった。
# openssl dhparam -out /etc/ssl/dhparam.pem 4096

この機会にSSL Server Testを行ってSSLの設定全体を見直す。


phpMyAdminをSSL下に置くように設定。前の記事を参考に。
まずはcertbotでSSL証明書取得。
# certbot certonly --webroot -w /home/httpd/httpdocs/phpMyAdmin/ -d pma.server01.hoge.jp

nginx設定。他の本番サーバーを参考に。
# cd /etc/nginx/conf.d/
# less 00_default.conf

IPアドレスで制限しているけど、念のためにBasic認証も設定する。前の記事を参考に。
設定ツールをインストール。
# dnf install httpd-tools

# cd /home/httpd/httpdocs/
# htpasswd -c .htpasswd hoge

nginx設定変更
# less /etc/nginx/conf.d/00_default.conf

    # Basic Authentication
    auth_basic    "Secret Area for server01";
    auth_basic_user_file  "/home/httpd/httpdocs/.htpasswd";

確認して再読み込み
# nginx -t
# systemctl reload nginx

ブラウザで表示して確認。


7.Postfix + DKIM(送信ドメイン認証)をインストール

メール送信するための設定。postfixをインストール。
# dnf install postfix
# less /etc/postfix/main.cf

myhostname = server02.webrec.co.jp
mydomain = webrec.co.jp
myorigin = $mydomain
inet_interfaces = localhost
mydestination = localhost

起動、自動起動、確認
# systemctl start postfix
# systemctl enable postfix
# systemctl list-unit-files -t service | grep postfix

エラー。
さくらVPSではIPv6が無効になっているから。前の記事

せっかくIPv6が使えるVPSなので設定してみた。公式サイトを参考にしながら。
ソフト側もIPv6対応が進んでいるから大丈夫だと思う。
(ちょっと前までは鬼門だった)

# less /etc/sysctl.conf

# Do not use IPv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0

設定ファイルのコメントアウトを解除する。
# less /etc/sysconfig/network

NETWORKING=yes
NETWORKING_IPV6=yes
IPV6_DEFAULTDEV="ens3"
IPV6_DEFAULTGW="fe80::1"

# less /etc/sysconfig/network-scripts/ifcfg-ens3

DEVICE="ens3"
IPADDR="111.222.333.444"
NETMASK="255.255.254.0"
GATEWAY="111.222.333.1"
ONBOOT="yes"
TYPE="Ethernet"
DNS1="111.222.333.3"
DNS2="111.222.333.4"
IPV6INIT="yes"
IPV6_ROUTER="no"
IPV6ADDR="2401:2500:204:1113:153:127:130:239/64"

再起動
# reboot

IPv6情報確認。
VPSの管理コンソールでも確認できる。
# ip addr show ens3

オフィスはIPv6が通ってないので、外部サービスを使ってテストする。

Postfix起動
# systemctl start postfix

今度は無事起動完了。

OpenDKIMのインストールは前の記事とほぼ同じなのでそちらを参照。

mailコマンドをインストールして送信テスト。
# dnf install mailx


8.cron設定

cronサービスが自動起動になっているか確認。
# systemctl list-unit-files -t service | grep cron

cron設定
# cd /etc/cron.d/

certbotと再起動のスケジュールを設定。
他の本番サーバーからコピペする。

バックアップ処理は後日設定する。


9.ネットワーク回線速度とベンチマーク測定

前の記事を参考に回線速度測定ツールをインストール。
# pip install speedtest-cli

測定実行
# speedtest-cli

記録しておく。

次にApache Benchで負荷テスト。
ウェブシステムを導入してから行う。

ローカルの開発サーバーからリクエスト数と同時接続数を増やしながら測定。
他の本番サーバーのベンチマーク測定記録と設定数は合わせる。

リクエスト数50、同時接続数10でベンチマーク実行する場合。
実行している間はtopコマンドでサーバーの状況を見ながら。
# ab -n 50 -c 10 https://hoge.jp/

記録しておく。

CPUコア数とモデル名も記録しておく。
# less /proc/cpuinfo

契約したVPSプランも記録しておく。


【関連記事】