CentOS7+Apache2.4+PHP7+MySQL5.7の構成でLAMP環境を構築する手順

LAMP環境をCentOS+Apache+PHP+MySQLという組み合わせで構築する手順を解説する。

(Note:バージョンはCentOS7+Apache2.4+PHP7+MySQL5.7の構成だが、セキュリティの関係上、適宜上位バージョンを検討すること。また、基本設定のみの解説として、詳細なセキュリティ設定は割愛した。CentOS7はインストール済みとして話を進める。)

EPELリポジトリとRemiリポジトリをインストール

まずは、EPELリポジトリとRemiリポジトリを追加して最新のソフトウェアやアプリケーションをイントールできるように準備を整える。EPELリポジトリとRemiリポジトリは以下のコマンドから追加する。(のバージョンを探してインストールすること)

#epelを追加
$ rpm -ivh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
#remiを追加
$ rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

-ivhはインストールを意味するコマンド。すでに古いRPMパッケージがインストールされている場合は新しいパッケージと入れ替えてRPMパッケージをアップデートするUvhを用いる。

Apacheのインストール

Apacheのインストールは以下コマンドから行う。

# yum install httpd

インストールできたら、Apacheのバージョンを確認する。CentOS7からyumでインストールした場合はApache2.4がインストールされていることがわかる。

 # httpd -v

OSの再起動時に自動でApacheも起動するように設定しておく。

# systemctl enable httpd.service

OSを再起動してみる。

# systemctl reboot

OSが再起動したらApacheの状態を確認する。

# systemrctl status httpd.service

起動していれば自動起動設定は完了となる。

DNSの設定

ドメインを取得していないのであれば先に取得しておく。基本的にはドメインを登録している業者(お名前.comなど)でDNSの設定を行う。外部IPアドレスに対してAレコードにドメイン名と外部IPアドレスを登録する。

例: example.com A 3600 xxx.xxx.xxx.xxx

サブドメインも使う場合は、サブドメインもAレコードに設定する。

例: info.example.com A 3600 xxx.xxx.xxx.xxx

また、CNAMEレコードには

例: www.example.com CNAME 3600 example.com

のように記述する。上の例では「https://www.example.com」にアクセスすると「https://example.com」に転送される。ネームサーバの設定をすればDNSの設定は完了となる。(お名前.comでは自動でネームサーバが設定される。)

PHPのインストール

PHPのインストールでは、OPCacheとAPCuもセットでインストールするとPHPの実行を高速化できる。OPCacheはPHPアクセラレータのこと。KVS(Key Value Store)形式でメモリ内にキャッシュするAPCuとセットで導入する。

# yum remove php* -y
# yum --enablerepo=remi,remi-php71 install php php-mysqlnd php-gd php-xml php-xmlrpc php-mbstring php-mcrypt php-fpm php-opcache php-apcu -y --skip-broken

PHPのインストールができたか確認のため、PHPのバージョンを表示させる。

# php -v

バージョン情報が表示されればPHPのインストールは完了になる。モジュールではなくCGIでPHPを動かす場合はサーバ負荷軽減のためにphp-fpmを自動起動設定も忘れずに行っておく。(FPM)

#systemctl enable php-fpm

必要に応じてPHPの設定ファイルであるphp.iniを編集する。php.iniは/etc/php.iniにある。タイムゾーンの変更などをしておくと捗る。

httpd.confの編集

httpd.confを直接編集してもいいが、設定内容の管理しやすさから/etc/httpd/conf.d/内に設定ファイルを作成してインクルードする。インクルードする処理はデフォルトのhttpd.confに処理が書かれているので特に追記する必要はない。/etc/httpd/conf.d/に基本設定ファイル00server.confおよびVirtualhost設定ファイルvirtual.confを作成しておく。

Apacheのセキュリティ設定

Apacheをデフォルトの設定で運用するのはセキュリティ上よくない。そのため、いくつかのセキュリティ設定を事前にしておく。

