Apache HTTP/2+PHP7+MySQL5.7 インストールメモ

2015年12月28日  カテゴリー:Linux  タグ: , , , , , ,
Pocket
LINEで送る

2015年もあと少しになりました。今年を振り返ってみると、HTTP/2 の標準化と主要WEBサーバへの実装、2倍以上の性能向上やメモリ使用量を低減した PHP7 のリリース、Let's Encrypt によるSSL/TLSサーバー証明書の無料化、パフォーマンスが飛躍的に向上した MySQL5.7 のGA版リリースなど、2015年はWEBに関する技術が、大きく変化した年だったと思います。そこで今回は、この1年の締めくくりとして、現時点で最新のLAMP環境をインストールする手順をメモしておきました。

サーバOSは、CentOS 7.2 (1511) を最小構成でインストールしました。Apache2.4 と PHP7 はソースからインストールになります。

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

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

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

MySQL 5.7 のインストール

MySQLの yum リポジトリを追加

rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

インストール

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

MySQL 5.7 の設定

vim /etc/my.cnf
--(以下を最終行に追加)---

default_password_lifetime=0
log_timestamps=SYSTEM
explicit_defaults_for_timestamp=TRUE
skip-character-set-client-handshake
character-set-server=utf8

MySQL5.7では、ユーザーパスワードの有効期限が、デフォルトで360日に設定されています。セキュリティ的にはありがたいのですが、とりあえず「default_password_lifetime=0」で無期限にしています。ご自分のパスワードポリシーに合わせて設定してください。

MySQL5.7は、Google検索候補で「mysql5.7 罠」と出てくるくらい、デフォルト値が変わっています(^^;) 念のため、リファレンスマニュアルを確認しておくことをオススメします。
5.1.4 Server System Variables | MySQL 5.7 Reference Manual

起動

systemctl start mysqld

自動起動設定

systemctl enable mysqld

・root の初期パスワードの確認
grep password /var/log/mysqld.log

2015-12-26T14:22:24.178823+09:00 1 [Note] A temporary password is generated for root@localhost: <初期パスワード>

セキュリティ設定

設定するパスワードは、8文字以上、英数大文字小文字と記号が含まれていないと、ポリシー違反で弾かれてしまいます。オススメはしませんが、下のような回避方法もあるようです。
6.1.2.5 The Password Validation Plugin | MySQL 5.7 Reference Manual

validate-password=OFF

mysql_secure_installation
対話式で設定が始まります。(不要なユーザやDBを削除してくれます)

Securing the MySQL server deployment.
 
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: <パスワード>
 
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : <空エンター>
(略)
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
(略)
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
(略)
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
(略)
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
 
All done!

Apache インストールの下準備

Apache と mod_http2 が依存するライブラリをインストールします。

OpenSSL 1.0.2

OpenSSLのコンパイルに zlib を使うので、インストールしておきます。

yum -y install zlib-devel

OpenSSLのインストール

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

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

echo /usr/local/openssl-1.0.2e/lib > /etc/ld.so.conf.d/openssl102e.conf
ldconfig

Nghttp2

Nghttp2 が必要とするパッケージのインストール

yum -y install libev-devel

Nghttp2 のインストール
※頻繁にバージョンアップされているようです。ダウンロードの前に最新リリースを確認してください。
https://github.com/tatsuhiro-t/nghttp2/releases/latest

cd /usr/local/src/
wget https://github.com/tatsuhiro-t/nghttp2/releases/download/v1.6.0/nghttp2-1.6.0.tar.gz
tar xvzf nghttp2-1.6.0.tar.gz
cd nghttp2-1.6.0/
autoreconf -i
automake
autoconf
env OPENSSL_CFLAGS="-I/usr/local/openssl-1.0.2e/include" OPENSSL_LIBS="-L/usr/local/openssl-1.0.2e/lib -lssl -lcrypto" ./configure
make
make install

/usr/local/lib 以下に「libnghttp2」ライブラリがインストールされますので、こちらもライブラリのパスに追加しておきます。

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

ARP と ARP-util

ARP

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

ARP-util

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

PCREライブラリ

yum -y install pcre-devel

Apache 2.4.23 (mod_http2) のインストール

