CentOS7+Apache2.4(TLS1.3)+MySQL8.0+PHP7.3 最新LAMP環境+WordPress5.0インストールメモ

Linux
スポンサーリンク

2018年は、4月の MySQL8.0 のリリース、8月のRFC8446(TLS1.3の標準仕様)の発行、10月の Apache httpd2.4 の TLS1.3 サポート、そして年末12月には PHP7.3 と WordPress5.0 がほぼ同時にリリースされ、ミドルウェア界隈では変化の多い1年となりました。そこで今回は、現時点で(2019年1月8日)最新の LAMP環境と WordPress5.0 をインストールする手順をまとめてみました。

 
(2019年1月25日更新)Apache httpd と Nghttp2 のバージョンを最新のものに更新しました。

CentOS 7.6 (1810) のインストール

サーバーOSは、CentOS 7.6 (1810) を最小構成(Minimal ISO)でインストールしています。CentOS 7.5 (1804) や 7.4 (1718) など CentOS7系なら yum アップデートを実行すれば CentOS 7.6 (1810) にアップデートできます。

Download CentOS

開発ツールのインストール

Apache httpd や各種ライブラリをソースからコンパイルしますので、開発ツールなど、基本的なパッケージをインストールしておきます。

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

yum アップデート

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

yum -y update

Apache httpd2.4 インストールの下準備

Apache httpd2.4 は、TLS1.3 と HTTP/2、新しい圧縮アルゴリズム Brotli 対応させるため、Apache httpd2.4 インストールの下準備として各種ライブラリをインストールします。

OpenSSL 1.1.1 のインストール

TLS1.3 に対応した OpenSSL 1.1.1 をインストールします。

OpenSSL のコンパイルに必要なパッケージをインストールしておきます。

yum -y install zlib-devel
yum -y install perl-core

OpenSSL 1.1.1のインストール

cd /usr/local/src/
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
tar xvzf openssl-1.1.1a.tar.gz
cd openssl-1.1.1a/
./config --prefix=/usr/local/openssl-1.1.1a shared zlib
make depend
make
make test
make install

OpenSSL1.1.1 のライブラリにパスを通しておきます。

echo /usr/local/openssl-1.1.1a/lib > /etc/ld.so.conf.d/openssl111.conf
ldconfig

下記のコマンドで OpenSSL が TLS1.3 に対応していることを確認できます。(以下は TLS1.3 が対応している暗号スイートです)

/usr/local/openssl-1.1.1a/bin/openssl ciphers -v TLSv1.3
 
TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD

Nghttp2 のインストール

HTTP/2(mod_http2)のコアエンジン Nghttp2 をインストールします。

Nghttp2 のコンパイルに必要なパッケージをインストールしておきます。

yum -y install jansson-devel
yum -y install libev-devel
yum -y install c-ares-devel

Nghttp2 は、バージョン1.35.0 から C++14が必要になった ようですので、CentOS7 の場合は Software Collections(SCL)リポジトリから devtoolset-7 パッケージをインストールして有効化しておきます。

yum -y install centos-release-scl
yum -y install devtoolset-7
scl enable devtoolset-7 bash

Nghttp2 のダウンロード(ダウンロードの前に Nghttp2の最新リリース を確認しておきましょう)

cd /usr/local/src/
wget https://github.com/nghttp2/nghttp2/releases/download/v1.36.0/nghttp2-1.36.0.tar.gz

Nghttp2 のインストール。環境変数 OPENSSL_CFLAGS と OPENSSL_LIBS に先ほどインストールした、OpenSSL1.1.1 のディレクトリパスを指定してコンパイルします。

tar xvzf nghttp2-1.36.0.tar.gz
cd nghttp2-1.36.0/
env OPENSSL_CFLAGS="-I/usr/local/openssl-1.1.1a/include" OPENSSL_LIBS="-L/usr/local/openssl-1.1.1a/lib -lssl -lcrypto" ./configure -enable-app
make
make install

HTTP/2 のライブラリ「libnghttp2」が /usr/local/lib/ 以下にインストールされます。Nghttp2 関連のコマンドは /usr/local/bin/ 以下にインストールされます。

