CentOS7へPHP7+MySQL5.7+Apache2.4のインストール&設定

2017年の12月時点での最新のPHPをインストールしていきます。さくらクラウドでのCPU2コア、メモリ4GBでの作成です。

これから、PHP7.1とMySQL5.7とApache2.4をインストールをしていきます。普段は、ソースコードからコンパイルしてビルドしてとやっているのですが、今回はyumを使ってインストールをしてみたいと思います。
今回の初めての試みが、「epel」と「remi」というリポジトリを追加して、PHPをインストールしてみました。インストール作業自体はすぐに終わると思うので、少しepelやremiってなんぞやと言うところに触れてみたいと思います。

そもそもリポジトリとはなに?

Linuxのリポジトリとは、ソフトウェアやアプリケーションパッケージを管理しているマーケットです、
iPhoneのApp StoreやAndroidのGooglePlayをイメージするとわかりやすいかもです。

epelとremiって何?メリットは?

epelもremiもそれぞれのレポジトリを指すようです、2つともインストールしておく理由は、どちらかいいほうを取るためです。
epelにない場合はremiから、remiより最新のバージョンが使われている場合はepelからと言う保険的な感じらしいです。違ってたらごめんなさい。
そもそもCentOSには、公式のリポジトリが用意されていて、通常のyumコマンドで利用可能です、ですが、CentOSのリポジトリは、保守的で最新のソフトウェアやバージョンの更新が行われないので、CentOSにepelやremiというパッケージをインストールして、各リポジトリにある最新のソフトウェアを使おうということです。
実は、非公式なepelとremiリポジトリなんですが、epelのパッケージもremiのパッケージも公式のリポジトリからインストール出来るという点で少し安心して使っています。
例えで言うと、iPhoneで、AppStoreからGooglePlayをインストールして、Androidのアプリを使っちゃおうって感じです。

CentOSは保守的で、最新のソフトウェアやソースコードが反映されるの遅いので、
EPELとremiレポジトリの追加し、最新を使えるようにします。

[yonaha@adan ~]$ sudo yum install epel-release
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * epel: ftp.jaist.ac.jp
パッケージ epel-release-7-11.noarch はインストール済みか最新バージョンです
何もしません

ん!?入ってるぞ・・・さくらクラウドでは、デフォルトで入ってるらしいです。。。
続きまして、remiをインストール

[yonaha@adan ~]$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
http://rpms.famillecollet.com/enterprise/remi-release-7.rpm を取得中
警告: /var/tmp/rpm-tmp.exexDG: ヘッダー V4 DSA/SHA1 Signature、鍵 ID 00f97f56: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:remi-release-7.3-2.el7.remi      ################################# [100%]

上手く行ったっぽいです。

インストール後には、epelリポジトリを優先的に使うような設定が有効になっています。
なので、yum updateコマンドを実行すると公式パッケージがEPELリポジトリのパッケージで上書きされてしまいます、なにぶん非公式なものなので、必要なときにだけ、epelリポジトリを使うようにしましょう。

epelの無効設定は、設定ファイルを開いて、

[yonaha@adan ~]$ sudo vi /etc/yum.repos.d/epel.repo
[epel]の部分のenable=1を、enable=0 書き換えてるのみです。

remiの場合は、下記

[yonaha@adan ~]$ sudo vi /etc/yum.repos.d/remi.repo
[remi]の部分のenable=1を、enable=0 書き換えてるのみです。

それでは、本題のPHPとMySQLとApacheのインストール作業に進みたいと思います。

Apache(アパッチ)のインストール

Apacheは、公式サイトのバージョンが最新に近い状態であったので、公式サイトからのインストールを行います。

# yum install httpd

インストールを完了後に、Apacheのバージョンを表示させて、インストールの確認をしましょう。

# httpd -v

※インストール後にブラウザから確認できない場合はCentOS7のfirewalldの設定が必要かも♪
CentOS7のfirewalldにhttpとhttpsサービスを許可(Apacheへの外部からのアクセスを許可)する

MySQL5.7のインストール

MySQL開発元のOracleが公開しているyumリポジトリーを利用してインストールする

既存のMySQLとかは全部アンインストールしておく

# yum remove mysql* 

まずは、リポジトリの登録

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

インストールを開始

# yum install -y mysql-community-server

インストールにしばらく時間はかかりましたが。無事完了でございます。

# mysql --version
mysql  Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using  EditLine wrapper

MySQL起動する

# systemctl start mysqld.service

MySQL5.7は、初期パスワードがログに出力されるとのことなので、mysqld.logの中をgrepで検索

# grep password /var/log/mysqld.log

次に、mysql_secure_installationを使って初期設定をしていきましょう。対話形式でわかりやすので。