(2016年7月16日追記)Apache HTTPD バージョン 2.4.18 から 2.4.20 までは、クライアント証明書による認証が回避される脆弱性がありますので、バージョン2.4.23以上をインストールすることをオススメします。
JVNDB-2016-003438 Apache HTTPD の HTTP/2 通信における X.509 クライアント証明書の認証処理の問題

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

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

インストール

tar xvzf httpd-2.4.23.tar.gz
cd httpd-2.4.23/
 
./configure \
--enable-http2 \
--enable-ssl \
--with-ssl=/usr/local/openssl-1.0.2e \
--enable-so \
--enable-mods-shared=all \
--enable-mpms-shared=all
 
make
make install

以上で Apache 2.4.23 が /usr/local/apache2/ 以下にインストールされます。
Apacheの設定は、PHP7のインストール後に行います。

PHP インストールの下準備

EPEL リポジトリの追加

rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7

PHPが依存しているパッケージをインストール

yum -y install \
libxml2-devel \
openssl-devel \
freetype-devel \
libcurl-devel \
net-snmp-devel \
libpng-devel \
libjpeg-turbo-devel \
openldap-devel \
libmcrypt-devel \
readline-devel \
gd-devel \
bzip2-devel \
libicu-devel \
libwebp-devel \
gmp-devel \
libtidy-devel \
libxslt-devel

PHP 7 のインストール

PHP7のソースコードをダウンロード

cd /usr/local/src/
wget https://github.com/php/php-src/archive/php-7.0.1.tar.gz

インストール

tar xvzf php-7.0.1.tar.gz
cd php-src-php-7.0.1/
 
./buildconf --force
 
./configure \
--with-libdir=lib64 \
--with-pic \
--with-bz2 \
--with-freetype-dir \
--with-png-dir \
--with-xpm-dir \
--enable-gd-native-ttf \
--with-gettext \
--with-gmp \
--with-iconv \
--with-jpeg-dir \
--with-curl \
--with-webp-dir \
--with-png-dir \
--with-openssl \
--with-pcre-regex \
--with-zlib \
--with-layout=GNU \
--enable-exif \
--enable-ftp \
--enable-sockets \
--with-kerberos \
--enable-shmop \
--enable-calendar \
--with-libxml-dir \
--with-mhash \
--with-ldap \
--with-readline \
--with-snmp \
--with-tidy \
--with-xsl \
--with-gnu-ld \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysql-sock=/var/lib/mysql/mysql.sock \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--with-apxs2=/usr/local/apache2/bin/apxs
 
make
make test
make install

PHP 7 の設定

設定ファイル php.ini の配置

cp -ip /usr/local/src/php-src-php-7.0.1/php.ini-production /usr/local/etc/php.ini

エラーログの出力先を作成

mkdir /var/log/php
chown daemon /var/log/php
chmod 755 /var/log/php

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

expose_php = On
 ↓
expose_php = Off
 
;date.timezone =
 ↓
date.timezone = 'Asia/Tokyo'
 
;error_log = php_errors.log
 ↓
error_log = "/var/log/php/php_errors.log"

Apache の基本設定

/usr/local/apache2/bin へパスを通しておきます。
vim /etc/profile
---(下記を最終行に追加)---

PATH=$PATH:/usr/local/apache2/bin

上記設定を反映

source /etc/profile

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

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

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

起動スクリプトの作成

Apache2.4.18 は mod_systemd モジュールのインストールができないため systemd が使えません。そのため Apache は自動起動に chkconfig を使います。

RPM用の起動スクリプトをコピー

cp -ip /usr/local/src/httpd-2.4.18/build/rpm/httpd.init /etc/rc.d/init.d/httpd

・修正(60行目あたり)
vim /etc/rc.d/init.d/httpd

httpd=${HTTPD-/usr/sbin/httpd}
pidfile=${PIDFILE-/var/run/${prog}.pid}
lockfile=${LOCKFILE-/var/lock/subsys/${prog}}
 ↓
httpd=${HTTPD-/usr/local/apache2/bin/httpd}
pidfile=${PIDFILE-/usr/local/apache2/logs/${prog}.pid}
lockfile=${LOCKFILE-/usr/local/apache2/logs/${prog}}
 
CONFFILE=/etc/httpd/conf/httpd.conf
 ↓
CONFFILE=/usr/local/apache2/conf/httpd.conf

chkconfig に登録&確認します。