Brotli のインストール

Brotli のコンパイルに cmake を使いますので、インストールしておきます。

yum -y install cmake

Brotli のダウンロード(ダウンロードの前に Brotliの最新リリース を確認しておきましょう)

cd /usr/local/src/
wget https://github.com/google/brotli/archive/v1.0.7.tar.gz

Brotli をコンパイルしてインストールします。

tar xvzf v1.0.7.tar.gz
cd brotli-1.0.7/
mkdir out && cd out
../configure-cmake
make
make test
make install

Brotli のライブラリが /usr/local/lib/ 以下にインストールされます。

ライブラリへのパス追加

HTTP/2 と Brotliのライブラリが「/usr/local/lib/」以下にインストールされましたので、ライブラリのパスに追加しておきます。

echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig

APR と APR-util のインストール

Apache httpd2.4 をソースコードからインストールする場合は、Apache Portable Runtime (APR) が必要になりますので、APR と APR-util をインストールしておきます。

APR 及び APR-util のコンパイルに必要なパッケージをインストールしておきます。

yum -y install pcre-devel
yum -y install expat-devel

APR

cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.6.5.tar.gz
tar xvzf apr-1.6.5.tar.gz
cd apr-1.6.5/
./configure
make
make install

APR-util

cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.6.1.tar.gz
tar xvzf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1/
./configure --with-apr=/usr/local/apr
make
make install

かなり長くなりましたが、以上で Apache httpd2.4 インストールの下準備は完了です。

Apache httpd2.4 のインストール

下準備が完了しましたので、本題の Apache httpd2.4 をインストールします。

Apache httpd のソースコードのダウンロード

cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.38.tar.gz

ダウンロードしたソースコードを解凍して、ディレクトリを移動します。

tar xvzf httpd-2.4.38.tar.gz
cd httpd-2.4.38/

HTTP/2 と Brotli モジュール、SSL/TLS を有効にしてインストールします。

./configure \
--enable-http2 \
--enable-brotli \
--with-brotli=/usr/local/lib \
--enable-ssl \
--with-ssl=/usr/local/openssl-1.1.1a \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr \
--enable-so \
--enable-mods-shared=all \
--enable-mpms-shared=all
 
make
make install

以上で Apache httpd が /usr/local/apache2/ 以下にインストールされました。Apache httpd の設定は PHP7.3 のインストールと設定をした後に行います。

PHP7.3 のインストール

PHP7.3 は remi リポジトリからインストールします。

Remi リポジトリの追加

Remi リポジトリが依存する EPEL リポジトリを追加します。

yum -y install epel-release
yum -y update

Remi リポジトリを追加します。

rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi

Remi リポジトリを有効化します。
vim /etc/yum.repos.d/remi.repo

[remi]
(略)
enabled=0
 ↓
enabled=1

vim /etc/yum.repos.d/remi-php73.repo

[remi-php73]
(略)
enabled=0
 ↓
enabled=1

PHP7.3 のインストール

PHP7.3 と各種モジュールをインストールします。(依存関係でパッケージ版の Apache httpd2.4 もインストールされますが、起動しなければ問題ありません)

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 php-fpm

PHP7.3 の設定

PHP7.3 の設定
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 を Apache httpd と同じ実行ユーザ/グループで動作するように設定します。(Apache httpdをソースコードからインストールしている場合、実行ユーザーは daemon が設定されています)

vim /etc/php-fpm.d/www.conf

user = apache
group = apache
 ↓
user = daemon
group = daemon

また、今回は同じサーバーで Apache httpd2.4 と php-fpm を動作させますので、Apache httpd2.4 と php-fpm の通信を UNIXドメインソケット経由で行うように設定します。

listen = 127.0.0.1:9000
 ↓
listen = /var/run/php-fpm/php-fpm.sock
 
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
 ↓
listen.owner = daemon
listen.group = daemon
listen.mode = 0660

php-fpm 用のログディレクトリのオーナーを Apache httpd の実行ユーザーに変更します。

chown daemon /var/log/php-fpm

php-fpm を起動します。

systemctl start php-fpm

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

systemctl enable php-fpm

