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

STUDY プログラミング

独自に構築されたWebサーバの多くは、LAMPと呼ばれる構成で構築されています。LAMPとは、Linux、Apache、MySQL、PHPの頭文字を取ったもので、一般的に採用されることが多いLAMP環境です。

本記事では、CentOS+Apache+PHP+MySQLの組み合わせでLAMP環境を構築できるように、その構築手順を解説します。

(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のバージョンを以下コマンドから確認します。

 # httpd -v

CentOS7からyumでインストールした場合はApache2.4がインストールされていることが分かるはずです。また、OSの再起動時に自動でApacheも起動するように設定しておきます。

# systemctl enable httpd.service

OSを以下コマンドで再起動してみます。

# systemctl reboot

以下コマンドでApacheの起動状態を確認してみます。

# systemrctl status httpd.service

Apacheが起動していれば、自動起動設定は完了です。

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」に転送されることになります。

PHPのインストール

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

古いバージョンのPHPを関連ファイル含め先に削除します。

# yum remove php* -y

次に、PHP7を関連ファイル含めインストールします。

# 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

PHP7のバージョン情報が表示されればPHPのインストールは完了です。

PHPはモジュール版のほうが高速ですが、モジュールではなくCGIでPHPを動かす場合はサーバ負荷軽減のためにphp-fmを自動起動設定も忘れずに行ってください。(FPM)

#systemctl enable php-fpm

必要に応じてPHPの設定ファイルであるphp.iniを編集します。php.iniは/etc/php.iniにあります。タイムゾーンの変更やアップロードできるファイルサイズの上限などを設定できます。

httpd.confの編集

httpd.confを直接編集してもいいですが、設定内容の管理のしやすさから/etc/httpd/conf.d/内に設定ファイルを作成してhttpd.confにインクルードする方法がベストです。

インクルードする処理はデフォルトのhttpd.confに処理が書かれているので特に追記する必要はありません。/etc/httpd/conf.d/に基本設定ファイル00server.confおよびVirtualhost設定ファイルvirtual.confを作成しておきます。

Apacheのセキュリティ設定

Apacheをデフォルトの設定で運用するのはセキュリティ上よくありません。そのため、いくつかのセキュリティ対策を事前にしておく必要があります。

まず、/etc/httpd/conf.d/内にあるwelcome.confはApacheのバージョン情報などが記載されているため、もし見られてしまった場合、サーバのApacheのバージョンを知られてしまいます。welcome.confが表示された状態は安全ではないので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>

各行の意味はApacheの公式ドキュメント(core – Apache HTTP サーバ バージョン 2.4)を参照してください。

「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設定例

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

CentOS7にはMariaDBがプリインストールされています。今回はMySQLで運用するので、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行を最後に追加します。

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

文字コードはUnicode(utf8もしくはutf8mb4)で設定します。(文字コードについてはSlideShareのMySQLの文字コード事情 2017年版がわかりやすいです。)

skip-character-set-client-handshakeはクライアントからの要求にも設定した文字コードで返答する設定です。文字化けする場合はこの設定を忘れていることが原因となっていることが多いです。

最後に、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

ついでにunzipコマンドが使えるようにunzipをインストールしておきます。

# 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にアクセスできないようにセキュリティ対策をしておくことをおすすめします。

まとめ

LAMP環境を構築するのは、手間ではありますが手順通りに行えばだれでもできます。一方で、その後の運用はセキュリティ対策やサーバエラーのメンテナンスやサーバ負荷軽減など技術的な知識・経験が求められ、だれでもできるものではありません。

最近はレンタルサーバのスペックも充実してきており、小さく始めるのであればレンタルサーバを利用してサーバメンテナンスに使う時間をサービス開発に割いた方がいいと思います。サービスが大きくなってきてレンタルサーバのスペックが重要課題になってきてから、運用体制を整えた上で独自環境に移管するのが無難かと思います。