# /usr/bin/mysql_secure_installation
下記順番に聞かれます。※新しいルートのパスワードは、大文字、小文字、数字、記号の全てが入っている必要があるので注意
Enter password for user root: //さっきログに吐かれていた初期パスワードを入力
Set root password? //ルートのパスワード変更する? Yでパスワード設定
Remove anonymous users? //誰でもログイン出来る状態だけど消す? Yで消しとく
Disallow root login remotely? //リモートからrootログインを許可しませんか? Yでしない
Remove test database and access to it? //テストデータベース消すよ? Yで消す
Reload privilege tables now? //設定をすぐに反映するか? Yで反映
All done!

MySQLへログインする

# mysql -u root -p

MySQL 5.7 からユーザーのパスワードの有効期限がデフォルトで360日になりました。 360日するとパスワードの変更を促されてログインできなくなります。
なんと、MySQL5.7から360日後にパスワードの変更を促されログインできないようになってるらしい。
そんなありがた迷惑機能をOFFにしておきましょう。

# vi /etc/my.cnf
下記を追加(ついでにデフォルトの文字コードをUTF-8にしておく)
character-set-server=utf8
default_password_lifetime=0

その他諸々やっておいたほうがいい設定はありますが、とりあえずこんな所で。

MySQLの自動起動の設定もONにしておく

# systemctl enable mysqld.service

PHP7.1のインストール

11年ぶりのメジャーアップデートらしく、にわかに盛り上がっていますねぇ。php6は開発途中でダメになったらしいです。
聞くところによると、新バージョンのZendエンジンを搭載、PHP5.6に比べて2倍以上のパフォーマンス向上、メモリ使用量を削減し、
ソースファイルのパースに抽象構文木を採用、スカラー型宣言、戻り値の型宣言、null合体演算子の追加、などなど、
各種の改良と新機能を搭載したらしいが、よくわからんが良くなったらしい♪

つづいて、PHPがインストールされているかをチェックします

[yonaha@adan ~]$ rpm -qa | grep php

インストールされている場合は、

[yonaha@adan ~]$ yum remove php-* 

で、アンインストールしておきましよう。

また、libmcryptを入れておかないと、php-mcryptがインストールできないので、前もって入れておく。

[yonaha@adan ~]$ yum --enablerepo=epel install libmcrypt 

下記、お待ちかねのPHP7.1インストールです。

[yonaha@adan ~]$ sudo yum -y install --enablerepo=remi,remi-php70 php php-cli php-devel php-common php-mbstring php-mysql php-phpunit-PHPUnit php-pecl-xdebug php-fpm php-gd php-gmp php-mcrypt php-opcache php-pdo php-xml

・・・省略・・・
・・・省略・・・

完了しました!
[yonaha@adan ~]$ 

無事インストールできたか確認

[yonaha@adan ~]$ rpm -qa | grep php
php-cli-7.0.26-1.el7.remi.x86_64
php-mcrypt-7.0.26-1.el7.remi.x86_64
php-gd-7.0.26-1.el7.remi.x86_64
php-json-7.0.26-1.el7.remi.x86_64
php-7.0.26-1.el7.remi.x86_64
php-devel-7.0.26-1.el7.remi.x86_64
php-pdo-7.0.26-1.el7.remi.x86_64
php-xml-7.0.26-1.el7.remi.x86_64
php-common-7.0.26-1.el7.remi.x86_64
php-mbstring-7.0.26-1.el7.remi.x86_64

[yonaha@adan ~]$ php -v
PHP 7.0.26 (cli) (built: Nov 21 2017 15:12:20) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

あれ・・・!?7.0って、間違って、7.1をインストールするつもりが・・・
「あわてない、あわてない。」
下記コマンドを使って、PHPのバージョンを7.1にアップデートしましょう。

[yonaha@adan ~]$ sudo yum install -y --enablerepo=remi-php71 php
・・・
・・・
完了しました!

無事に7.1にアップデートできたか確認


[yonaha@adan ~]$ rpm -qa | grep php
php-json-7.1.12-2.el7.remi.x86_64
php-mcrypt-7.1.12-2.el7.remi.x86_64
php-xml-7.1.12-2.el7.remi.x86_64
php-common-7.1.12-2.el7.remi.x86_64
php-cli-7.1.12-2.el7.remi.x86_64
php-7.1.12-2.el7.remi.x86_64
php-gd-7.1.12-2.el7.remi.x86_64
php-pdo-7.1.12-2.el7.remi.x86_64
php-devel-7.1.12-2.el7.remi.x86_64
php-mbstring-7.1.12-2.el7.remi.x86_64

PHPのバージョンを確認

[yonaha@adan ~]$ php -v
PHP 7.1.12 (cli) (built: Nov 22 2017 08:25:12) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

よっしゃ!成功♪

PHP7.1のphp.iniの設定を変更しておく

[yonaha@adan ~]$ sudo vi /etc/php.ini
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_charset = none

Apacheの再起動をお忘れなく

# systemctl restart httpd.service