開発するならLAMP環境ぐらいはさくっと組めるようになっておいた方がいいよねって思ったので、CentOS、Apache、PHP、MySQLの組み合わせでLAMP環境を構築してみました。
サーバ環境構築はあまり得意ではないので、ひとまず独自ドメインのWebサイトを公開できる状態をゴールにしました。
サーバ構成
前提として、CentOSはインストールされているものとして、以下のバージョンでLAMP環境を組みます。
- CentOS7
- Apache2.4
- PHP7
- MySQL5.7
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
また、インストールしただけの状態ではOSを再起動したときに主導でApacheを起動しなければならないので、自動でApacheも起動するように自動起動の設定をしておきます。
# systemctl enable httpd.service
試しにOSを再起動してみます。
# systemctl reboot
再起動後、Apacheの起動状態を確認してみます。
# systemrctl status httpd.service
Apacheが起動しているメッセージが表示されれば自動起動設定は完了です。次にOSを再起動したときには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://www.example.com」に転送されます。SEO的なことも考えて、wwwの有無はどちらかにそろえておきます。
PHPのインストール
PHPのインストール時には、OPCacheとAPCuもセットでインストールするとPHPの実行を高速化できるらしいです。
調べてみると、OPCacheはPHPアクセラレータのことで、APCuはKVS(Key Value Store)形式でメモリ内にキャッシュする機能を持っているそうです。よくはわかりませんが、PHPインストール時にOPCacheと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を動かす場合はサーバ負荷がかかってしまいます。サーバ負荷軽減のためにCGIで動かすときはphp-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を削除します。welcome.confはApacheのバージョン情報などが記載されているため、もし見られてしまったときはサーバのApacheのバージョンを知られてしまいます。
# 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の設定
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を立てる場合はそれぞれ分けて書きます。ログファイルの蓄積場所の指定も行えます。
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
サーバ起動時にMySQLが自動起動されるように設定しておきます。
# 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)で設定します。
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
解凍したファイルは以下フォルダへ移動します。
# mv phpMyAdmin-4.6.6-all-languages /var/www/phpmyadmin
フォルダ名も変更しています。ドキュメントルートにはphpMyAdminは設置せず、エイリアスからアクセスできるように後ほど/etc/httpd/conf.d/phpmyadmin.confにエイリアス設定を記述します。
設定ファイルを作成し、ファイルのパーミッションを変更します。
# 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認証や接続IPアドレスの制限を導入するなどして簡単にphpMyAdminにアクセスできないようにセキュリティ対策をしておく必要があります。
感想
サーバ環境構築は自分には合わないなあと思ってしまいました。やはりフロントエンド側に興味が偏っているのがその理由なのかもしれません。
小規模なWebサービスをつくるぐらいであれば、レンタルサーバでさくっとやってしまった方が時間が節約できてまだいい気がします。サーバインフラのセキュリティのことまで頭が回らないですからね……。
レンタルサーバのスペックも昔より上がってきているようなので、コスパを考えればレンタルサーバでまだいいのかなと思います。