PHP7.3 関連のログの出力場所

PHP 関連のログは以下の場所に出力されます。

php-fpm に関するログ

/var/log/php-fpm/error.log

php が出力するエラーログです。/etc/php.ini の error_reporting で指定したレベルのログが出力されます。

/var/log/php-fpm/www-error.log

自己署名のSSLサーバー証明書の作成

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

HTTP/2 および Brotli は HTTPS が必須になりますので Apache httpd の設定の前に、SSLサーバー証明書を作成しておきます。

秘密鍵の作成(ECDSAの256ビット鍵を生成)

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 []:<空エンター>

SSLサーバー証明書の作成(有効期限10年)

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

秘密鍵とSSL証明書を移動

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

SELinux を有効にしている場合は、秘密鍵とSSL証明書に正しいセキュリティコンテキストをつけておきましょう。(Apache httpd 起動時にエラーが発生することがあります)

restorecon -v /etc/pki/tls/private/server.key
restorecon -v /etc/pki/tls/certs/server.crt

CSRを削除

rm server.csr

Apache httpd2.4 の設定

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

mv -i /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.org
mv -i /usr/local/apache2/conf/extra/httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf.org

設定ファイルを作成します
vim /usr/local/apache2/conf/httpd.conf

vim /usr/local/apache2/conf/extra/httpd-ssl.conf

Apache httpd2.4 の systemd サービスファイルの作成

Apache httpd の systemd サービスファイル(起動スクリプトのようなもの)を作成します。

vim /etc/systemd/system/httpd.service

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecReload=/usr/local/apache2/bin/apachectl graceful
ExecStop=/usr/local/apache2/bin/apachectl stop
 
[Install]
WantedBy=multi-user.target

作成したサービスファイルを systemd に反映

systemctl daemon-reload

systemd に反映されているか確認

systemctl list-unit-files | grep httpd
httpd.service disabled ←この表示があればOK

Apache httpd の起動

systemctl start httpd

Apache httpd の自動起動設定

systemctl enable httpd

firewalld設定

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-all

public (default, active)
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports: 443/tcp 80/tcp ←この表示があればOK
(略)

MySQL8.0 のインストール

MySQL8.0 は、公式の MySQL リポジトリからインストールします。

MySQL リポジトリの追加

MySQL リポジトリを追加します。

rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

MySQL8.0 のインストール

MySQL8.0 をインストールします。

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

MySQL8.0 の設定

デフォルトの認証プラグインの変更

MySQL8.0 からデフォルトの認証プラグインが caching_sha2_password に変更になりました。この認証プラグインは、安全性やパフォーマンスが向上しているのですが、2019年1月8日現在 WordPress は caching_sha2_password には対応していないため、デフォルトの認証プラグインを mysql_native_password に変更します。

vim /etc/my.cnf

#default-authentication-plugin=mysql_native_password
 ↓
default-authentication-plugin=mysql_native_password

デフォルトの認証プラグインを変更したら、MySQL8.0 を起動し自動起動するように設定しておきます。

systemctl start mysqld
systemctl enable mysqld

mysql_secure_installation の実行

root ユーザーの初期パスワードの確認(初期パスワードはそのまま使うことはできませんので変更が必要です)
grep password /var/log/mysqld.log

2019-01-07T15:34:33.680997Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: <初期パスワード>

この後に設定する root ユーザーの新しいパスワードは、8文字以上で英数大文字小文字と記号が含まれていないとポリシー違反で弾かれてしまいますので注意です。
参考資料:6.5.3.2 Password Validation Options and Variables | MySQL 8.0 Reference Manual

mysql_secure_installation コマンドに「--use-default」オプションを付けてを実行します。root ユーザーのパスワード変更や、不要なユーザーやDBを削除してくれます。

mysql_secure_installation --use-default
 
(略)
Enter password for user root: <初期パスワード>
 
The existing password for the user account root has expired. Please set a new password.
 
New password: <新しいパスワード>
 
Re-enter new password: <新しいパスワード>
(略)

ログローテーション設定

Apache httpd2.4 ログのローテーション設定

