CentOS 8.0 (1905) LAMPサーバインストールメモ【Apache2.4+MySQL8.0+PHP7.2】

Linux
Linux
スポンサーリンク

2019年9月24日 CentOS 8.0(1905)がリリース されました。CentOS7.7のリリースを優先させたこともあり、5月のRHEL8.0のリリースから約4ヶ月半でのリリースになりました。待ちに待っていた方も多いのではないでしょうか。CentOS7.0(1406)のリリースからは約5年ぶりのメジャーバージョンアップです。CentOS 8.0 では PHP7.2 や MySQL8、Apache httpd の HTTP/2 や TLS1.3 など新しいバージョンのミドルウェアや機能が使えるようになっています。さっそく、CentOS8.0 で LAMP構成をインストールする手順をメモしておきました。

(2020年12月16日追記)CentOS Linux 8 は、2021年末でサポートが終了します。今後の対応方法は 「CentOS Linux 8 終了!今後の対応方法まとめ」をご参照ください。

LAMP環境における CentOS 8.0 の変更点

LAMP環境における CentOS 8.0 の主な変更点を簡単にまとめてみました。詳細はリリースノートを参照してください。

初期バージョンなので、本番環境への導入は迷うところですが、これだけの新機能が使えて10年間サポートされるのであれば検討の価値はありそうですね。(CentOS7は2020年の後半に完全更新が終了し、2024年6月30日にサポートが終了する予定です)

また、CentOS 8.0 は、CentOS7 と比べてパフォーマンスが向上しています。
関連記事:CentOS8 は CentOS7 よりもパフォーマンスが向上している話

Apache httpd 2.4.6 → 2.4.37

Apache httpd が、HTTP/2 や TLS 1.3 に対応したバージョン 2.4.37 に更新され、デフォルトのMPMが prefork から event に変更になっています。そのため、mod_php などスレッドセーフではないサードパーティーのモジュールは事実上使えなくなりました。(そのため PHP は FPM に変更になっています)

Apache httpd は、バージョン 2.4.6 から 2.4.37 の間に多くの機能が追加されましたが、設定ファイルはCentOS7 と後方互換するように配慮されています。

また、ACME をサポートした mod_md(Managed Domain)モジュールが使えるので、Apache httpd のみで Let's Encrypt 証明書の取得や更新ができるようになりました。

MySQL 8.0 の導入

CentOS7で MySQL をインストールするには MySQLのリポジトリをインストールする必要がありましたが、CentOS 8.0では、MySQL 8.0が標準で使えるようになりました。

また、MySQL 8.0 でよく問題となるデフォルトの認証プラグイン caching_sha2_password は mysql_native_password を使用するように設定されています。

Nginx の導入

以前はソフトウェアコレクションで提供されていた Nginx 1.14 が標準で使えるようになりました。

PHP 5.4 → PHP 7.2

CentOS8.0では、PHP 7.2 が標準で使えるようになりました。また、PHP はデフォルトで FastCGI Process Manager (FPM) を使用するように変更されています。

Python 2 → Python 3

CentOS 8.0では、Python3 がデフォルトになりました。ただし初期状態ではインストールされないため yum install python3 コマンドでインストールする必要があります。

TLS 1.3のサポート

暗号化ライブラリ OpenSSL がバージョン1.1.1になり TLS 1.3 がサポートされました。また、CentOS 8.0 では TLS 1.0 および TLS 1.1 が非推奨になっています。

yum がバージョン4(DNF)に変更

yum が DNFテクノロジーに基づいたバージョン4にアップデートされ、パフォーマンスや安定性が向上しています。今まで通り yum コマンドは使えますが(/usr/bin/dnf-3 へのシンボリックリンクになっています)yum の設定ファイルオプションが変更になっています。

CentOS 8.0 (1905) リリースノート

CentOS 8.0 (1905) のダウンロード

はじめに、CentOSのダウンロードページから CentOS-8-x86_64-1905-dvd1.iso をダウンロードしておきます。

マシン構成

