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

Linux
Linux
スポンサーリンク

ここ最近、新規で WEBサーバーをセットアップする時に「ミドルウェアは最新バージョンで!」とオーダーされることが多くなりました。ひと昔前は安定性を優先して十分に枯れたミドルウェア(Apache 1.3 など) を使うことがよくありましたが、最近では新しいバージョンでもそこそこ安定していますので、新機能や性能向上などのメリットがある最新版を使うのが正解なのかもしれません。そこで今回は、現時点(2018年2月7日)で最新の LAMP環境をインストールする手順をまとめてみました。

サーバーOS

サーバーOSは、CentOS 7.4 (1708) を最小構成でインストールしています。Apache を HTTP/2 に対応させるには、OpenSSL1.0.2 がサポートされている CentOS7.4以上であることが必要です。

CentOS7のダウンロードページ

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

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

yum groupinstall base
yum groupinstall development
yum groupinstall network-tools

IUS リポジトリのインストール

Apache httpd 2.4.29 と PHP 7.2 は、新しめのパッケージがインストールできる IUSリポジトリ からインストールします。

IUSリポジトリが依存する EPELリポジトリをインストールします。

yum install epel-release

IUSリポジトリをインストールします。

rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm

Apache httpd 2.4.29 のインストール

HTTP/2 に対応している Apache httpd 2.4.29 をインストールします。

yum install httpd24u-devel
yum install httpd24u-mod_ssl

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

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

HTTP/2 は事実上 HTTPS が必須になりますので Apache の設定の前に、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 起動時にエラーが発生することがあります)

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

CSRを削除

rm server.csr

Apache の HTTP/2 設定

vim /etc/httpd/conf/httpd.conf
ServerName のコメントを外してホスト名を指定します。

#ServerName www.example.com:80
 ↓
ServerName www.example.com:80

ServerName の下あたりに(場所はどこでも構いません) HTTP/2 を有効にするための「Protocols h2 http/1.1」ディレクティブを追加します。このディレクティブはバーチャルホストブロックに書くこともできますので、サイトごとに HTTP/2 を有効にすることもできます。

Protocols h2 http/1.1

Protocolsディレクティブ の初期値は「http/1.1」のため HTTP/2 が使われません。これを「h2 http/1.1」とすることで、WEBブラウザが対応していれば HTTP/2 を使い、対応していなければ HTTP/1.1 を使うようにできます。

動作モードを event MPM に変更

Apache バージョン 2.4.27 以降、prefork MPM で HTTP/2(mod_http2)を使うことはできません。Apache の動作モードを event MPM(もしくは worker MPM)に変更します。
vim /etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
 ↓
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
 
#LoadModule mpm_event_module modules/mod_mpm_event.so
 ↓
LoadModule mpm_event_module modules/mod_mpm_event.so

SSL/TLSの設定

先ほど作成した、証明書と秘密鍵を使うように設定します。
vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/pki/tls/certs/localhost.crt
 ↓
SSLCertificateFile /etc/pki/tls/certs/server.crt
 
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
 ↓
SSLCertificateKeyFile /etc/pki/tls/private/server.key

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

起動

systemctl start 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
(略)

PHP 7.2 のインストール

Apache の設定の都合上 prefork MPM が必須のモジュール版 PHP(mod_php)が使えませんので、PHP-FPM をインストールします。

yum install php72u-fpm-httpd
yum install php72u-devel
yum install php72u-pdo
yum install php72u-mysqlnd
yum install php72u-mbstring
yum install php72u-gd
yum install php72u-pecl-apcu-devel
yum install zlib-devel

PHP 7.2 の設定

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

expose_php = On
 ↓
expose_php = Off
 
;date.timezone =
 ↓
date.timezone = 'Asia/Tokyo'

・PHP-FPM を Apache と同じ実行ユーザ/グループで動作するように設定します。
vim /etc/php-fpm.d/www.conf

user = php-fpm
group = php-fpm
 ↓
user = apache
group = apache

PHP-FPM を起動し、Apache を再起動します。

systemctl start php-fpm
systemctl restart httpd

PHP-FPM の自動起動設定

systemctl enable php-fpm

MySQL 5.7 のインストール

MySQLの yum リポジトリを追加

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

インストール

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

MySQL 5.7 の設定

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

mv -i /etc/my.cnf /etc/my.cnf.org

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

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
 
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
 
log_timestamps=SYSTEM
explicit_defaults_for_timestamp=TRUE
skip-character-set-client-handshake
character-set-server=utf8

起動

systemctl start mysqld

自動起動設定

systemctl enable mysqld

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

2018-02-07T05:58:16.903086+09:00 1 [Note] A temporary password is generated for root@localhost: <初期パスワード>

セキュリティ設定

これから設定するパスワードは、8文字以上、英数大文字小文字と記号が含まれていないとポリシー違反で弾かれてしまいます。オススメはしませんが PasswordValidationプラグインを外してポリシーを無効にすることもできます。
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!

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

コメント

  1. ひろぽん より:

    当方初心者の為、当サイトはすごく分かりやすくとても参考になりました。ありがとうございます。
    いつもググリながらあれこれ試しているのですが、エラーに当たった時にはほとんど自己解決できず、OSを1から入れなおしてます・・・
    今回もVPSで記載されている手順でインストールしてみましたが、最後のmysqlでエラーが発生し、サービスをスタートできませんでした。試しに5/12の記事を見ながら、mysqlの8.0に変更して試してみましたが、症状は同じでした。
    my.cnfも何度も書き換えて試してみたのですが・・・。

    エラーの内容はsystemctlのstatusによると
    process 14248 ExecStart=/usr/bin/mysqld $MYSQLD_OPT(code=exited,status=1/FAILURE)

    http2やphpは快調に動き感激しており、mysqlだけなんとか解決できないものかと
    書き込みさせて頂きました。
    恐れ入りますがお時間ありましたら、アドバイス頂けますとと幸いです。

    • >ひろぽんさん
      コメントありがとうございます。

      もし可能でしたら、一度 MySQL のデータを削除してから起動してみてください。

      ・MySQLデータをバックアップ
      sudo cp -rip /var/lib/mysql /var/lib/mysql_KEEP

      ・MySQLデータを削除
      sudo rm -rf /var/lib/mysql/*

  2. ひろぽん より:

    先日はご返信頂きありがとうございました。
    ご指示頂きました通り実行しましたところ、無事インストールすることができました。
    お忙しい中、誠にありがとうございました。
    やはり専門の方はほんとすごいです!!
    これからもこちらのサイトでいろいろ勉強させて頂きます。
    今後ともどうぞ宜しくお願い致します。

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