CentOS Stream 8 + Nginx + PHP + MariaDB + Postfixの環境を構築(2021年版)
新規VPSを借りて設定したときの覚書。
環境: さくらVPS、CentOS Stream 8
サーバー作成直後の初期設定は下記記事を参考に。
今回は同じ秘密鍵を使うのでインスタンス作成してすぐSSHログインできる。
目次
- 初期設定
- nginxのインストール
- PHPのインストール
- MariaDBをインストール
- phpMyAdminをインストール
- SSLの設定
- Postfix + DKIM(送信ドメイン認証)をインストール
- cron設定
- ネットワーク回線速度とベンチマーク測定
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 = wwwlisten = /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プランも記録しておく。