VirtualBoxの仮想マシンにインストール

○仮想マシン構成
メモリ:2048MB(CentOS8では、最低でも2GB以上のメモリが必要です。メモリ4GB以上を推奨)
HDD:20GB
CPU:2コア

○ネットワークデバイス
アダプター1:NAT
アダプター2:ホストオンリーアダプター

○ネットワーク構成(※ご自分の環境に書換えてください)
ホスト名: centos80
IPアドレス:192.168.56.201/24
DNSサーバ: 8.8.8.8

CentOS 8.0 (1905) のインストール

[↑]キーで「Install CentOS Linux 8.0.1905」を選択して、エンターを押します。

GUI画面が表示されたら「日本語 Japanese」「日本語( 日本)」を選択して「続行」をクリックします。

下のような表示になるまで少し待ってから「インストール先」をクリックします。(これ以降、画面のリサイズがうまくいかないためか見切れています。ご了承ください)

インストール先のハードディスクを選択して、「完了」をクリックします。

続いて「ソフトウェアの選択」をクリックします。

「最小限のインストール」を選択して、「完了」をクリックします。(リリースノートには、VirtualBoxにインストールする場合は「サーバー (GUI使用)」は選択すべきではないと書いてありますので注意しましょう)

「インストールの開始」をクリックします。パーティションの作成とインストールが開始します。

「rootパスワード」をクリックします

root ユーザーに設定するパスワードを入力して「完了」をクリックします。

インストールが完了するまでしばらく待ちます。

インストールが完了したら「再起動」をクリックします。そのままだと再度インストーラーが起動してしまうので、再起動中にインストールメディアを取り出してください。(VirtualBoxの場合は、一度仮想マシンの電源をオフにして、ストレージに追加したISOイメージを削除してください)

CentOS8が起動したら root ユーザーでログインします。

ネットワーク関連設定

NICの設定

・ネットワークデバイス名の確認
nmcli dev s

DEVICE    TYPE      STATE         CONNECTION
enp0s3    ethernet  disconnected  -- 
enp0s8    ethernet  disconnected  --
 

アダプター1(NAT)は「enp0s3」、アダプター2(ホストオンリーアダプター)は「enp0s8」がネットワークデバイス名です。 ネットワークデバイス名は、環境によって異なりますので、ご自分の環境にあわせて設定してください。

アダプター1(NAT)の設定

nmcli con mod enp0s3 connection.autoconnect "yes"

アダプター2(ホストオンリーアダプター)の設定

nmcli con mod enp0s8 connection.autoconnect "yes"
nmcli con mod enp0s8 ipv4.addresses "192.168.56.201/24"
nmcli con mod enp0s8 ipv4.method manual

上記設定で sshログインができるようになります。※DNSサーバの設定前のため、ログインに時間がかかることがあります

ssh root@192.168.56.201

DNSサーバの設定

手動で設定するため、DHCPでのDNSサーバ設定を無効にします。

nmcli con mod enp0s3 ipv4.ignore-auto-dns yes

DNSサーバを設定し、NetworkManager を再起動します。

nmcli con mod enp0s3 ipv4.dns 8.8.8.8
systemctl restart NetworkManager

DNSサーバが設定されていることを確認します。

cat /etc/resolv.conf
-----(以下の表示があればOK)-----
# Generated by NetworkManager
nameserver 8.8.8.8

ホスト名の設定

ホスト名「centos80」を設定し、hostnamed を再起動します(一度ログアウトしログインすると設定したホスト名が反映されていることを確認できます)

nmcli general hostname centos80
systemctl restart systemd-hostnamed

基本パッケージのインストール

開発ツールなど、基本的なパッケージをインストールしておきます。

yum -y groupinstall base
yum -y groupinstall development
yum -y groupinstall network-tools

yum アップデート

インストール済みのパッケージを、最新版にアップデートします。

yum -y update

不要サービスの停止

下記のコマンドを実行

systemctl disable atd
systemctl disable kdump
systemctl disable mdmonitor