・Apache httpd2.4 ログのローテーションの設定ファイルを作成します
vim /etc/logrotate.d/httpd24

/usr/local/apache2/logs/*log { 
    daily 
    missingok 
    dateext 
    rotate 60 
    create 644 daemon daemon
    sharedscripts 
    postrotate 
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript 
}

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

reading config file /etc/logrotate.d/httpd24
Allocating hash table for state file, size 15360 B
 
Handling 1 logs
 
rotating pattern: /usr/local/apache2/logs/*log after 1 days (60 rotations)
empty log files are rotated, old logs are removed
(略)

MySQL8.0 ログのローテーション設定

・MySQL8.0 ログのローテーションの設定ファイルを作成します
vim /etc/logrotate.d/mysql80

/var/log/mysqld.log {
    create 644 mysql mysql
    notifempty
    weekly
    rotate 5
    missingok
    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 -dv /etc/logrotate.d/mysql80
-----(下記のような表示であればOKです)-----

reading config file /etc/logrotate.d/mysql80
Allocating hash table for state file, size 15360 B
 
Handling 1 logs
 
rotating pattern: /var/log/mysqld.log weekly (5 rotations)
empty log files are not rotated, old logs are removed
(略)

WordPress5.0 のインストール

最新の WordPress5.0 日本語版をダウンロードします。

wget https://ja.wordpress.org/latest-ja.tar.gz

解凍します。

tar xvzf latest-ja.tar.gz

解凍すると「wordpress」というディレクトリができますので、ドキュメントルートとなる場所へ移動します。

mv -i /usr/local/apache2/htdocs /usr/local/apache2/htdocs_org
mv wordpress /usr/local/apache2/htdocs

ドキュメントルート以下のオーナーを、Apache httpd の実行ユーザーに変更します。

chown -R daemon /usr/local/apache2/htdocs

SELinux を有効にしている場合は、ドキュメントルート以下のファイルとディレクトリに正しいセキュリティコンテキストを設定します。

semanage fcontext -a -t httpd_sys_rw_content_t '/usr/local/apache2/htdocs(/.*)?'
restorecon -R /usr/local/apache2/htdocs

(補足)
上記のセキュリティコンテキストの設定は、以下のファイルに書き込まれます。

/etc/selinux/targeted/contexts/files/file_contexts.local

WordPress5.0 の設定

WordPress用のデータベースとユーザーの作成

WordPress用のデータベースとユーザーを作成します。 (パスワードは8文字以上で英数大文字小文字と記号が含まれている必要があります)

mysql -u root -p
 
CREATE DATABASE wordpress;
CREATE USER wordpress@localhost IDENTIFIED BY '<パスワード>';
GRANT ALL ON wordpress.* TO wordpress@localhost;
\q

WordPress の設定ファイルの作成

WordPress の設定ファイルを作成します。

cd /usr/local/apache2/htdocs/
mv -i wp-config-sample.php wp-config.php

WordPress の設定ファイルの編集

設定ファイルの編集して作成したデータベース名とユーザー名、パスワードを設定します。

vim /usr/local/apache2/htdocs/wp-config.php

define('DB_NAME', 'database_name_here');
 ↓
define('DB_NAME', 'wordpress');
 
define('DB_USER', 'username_here');
 ↓
define('DB_USER', 'wordpress');
 
define('DB_PASSWORD', 'password_here');
 ↓
define('DB_PASSWORD', '<パスワード>');

認証用ユニークキーの設定

define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
 ↓
https://api.wordpress.org/secret-key/1.1/salt/ に表示されたユニークキーをそのままコピペ

設定ファイルに MySQLのパスワードを書いていますので、オーナー以外は読取りできないようにしておきます。

chmod 600 /usr/local/apache2/htdocs/wp-config.php

WordPress の初期設定画面

WEBブラウザでアクセスして WordPress の初期設定画面が表示されていればOKです。(「File not found.」などが表示される場合は、SELinux によりアクセスを制限されている可能性があります。WordPress5.0 のインストール の手順をご確認ください)

自動起動の設定確認

最後に自動起動が正しく設定されていることを確認しておきましょう。

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

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

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

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

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

コメント

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