/etc/httpd/conf.d/内にあるwelcome.confはApacheのバージョン情報などが記載されたテストページを表示してしまう。これは安全ではないのでwelcome.confは削除する。

# rm /etc/httpd/conf.d/welcome.conf

CentOS7ではディレクティブ一覧表示をautoindex.confで制御している。デフォルトで使用する画像などのファイルが格納されているiconsフォルダの設定もautoindex.confに記述されている。運用上不要なのでautoindex.confも削除しておく。

# rm /etc/httpd/conf.d/autoindex.conf

Apacheの基本設定

Apache設定ファイルはhttpd.confが先に読み込まれ、httpd.conf内にincludeしている/etc/httpd/conf.d/内の*.confファイルの接頭文字が数字、アルファベットの順に読み込まれる。基本設定を記述する00server.confはconf.d内で最初に読み込まれるファイルになる。

/etc/httpd/conf.d/00server.confには、例えば以下の記述をする。

TimeOut 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
ServerName example.com:80
ServerTokens Prod
ServerSignature Off
TraceEnable Off
UseCanonicalName Off
AddDefaultCharset Off
HostnameLookups Off
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
  Options -Indexes +ExecCGI +FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>
<IfModule dir_module>
  DirectoryIndex index.html index.php index.cgi
</IfModule>

「Options -Indexes +ExecCGI +FollowSymLinks」の記述でマイナスを使った場合は、他の設定にはプラスが必要。プラスを付けなければエラーになる。「DirectoryIndex index.html index.php index.cgi」ではここに記述したファイル順にファイルが探されることを意味している。

Virtualhost設定

virtual.confを/etc/httpd/conf.d/に作成し、例えば以下の記述をする。

<VirtualHost *:80>
  ServerName example1.com
  DocumentRoot /var/www/html/example1.com/public_html
  <Directory "/var/www/html/example1.com/public_html">
    ~
  </Directory>
</VirtualHost>
<VirtualHost *:80>
  ServerName example2.com
  DocumentRoot /var/www/html/example2.com/public_html
  <Directory "/var/www/html/example2.com/public_html">
    ~
  </Directory>
</VirtualHost>