SELinux無効設定

・下記を変更
vim /etc/sysconfig/selinux

SELINUX=enforcing
 ↓
SELINUX=disabled

OSを再起動します

shutdown -r now

firewalld設定

・現在の設定の確認
firewall-cmd --list-all

public (default, active)
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
(略)

初期設定では publicゾーンに ssh のみ許可されています。

追加で HTTP(80/tcp) と HTTPS(443/tcp) を許可しておきます

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent

設定を読込みます

firewall-cmd --reload

・設定を確認します
firewall-cmd --list-ports --zone=public
-----(以下の表示があればOK)-----

443/tcp 80/tcp

Chrony設定(NTP)

タイムゾーンを日本に変更

timedatectl set-timezone Asia/Tokyo

・NTPサーバーを変更します。
vim /etc/chrony.conf

pool 2.centos.pool.ntp.org iburst
 ↓
server ntp.nict.jp
server ntp.nict.jp
server ntp.nict.jp

chronyd を再起動

systemctl restart chronyd

自動起動設定

systemctl enable chronyd

・10分ほど経過したら動作を確認します。
chronyc sources -v
-----(以下のような表示があればOK)-----

^+ ntp-a3.nict.go.jp 1 6 77 59 +972us[ +972us] +/- 5667us
^- ntp-b2.nict.go.jp 1 6 77 61 +1423us[+1423us] +/- 3830us
^* ntp-a2.nict.go.jp 1 6 77 62 +269us[ +547us] +/- 4458us

chronyd はゆっくり時刻を同期します。時刻があまりにもズレている場合は、下記コマンドを実行して即時同期してください。(ntpdateコマンドは廃止されました)

chronyc makestep

Postfix設定(Gmailリレー)

Postfix と、テスト用に mailコマンドをインストールします。

yum -y install postfix
yum -y install mailx

・GmailのSMTP認証情報ファイルの作成
vim /etc/postfix/gmail

[smtp.gmail.com]:587 <Gmailのアドレス>:<Gmailのパスワード>

パスワードを書いているので、パーミッションを変更(root のみアクセス可)

chmod 600 /etc/postfix/gmail

PostfixのDBファイルを生成

postmap /etc/postfix/gmail

・Postfixの設定
vim /etc/postfix/main.cf
-----(下記を最終行に追加)-----

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes

Postfix を起動します。

systemctl start postfix

Postfix の自動起動を設定します。

systemctl enable postfix

・root宛メールの送信先を変更します
vim /etc/aliases
-----(下記を最終行に追加)-----

root: <Gmailのアドレス>

メールエイリアスのDBファイルを更新します

newaliases

root宛のメールが、Gmailのアドレスに届くことを確認します

echo test | mail -s "test mail" root

各種ミドルウェアのインストール

※バージョンは2019年9月25日時点のものです。

Apache httpd(2.4.37-11)

yum -y install httpd-devel
yum -y install mod_ssl

PHP(7.2.11-1)

yum -y install php
yum -y install php-devel
yum -y install php-pdo
yum -y install php-mysqlnd
yum -y install php-mbstring
yum -y install php-gd
yum -y install php-pear
yum -y install php-pecl-apc-devel
yum -y install zlib-devel

MySQL(8.0.13-1)

yum -y install mysql-devel
yum -y install mysql-server

PHPの設定

・PHPの設定
vim /etc/php.ini

expose_php = On
 ↓
expose_php = Off
 
;date.timezone =
 ↓
date.timezone = 'Asia/Tokyo'
 
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
 ↓
error_reporting = E_ALL & ~E_NOTICE

php-fpm を起動します。

systemctl start php-fpm

php-fpm の自動起動を設定します。

systemctl enable php-fpm

