「CentOS7、Apache2.4、PHP7、MySQL5.7」の構成でLAMP環境を構築する方法

開発するならLAMP環境ぐらいはさくっと組めるようになっておいた方がいいよねって思ったので、CentOS、Apache、PHP、MySQLの組み合わせでLAMP環境を構築してみました。

サーバ環境構築はあまり得意ではないので、ひとまず独自ドメインのWebサイトを公開できる状態をゴールにしました。

<h2>サーバ構成</h2>

前提として、CentOSはインストールされているものとして、以下のバージョンでLAMP環境を組みます。

<ul>
<li>CentOS7</li>
<li>Apache2.4</li>
<li>PHP7</li>
<li>MySQL5.7</li>
</ul>

<h2>EPELリポジトリとRemiリポジトリをインストール</h2>

まずはEPELリポジトリとRemiリポジトリをインストールします。

<pre>
#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
</pre>

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

<h2>Apacheのインストール</h2>

Apacheは次のコマンドでインストールします。

<pre>
# yum install httpd
</pre>

インストールできたら、Apacheのバージョンを確認します。

<pre>
 # httpd -v
</pre>

また、インストールしただけの状態ではOSを再起動したときに主導でApacheを起動しなければならないので、自動でApacheも起動するように自動起動の設定をしておきます。

<pre>
# systemctl enable httpd.service
</pre>

試しにOSを再起動してみます。

<pre>
# systemctl reboot
</pre>

再起動後、Apacheの起動状態を確認してみます。

<pre>
# systemrctl status httpd.service
</pre>

Apacheが起動しているメッセージが表示されれば自動起動設定は完了です。次にOSを再起動したときにはApacheも自動起動するようになっています。

<h2>DNSの設定</h2>

独自ドメインを組み立てたサーバで使う場合、事前に独自ドメインを登録している業者（お名前.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://www.example.com)」にアクセスすると「[https://www.example.com](https://www.example.com)」に転送されます。SEO的なことも考えて、wwwの有無はどちらかにそろえておきます。

<h2>PHPのインストール</h2>

PHPのインストール時には、OPCacheとAPCuもセットでインストールするとPHPの実行を高速化できるらしいです。

調べてみると、OPCacheはPHPアクセラレータのことで、APCuはKVS（Key Value Store）形式でメモリ内にキャッシュする機能を持っているそうです。よくはわかりませんが、PHPインストール時にOPCacheとAPCuを同時にインストールしているドキュメントが多いのでそれにならってインストールします。

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

<pre>
# yum remove php* -y
</pre>

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

<pre>
# 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
</pre>

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

<pre>
# php -v
</pre>

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

PHPはモジュール版のほうが高速ですが、モジュール版ではなくCGIでPHPを動かす場合はサーバ負荷がかかってしまいます。サーバ負荷軽減のためにCGIで動かすときはphp-fpmの自動起動設定を忘れないように行います。

<pre>
#systemctl enable php-fpm
</pre>

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

<h2>httpd.confの編集</h2>

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

インクルードする処理はデフォルトのhttpd.confに処理が書かれているので特に追記するないようです。

/etc/httpd/conf.d/に基本設定ファイル00server.confおよびVirtualhost設定ファイルvirtual.confを作成しておきます。

<h3>Apacheのセキュリティ設定</h3>

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

まず、/etc/httpd/conf.d/内にあるwelcome.confを削除します。welcome.confはApacheのバージョン情報などが記載されているため、もし見られてしまったときはサーバのApacheのバージョンを知られてしまいます。

<pre>
# rm /etc/httpd/conf.d/welcome.conf
</pre>

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

<pre>
# rm /etc/httpd/conf.d/autoindex.conf
</pre>

<h3>Apacheの基本設定</h3>

Apache設定ファイルはhttpd.confが先に読み込まれ、httpd.conf内にincludeしている/etc/httpd/conf.d/内の*.confファイルの接頭文字が数字、アルファベットの順に読み込まれます。

つまり、基本設定を記述する00server.confはconf.d内で最初に読み込まれるファイルになります。

/etc/httpd/conf.d/00server.confには、例えば次のような記述をします。

<pre>
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"
&lt;Directory "/var/www/html"&gt;
  Options -Indexes +ExecCGI +FollowSymLinks
  AllowOverride All
  Require all granted
&lt;/Directory&gt;
&lt;IfModule dir_module&gt;
  DirectoryIndex index.html index.php index.cgi
&lt;/IfModule&gt;
</pre>

各行の意味はApacheの公式ドキュメント(<a href="https://httpd.apache.org/docs/2.4/ja/mod/core.html" rel="noopener" target="_blank">core - Apache HTTP サーバ バージョン 2.4</a>)を参照すれば詳しく書いてあります。