この設定をする前に各ドメインのDNS設定をVirtualHostを設定するサーバに変更しておく必要がある。複数ドメインのvirtualhostを立てる場合はそれぞれ分けて書く。このほかにログファイルの蓄積場所の指定などを行える。(Apache2.4 VirtualHost設定例

Apache2.4の設定については公式ドキュメントを参照すれば大体のことは解決する。(Apache2.4公式ドキュメント

MySQLのインストールと基本設定

CentOS7にはMariaDBがプリインストールされている。MySQLとの競合リスクを排除するためにMariaDBは削除する。

# yum remove mariadb-libs

MySQLをMySQL :: Download MySQL Yum Repositoryから探し、rpmファイルをインストールする。

# yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

安全のためにMySQLのバージョンが5.7であることを確認してからMySQLをインストールする。

# yum info mysql-community-server
# yum -y install mysql-community-server

インストールできたことを確認するために以下のコマンドを入力する。

# mysqld --version

MySQLの起動は以下のコマンドから行う。

# systemctl start mysqld.service

サーバ起動時の自動起動設定も忘れずにしておく。

# systemctl enable mysqld.service

次に、MySQLの初期設定を行う。MySQLのrootパスワードはインストール時に設定されているので、パスワードを確認し、ここで表示されるパスワードはメモする。

# cat /var/log/mysqld.log | grep root

MySQLの初期設定は以下のコマンドで始める。

# mysql_secure_installation

先ほどメモしておいたパスワードを入力して、rootパスワードの変更を行う。他にも匿名ユーザーの削除なども済ませておく。基本的にはすべての質問にYes(コマンドではy)で回答していく。

文字コードの設定を次に行う。/etc/my.cnfを開いて以下の4行を最後に追加する。文字コードの設定はUnicode(utf8もしくはutf8mb4)でいく。(文字コードについてはSlideShareのMySQLの文字コード事情 2017年版がわかりやすい。)

# vi /etc/my.cnf
character_set_server=utf8mb4
skip-character-set-client-handshake
explicit_defaults_for_timestamp = true
table_definition_cache  = 400

skip-character-set-client-handshakeはクライアントからの要求にも設定した文字コードで返答するようになる。(文字化けする場合はこの設定を忘れていることが多い。)/etc/my.cnfの設定例はWeb上にいくつも公開されているのでそれを参考に設定する。

最後に、MySQlを再起動して設定を反映させる。

# systemctl restart mysqld.service

先ほど設定した文字コードは以下コマンドで確認できる。

# mysql -u root -p
mysql> show variables like 'char%';

phpMyAdminの設定

MySQLにブラウザから接続して操作するツールのphpMyAdminをインストールし、MySQLにブラウザからアクセスできるようにする。

yumでインストールするとうまくインストールできないことが多い。そのため、通常はwgetを使って手動でインストールする。wgetコマンドをインストールしていないのであれば事前にインストールしておく。

# rpm -qa | grep wget
# yum install --downloadonly --downloaddir=/tmp wget

バージョンを確認する。(執筆時点では以下バージョン)

# rpm -ivh /tmp/wget-1.14-13.el7.x86_64.rpm

インストールされているかは以下コマンドで確認できる。

# rpm -qa | grep wget
# yum install unzip

次に、MySQLのバージョンを確認してMySQLのバージョンに対応するphpMyAdminをインストールする。以下はMySQL5.7に対応するバージョンである。

# wget https://files.phpmyadmin.net/phpMyAdmin/4.6.6/phpMyAdmin-4.6.6-all-languages.zip unzip phpMyAdmin-4.6.6-all-languages.zip

解凍したファイルは以下フォルダへ移動しておく。(フォルダ名も変更している。ドキュメントルートにはphpMyAdminは設置せず、エイリアスからアクセスできるように後ほど/etc/httpd/conf.d/phpmyadmin.confにエイリアス設定を記述する。)

# mv phpMyAdmin-4.6.6-all-languages /var/www/phpmyadmin

設定ファイルを作成し、ファイルのパーミッションを変更する。

# mv /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
# chmod 660 /var/www/phpmyadmin/config.inc.php

このconfig.inc.phpファイル内にあるblowfish_secretの部分にランダムな文字列を設定する。

# vi /var/www/phpmyadmin/config.inc.php
$cfg['blowfish_secret'] = 'ここにランダムな文字列を入力する';

また、以下から始まる記述がコメントアウトされているので、コメントアウトを外しておく。

/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
$cfg['Servers'][$i]['relation'] = 'pma_relation';
(略)

phpMyAdminの所有者をapacheに変更する。

# chown -R apache /var/www/phpmyadmin/
# chown -R apache.apache /var/www/phpmyadmin/

エイリアス設定をするために/etc/httpd/conf.d/phpmyadmin.conf以下の記述をする。

Alias /ここに任意のランダム文字列 /var/www/phpmyadmin/

AddDefaultCharset UTF-8
Require all granted

これでエイリアスのパスにアクセスすればphpMyAdminにはアクセスできるが、アクセスできない場合はSElinuxが有効化状態であることが原因となっていることが多い。以下コマンドでアクセスできるようになる。

restorecon - R /var/www/phpmyadmin/

phpMyAdminにrootでログインできたら、root権限を持つ新規ユーザーを作成して次回からはそのユーザでログインする。rootログインできないように以下の記述をconfig.inc.phpの最後の行に追記する。

$cfg['Servers'][$i]['AllowRoot'] = false;

Basic認証を導入するなどして簡単にphpMyAdminにアクセスできないようにセキュリティ対策をしておくとさらによい。