ここ最近、新規で 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 development
yum groupinstall network-tools
IUS リポジトリのインストール
Apache httpd 2.4.29 と PHP 7.2 は、新しめのパッケージがインストールできる IUSリポジトリ からインストールします。
IUSリポジトリが依存する EPELリポジトリをインストールします。
IUSリポジトリをインストールします。
Apache httpd 2.4.29 のインストール
HTTP/2 に対応している Apache httpd 2.4.29 をインストールします。
yum install httpd24u-mod_ssl
自己署名のSSLサーバー証明書の作成
HTTP/2 は事実上 HTTPS が必須になりますので Apache の設定の前に、SSLサーバー証明書を作成しておきます。
秘密鍵の作成(ECDSAの256ビット鍵を生成)
CSR(証明書署名要求)の作成(入力するのは2箇所だけです)
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年)
秘密鍵とSSL証明書を移動
mv -i server.crt /etc/pki/tls/certs/
パーミッションを変更
chmod 600 /etc/pki/tls/certs/server.crt
SELinux を有効にしている場合は、秘密鍵とSSL証明書にセキュリティコンテキストをつけておきましょう。(Apache 起動時にエラーが発生することがあります)
restorecon -v /etc/pki/tls/certs/server.crt
CSRを削除
Apache の HTTP/2 設定
vim /etc/httpd/conf/httpd.conf
ServerName のコメントを外してホスト名を指定します。
↓
ServerName www.example.com:80
ServerName の下あたりに(場所はどこでも構いません) HTTP/2 を有効にするための「Protocols h2 http/1.1」ディレクティブを追加します。このディレクティブはバーチャルホストブロックに書くこともできますので、サイトごとに HTTP/2 を有効にすることもできます。
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_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/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
↓
SSLCertificateKeyFile /etc/pki/tls/private/server.key
(関連記事)安全な SSL/TLS 設定にするための10のポイント(Apache httpd 2.4)
起動
自動起動設定
firewalld設定
HTTP(80/tcp) と HTTPS(443/tcp) を開けておきます。
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
・確認
firewall-cmd --list-all
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-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 = Off
;date.timezone =
↓
date.timezone = 'Asia/Tokyo'
・PHP-FPM を Apache と同じ実行ユーザ/グループで動作するように設定します。
vim /etc/php-fpm.d/www.conf
group = php-fpm
↓
user = apache
group = apache
PHP-FPM を起動し、Apache を再起動します。
systemctl restart httpd
PHP-FPM の自動起動設定
MySQL 5.7 のインストール
MySQLの yum リポジトリを追加
インストール
yum -y install mysql-community-server
MySQL 5.7 の設定
オリジナルのコンフィグをバックアップします
・コンフィグを作成します。
vim /etc/my.cnf
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
起動
自動起動設定
・root の初期パスワードの確認
grep password /var/log/mysqld.log
セキュリティ設定
これから設定するパスワードは、8文字以上、英数大文字小文字と記号が含まれていないとポリシー違反で弾かれてしまいます。オススメはしませんが PasswordValidationプラグインを外してポリシーを無効にすることもできます。
6.1.2.5 The Password Validation Plugin | MySQL 5.7 Reference Manual
mysql_secure_installation
対話式で設定が始まります。(不要なユーザやDBを削除してくれます)
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!
以上です。設定お疲れ様でした!
コメント
当方初心者の為、当サイトはすごく分かりやすくとても参考になりました。ありがとうございます。
いつもググリながらあれこれ試しているのですが、エラーに当たった時にはほとんど自己解決できず、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/*
先日はご返信頂きありがとうございました。
ご指示頂きました通り実行しましたところ、無事インストールすることができました。
お忙しい中、誠にありがとうございました。
やはり専門の方はほんとすごいです!!
これからもこちらのサイトでいろいろ勉強させて頂きます。
今後ともどうぞ宜しくお願い致します。