ちなみに、「Options -Indexes +ExecCGI +FollowSymLinks」の記述でマイナスを使った場合は、他の設定にはプラスが必要です。プラスを付けなければエラーになります。

「DirectoryIndex index.html index.php index.cgi」ではここに記述したファイル順にファイルが探されることを意味しています。

<h3>Virtualhostの設定</h3>

VirtualHost設定で独自ドメインに関する設定をします。virtual.confを/etc/httpd/conf.d/につくって例えば次のようなことを書きます。

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

この設定をする前に各ドメインのDNS設定がVirtualHostを設定するサーバに変更されている状態にしておきます。

複数ドメインのvirtualhostを立てる場合はそれぞれ分けて書きます。ログファイルの蓄積場所の指定も行えます。

参照：<a href="https://httpd.apache.org/docs/2.4/ja/vhosts/examples.html" target="_blank" rel="noopener">Apache2.4 VirtualHost設定例</a>

<h2>MySQLのインストールと基本設定</h2>

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

<pre>
# yum remove mariadb-libs
</pre>

MySQLを<a href="https://dev.mysql.com/downloads/repo/yum/" target="_blank">MySQL :: Download MySQL Yum Repository</a>から探してrpmファイルをインストールします。

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

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

<pre>
# yum info mysql-community-server
# yum -y install mysql-community-server
</pre>

インストールできたことを確認します。

<pre>
# mysqld --version
</pre>

MySQLを起動します。

<pre>
# systemctl start mysqld.service
</pre>

サーバ起動時にMySQLが自動起動されるように設定しておきます。

<pre>
# systemctl enable mysqld.service
</pre>

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

<pre>
# cat /var/log/mysqld.log | grep root
</pre>

MySQLの初期設定は次のコマンドで始めます。

<pre>
# mysql_secure_installation
</pre>

事前にメモしておいたパスワードを入力して、rootパスワードの変更を行います。他にも匿名ユーザーの削除などもしておきます。基本的にはすべての質問にYes（コマンドではy）で回答していきます。

次に文字コードの設定を行います。/etc/my.cnfを開いて以下の4行を最後に追加します。

<pre>
# vi /etc/my.cnf
</pre>

<pre>
character_set_server=utf8mb4
skip-character-set-client-handshake
explicit_defaults_for_timestamp = true
table_definition_cache  = 400
</pre>


文字コードはUnicode（utf8もしくはutf8mb4）で設定します。

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

最後に、MySQlを再起動して設定を適用します。

<pre>
# systemctl restart mysqld.service
</pre>

設定した文字コードは次のコマンドで確認できます。

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

<h2>phpMyAdminの設定</h2>

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

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

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

バージョンを確認します。（執筆時点では以下バージョン）

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

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

<pre>
# rpm -qa | grep wget
</pre>

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

<pre>
# yum install unzip
</pre>

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

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

解凍したファイルは以下フォルダへ移動します。

<pre>
# mv phpMyAdmin-4.6.6-all-languages /var/www/phpmyadmin
</pre>

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

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

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

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

<pre>
# vi /var/www/phpmyadmin/config.inc.php
</pre>

<pre>
$cfg['blowfish_secret'] = 'ここにランダムな文字列を入力します';
</pre>

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

<pre>
/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
$cfg['Servers'][$i]['relation'] = 'pma_relation';
（略）
</pre>

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

<pre>
# chown -R apache /var/www/phpmyadmin/
# chown -R apache.apache /var/www/phpmyadmin/
</pre>

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

<pre>
Alias /ここに任意のランダム文字列 /var/www/phpmyadmin/
<Directory /var/www/phpmyadmin/>
AddDefaultCharset UTF-8
Require all granted
</Directory>
</pre>

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

<pre>
restorecon - R /var/www/phpmyadmin/
</pre>

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

<pre>
$cfg['Servers'][$i]['AllowRoot'] = false;
</pre>

Basic認証や接続IPアドレスの制限を導入するなどして簡単にphpMyAdminにアクセスできないようにセキュリティ対策をしておく必要があります。

<h2>感想</h2>

サーバ環境構築は自分には合わないなあと思ってしまいました。やはりフロントエンド側に興味が偏っているのがその理由なのかもしれません。

小規模なWebサービスをつくるぐらいであれば、レンタルサーバでさくっとやってしまった方が時間が節約できてまだいい気がします。サーバインフラのセキュリティのことまで頭が回らないですからね……。

レンタルサーバのスペックも昔より上がってきているようなので、コスパを考えればレンタルサーバでまだいいのかなと思います。