chkconfig --add httpd
chkconfig --list | grep httpd

自動起動設定

chkconfig httpd on

起動

apachectl start

注意:「service httpd start」や「/etc/init.d/httpd start」を実行すると systemd に処理が渡ってしまい、Apache が起動できません。手動での起動や停止は「apachectl」を使います。

Apache2.4 の systemd 問題は、こちらの記事を参考にさせて頂きました。
Apache2.4 on CentOS7 でsystemctl start 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

Let's Encrypt サーバー証明書の取得

Let's Encrypt クライアントのインストール

cd /usr/local/
git clone https://github.com/certbot/certbot

Let's Encrypt クライアントが依存するパッケージをインストール

cd certbot/
./certbot-auto

証明書の取得 オプションの詳細

./certbot-auto certonly --webroot \
-w /usr/local/apache2/htdocs -d example.com \
-m sample@example.com \
--agree-tos

以下の場所に証明書や秘密鍵が保存されます。

証明書
/etc/letsencrypt/live/example.com/cert.pem

証明書+中間CA証明書
/etc/letsencrypt/live/example.com/fullchain.pem

秘密鍵
/etc/letsencrypt/live/example.com/privkey.pem

中間CA証明書
/etc/letsencrypt/live/example.com/chain.pem

証明書の自動更新設定

crontab -u root -e

00 05 01 * * /usr/local/certbot/certbot-auto renew --force-renew && /usr/local/apache2/bin/apachectl graceful

Apache HTTP/2 と SSL/TLS の設定

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

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

・SSL設定ファイルを作成します。
vim /usr/local/apache2/conf/extra/httpd-ssl.conf

・SSL設定ファイルを読込むように変更(160行目あたり)
vim /usr/local/apache2/conf/httpd.conf

#Include conf/extra/httpd-ssl.conf
 ↓
Include conf/extra/httpd-ssl.conf

Apache を再起動

apachectl graceful

WordPress 4.4 のインストール

動作確認用にWordPress をインストール

wget https://ja.wordpress.org/wordpress-4.4-ja.tar.gz
tar xvzf wordpress-4.4-ja.tar.gz
mv -i wordpress /usr/local/apache2/htdocs/wp
chown -R daemon:daemon /usr/local/apache2/htdocs/wp

データベースとMySQLユーザの作成
mysql -u root -p

CREATE DATABASE wp;
GRANT ALL ON wp.* TO 'wp'@'localhost' IDENTIFIED BY '<パスワード>';

WordPress設定ファイルの作成

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

・WordPressの設定
vim /usr/local/apache2/htdocs/wp/wp-config.php
---(下記を変更)---

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

・認証用ユニークキーの設定
WordPress.org の秘密鍵サービス https://api.wordpress.org/secret-key/1.1/salt/ にアクセスし、表示されたユニークキーをWordPressの設定に貼付けます。
vim /var/www/html/wordpress/wp-config.php

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');
 ↓
表示されたユニークキー

・Apacheの設定変更
vim /usr/local/apache2/conf/extra/httpd-ssl.conf

AllowOverride None
 ↓
AllowOverride All

Apache を再起動

apachectl graceful

素の状態のWordPressであれば、HTTP/2+PHP7+MySQL5.7の環境で問題なく動作します。ただ、追加テーマや、プラグインのPHP7対応が気になるところですね。
lamp-2015-01

終わりに

PHP7 は10年ぶりのメジャーバージョンアップ、HTTP/2 にいたっては、前バージョンの HTTP1.1 が規程されてから、なんと16年ぶりのバージョンアップになるそうです。どちらの技術も、非効率な実装を見直し、高速化を実現させています。これらミドルウエアの入替は、WEBアプリケーションに与える影響が大きいため、躊躇してしまいがちですが、今回のバージョンアップはそれ以上の恩恵を受けられると思います。新規のリリースや、サーバ入替のタイミングで、新しい技術の導入を検討してみてはいかがでしょうか。

スポンサーリンク
Pocket
LINEで送る

Apache HTTP/2+PHP7+MySQL5.7 インストールメモ」への2件のフィードバック

  1. ピンバック: 響きの良いブログタイトルを付けたい

  2. ピンバック: HTTP2とPHP7とMariaDBなサーバーでWordPressを使ってブログを構築しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です