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 development
yum -y groupinstall network-tools
MySQL 5.7 のインストール
MySQLの yum リポジトリを追加
インストール
yum -y install mysql-community-server
MySQL 5.7 の設定
vim /etc/my.cnf
--(以下を最終行に追加)---
log_timestamps=SYSTEM
explicit_defaults_for_timestamp=TRUE
skip-character-set-client-handshake
character-set-server=utf8
起動
自動起動設定
・root の初期パスワードの確認
grep password /var/log/mysqld.log
mysql_secure_installation
対話式で設定が始まります。(不要なユーザやDBを削除してくれます)設定するパスワードは、8文字以上、英数大文字小文字と記号が含まれていないと、ポリシー違反で弾かれてしまいます。
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 を使うので、インストールしておきます。
OpenSSLのインストール
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 のライブラリにパスを通しておきます。
ldconfig
Nghttp2
Nghttp2 が必要とするパッケージのインストール
Nghttp2 のインストール
※頻繁にバージョンアップされているようです。ダウンロードの前に最新リリースを確認してください。
https://github.com/tatsuhiro-t/nghttp2/releases/latest
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」ライブラリがインストールされますので、こちらもライブラリのパスに追加しておきます。
ldconfig
APR と APR-util
APR
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
APR-util
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ライブラリ
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 のソースコードをダウンロード
wget http://ftp.jaist.ac.jp/pub/apache//httpd/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 --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
PHPが依存しているパッケージをインストール
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のソースコードをダウンロード
wget https://github.com/php/php-src/archive/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 の配置
エラーログの出力先を作成
chown daemon /var/log/php
chmod 755 /var/log/php
・PHPの設定
vim /usr/local/etc/php.ini
↓
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
---(下記を最終行に追加)---
上記設定を反映
オリジナルの設定ファイルをバックアップ
・設定ファイルを作成します。
vim /usr/local/apache2/conf/httpd.conf
起動スクリプトの作成
Apache2.4.18 は mod_systemd モジュールのインストールができないため systemd が使えません。そのため Apache は自動起動に chkconfig を使います。
RPM用の起動スクリプトをコピー
・修正(60行目あたり)
vim /etc/rc.d/init.d/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 --list | grep httpd
自動起動設定
起動
注意:「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=443/tcp --permanent
firewall-cmd --reload
Let's Encrypt サーバー証明書の取得
Let's Encrypt クライアントのインストール
git clone https://github.com/certbot/certbot
Let's Encrypt クライアントが依存するパッケージをインストール
./certbot-auto
証明書の取得 オプションの詳細
-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
Apache HTTP/2 と SSL/TLS の設定
SSL設定ファイルのオリジナルをバックアッップしておきます。
・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
Apache を再起動
WordPress 4.4 のインストール
動作確認用にWordPress をインストール
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
GRANT ALL ON wp.* TO 'wp'@'localhost' IDENTIFIED BY '<パスワード>';
WordPress設定ファイルの作成
・WordPressの設定
vim /usr/local/apache2/htdocs/wp/wp-config.php
---(下記を変更)---
↓
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('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 All
Apache を再起動
素の状態のWordPressであれば、HTTP/2+PHP7+MySQL5.7の環境で問題なく動作します。ただ、追加テーマや、プラグインのPHP7対応が気になるところですね。
終わりに
PHP7 は10年ぶりのメジャーバージョンアップ、HTTP/2 にいたっては、前バージョンの HTTP1.1 が規程されてから、なんと16年ぶりのバージョンアップになるそうです。どちらの技術も、非効率な実装を見直し、高速化を実現させています。これらミドルウエアの入替は、WEBアプリケーションに与える影響が大きいため、躊躇してしまいがちですが、今回のバージョンアップはそれ以上の恩恵を受けられると思います。新規のリリースや、サーバ入替のタイミングで、新しい技術の導入を検討してみてはいかがでしょうか。
コメント
[…] Apache HTTP/2+PHP7+MySQL5.7 インストールメモ […]
[…] Apache HTTP/2+PHP7+MySQL5.7 インストールメモ […]