CentOS8ではモジュール版のPHPでななく PHP-FPM が使われるようになりました。注意点は以下の通りです。

  • PHP はデフォルトで FastCGI Process Manager (FPM) を使用します (スレッド化された httpd で安全に使用できます)。
  • php_value 変数および php-flag 変数は httpd 設定ファイルで使用されなくなり、代わりに プール設定の /etc/php-fpm.d/*.conf で設定する必要があります。
  • PHP スクリプトのエラーと警告のログは、/var/log/httpd/error.log ではなく /var/log/php- fpm/www-error.log ファイルに記録されます。
  • PHP の max_execution_time 設定変数を変更するときは、変更した値に合わせて httpd ProxyTimeout 設定を増やす必要があります。
  • PHP スクリプトを実行するユーザーが、FPM プール設定 (/etc/php-fpm/d/www.conf ファイ ル、apache ユーザーがデフォルト) に設定されるようになりました。
  • 設定を変更した場合、または新しい拡張機能をインストールした場合は、php-fpm サービスを 再起動する必要があります。

15.1.2. PHP への主な変更点 | RHEL 8 の導入における検討事項 より引用

Apache httpd の設定

不要なコンフィグを読込まないようにしておきます。

mv -i /etc/httpd/conf.d/autoindex.conf /etc/httpd/conf.d/autoindex.conf.org
mv -i /etc/httpd/conf.d/userdir.conf /etc/httpd/conf.d/userdir.conf.org
mv -i /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.org

オリジナルのコンフィグをバックアップ

mv -i /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org

・コンフィグを作成します。
vim /etc/httpd/conf/httpd.conf

Apache httpd を起動します。

systemctl start httpd

Apache httpd の自動起動を設定します。

systemctl enable httpd

自己署名のサーバー証明書の作成(HTTPS用)

正規の認証局が発行した、サーバー証明書を無料で取得できるようになりました。よければご参照ください → Let's Encrypt サーバー証明書の取得と自動更新設定メモ

秘密鍵の作成

openssl ecparam -name prime256v1 -genkey -out server.key

・CSR(証明書署名要求)の作成(入力するのは2箇所だけです)
openssl req -new -key server.key > server.csr

Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []:<空エンター>
Locality Name (eg, city) [Default City]:<空エンター>
Organization Name (eg, company) [Default Company Ltd]:<空エンター>
Organizational Unit Name (eg, section) []:<空エンター>
Common Name (eg, your name or your server's hostname) []: www.example.com
Email Address []:<空エンター>
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<空エンター>
An optional company name []:<空エンター>

自己署名のサーバー証明書の作成(有効期限10年)

openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

秘密鍵とサーバー証明書を適切な場所に移動

mv -i server.key /etc/pki/tls/private/
mv -i server.crt /etc/pki/tls/certs/

パーミッションを変更

chmod 600 /etc/pki/tls/private/server.key
chmod 600 /etc/pki/tls/certs/server.crt

CSRを削除

rm server.csr

Apache HTTPS(SSL/TLS)の設定

SSL設定ファイルのオリジナルをバックアッップします

mv -i /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.org

SSL設定ファイルを作成します。(HTTP/2 と TLS1.3 が有効になるように設定しています)
vim /etc/httpd/conf.d/ssl.conf

関連記事:安全な SSL/TLS 設定にするための10のポイント(Apache httpd 2.4)
 

Apache httpd を再起動します。

systemctl restart httpd

WEBブラウザで HTTPSで接続できることを確認します(自己署名のサーバー証明書の場合は警告が表示されます)

MySQL 8.0 の設定

・MySQLの設定ファイルに以下を追加します。
vim /etc/my.cnf.d/mysql-server.cnf

slow_query_log=ON
slow_query_log_file=/var/log/mysql/slow_query.log
long_query_time=1.0
 
log_timestamps=SYSTEM
skip-character-set-client-handshake

(補足)
MySQL 8.0 ではセキュリティ強化のためデフォルトの認証プラグインが「caching_sha2_password」に変更になっています。しかし、現状ではほとんどのWebアプリケーション(WordPressやZabbixなど)が caching_sha2_password に対応していません。

そのため CentOS 8.0 では以下の設定ファイルで、認証プラグインを「mysql_native_password」に変更してくれています。

cat /etc/my.cnf.d/mysql-default-authentication-plugin.cnf
(略)
default_authentication_plugin=mysql_native_password

MySQL を起動します。

systemctl start mysqld

MySQL の自動起動を設定します。

systemctl enable mysqld

mysql_secure_installation の実行

初期状態では、rootユーザーがパスワードなしで MySQLに接続できるようになっていますのでパスワードを設定しておきます。

mysql_secure_installation コマンドを実行すると、root ユーザーのパスワードを変更し、不要なユーザーやDBも削除してくれます。パスワードは、8文字以上で英数大文字小文字と記号が含まれていないとポリシー違反で弾かれてしまいますので注意です。パスワードポリシーを変更したい場合は「--use-default」オプションなしで実行してください。

mysql_secure_installation --use-default
 
(略)
Please set the password for root here.
 
New password: <新しいパスワード>
 
Re-enter new password: <新しいパスワード>
(略)
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
(不要なユーザーやDBを削除)
All done!

ログローテーション設定

設定ファイルのバックアップ用ディレクトリを作成しておきます。

mkdir /etc/logrotate.off

Apacheログのローテーション設定

オリジナルの設定ファイルをバックアップします

mv -i /etc/logrotate.d/httpd /etc/logrotate.off/

・設定ファイルを作成します
vim /etc/logrotate.d/httpd

/var/log/httpd/*log { 
    daily 
    missingok 
    dateext 
    rotate 60 
    create 644 apache apache 
    sharedscripts 
    postrotate 
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript 
}

・確認します
logrotate -v /etc/logrotate.d/httpd
-----(下記のような表示があればOKです)-----

(略)
rotating pattern: /var/log/httpd/*log after 1 days (60 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/httpd/access_log
(略)

MySQLログのローテーション設定

オリジナルの設定ファイルをバックアップします

mv -i /etc/logrotate.d/mysqld /etc/logrotate.off/

・設定ファイルを作成します
vim /etc/logrotate.d/mysqld

/var/log/mysql/*log {
    daily
    missingok
    dateext
    rotate 60
    sharedscripts
    postrotate
    if test -x /usr/bin/mysqladmin && \
        /usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf ping &>/dev/null
    then
        /usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf flush-logs
    fi
    endscript
}

・MySQL の root ユーザのパスワードファイルを作成
vim /root/.my.cnf

[mysqladmin]
user=root
password="<パスワード>"

パスワードを書いているのでパーミッションを変更

chown root:root /root/.my.cnf
chmod 600 /root/.my.cnf

・確認します
logrotate -v /etc/logrotate.d/mysqld
-----(下記のような表示があればOKです)-----

(略)
rotating pattern: /var/log/mysql/*log after 1 days (60 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/mysql/mysqld.log
(略)

自動起動の設定確認

systemctl list-unit-files | grep -e httpd.service -e php-fpm.service -e mysqld.service -e chronyd.service
-----(下記のような表示であればOKです)-----

chronyd.service enabled
httpd.service enabled
mysqld.service enabled
php-fpm.service enabled

一度OSを再起動して、各種サービスが起動している事を確認しましょう。

shutdown -r now
(再起動後に以下を実行)
ps aux | grep -e httpd -e php-fpm -e mysqld -e chronyd

以上です。設定お疲れ様でした!

コメント

  1. 今西 より:

    大変分かりやすくとても助かりました。ありがとうございました。
    とてもおこがましいのですが、もし可能でしたらphpmyadminのインストール方法をお教えいただけないでしょうか?他のサイトも調べたりしたのですが、分かりにくく途中で訳が分からなくなり何度かシステムを作り直しております。勝手なこと言いまして申し訳ありません。

    • あぱーブログ あぱーブログ より:

      >今西さん
      お褒めのコメントありがとうございます!(返信遅くなりすみません)
      この記事がお役にたてて良かったです。

      phpmyadminのインストール方法については次回の記事でまとめてみたいと思います。

タイトルとURLをコピーしました