AWS EC2にLaravel用サーバーを構築する手順

2015年12月にEC2の最小構成であるt2.nanoが発表され、小規模なテストサーバーやスモールビジネスの立ち上げにも活用できるということで、Web+DBサーバー(俗に言うLAMP環境)の構築手順のまとめです。

ChefやPuppet、Ansibleなどの構成管理ツールを導入できない場合や、久しぶりに設定しようとすると設定漏れやコマンドを調べて思ったより時間が掛かるので。

PHP、Apache、MySQL構成なので、NginxやPostgreSQLなど他パッケージを使う場合はその項目を必要に応じて変更してください。

使用するディストリビューションはAmazon Linux AMI 2015.09、CentOSを使う場合は必要ない設定があったり、yumのパッケージが無かったりするので注意。この内容でPHPフレームワークのLaravelが1台で動きます(※2016年1月時点で最新バージョン5.2)。

作業は基本的にroot権限が必要なのでrootになるかsudoで実行してください。

初期設定

yumのパッケージを最新にしてサーバー時間を日本時間に変更。
日本時間以外の場合は /usr/share/zoneinfo 以下にある使用したいタイムゾーンのファイルを探して使います。

yum update -y
cp /usr/share/zoneinfo/Japan /etc/localtime

Amazon Linux AMIは6ヶ月毎に新しいバージョンがリリースされ、初期設定だと自動的に最新バージョンに上げられてしまうため現バージョンで固定したい場合はyum.confのreleasever行をコメントアウトします。

vi /etc/yum.conf
↓コメントアウト
#releasever=latest

Swap領域を作成

サイズの小さいインスタンスにはswap領域が含まれていない(c1.medium、m1.smallインスタンスには900MBのswapが付いてくる)のでMySQLの実行などメモリを喰う処理が落ちることがあります。

1GBほどswap領域を用意して認識させることで解決できます。

dd if=/dev/zero of=/swapfile1 bs=1M count=1024
chmod 600 /swapfile1
mkswap /swapfile1
swapon /swapfile1

Webサーバー(Apache2.4 with SSL)をインストール

Apache2.2系と2.4系では若干設定の書き方が違うので、他サーバーから持ってきても動かない場合があるので注意。

yum install -y httpd24 mod24_ssl

rm -f /etc/httpd/conf.d/welcome.conf
rm -f /var/www/error/noindex.html
service httpd start

グループ書き込み可能にする

デフォルトのままだとApacheが作ったファイルはApacheでしか編集できないため、同じファイルをターミナルで編集する場合やcron処理時にパーミッションの問題が発生します。

wwwというウェブ管理グループを作りユーザーとApacheを所属させ、グループとして管理させるようにしましょう。

httpdのumaskを変更することでApacheが作成したファイルとフォルダが自動的に0664(本人とグループが読み書き可能)となるため、Apacheが吐いたログファイルにcron処理時にログが書き込めずにエラー、ということが無くなります。

groupadd www
usermod -a -G www ec2-user
usermod -a -G www apache
chown -R root:www /var/www/html
chmod 2775 /var/www/html
echo "umask 002" >> /etc/sysconfig/httpd

MySQL5.5をインストール

yum install -y mysql55 mysql55-server

MySQL初期設定用コマンドを実行

インストール後に起動し初期設定用コマンドを実行します。
最初にrootパスワードを聞かれるので何も入力せずエンターを押し(インストール直後はパスワードが空)、その後いくつかされる[Y/n]形式の質問は全て「Y」で答えます。rootユーザーのパスワードを設定する項目ではYを入力した後に、新しく設定するパスワードを聞かれるので新パスワードを入力します。

設定、実行される項目は以下です。

  • rootユーザーのパスワードを設定
  • アノニマスユーザー削除
  • rootユーザーのリモートログインを禁止
  • テスト用データーベースを削除
  • 権限の読み込み
service mysqld start
mysql_secure_installation

PHP5.6のインストール

日本語操作、暗号化、キャッシュ、MySQL操作、画像処理、開発用ライブラリも同時にインストールします。

yum install -y php56 php56-mbstring php56-mcrypt php56-opcache php56-mysqlnd php56-gd php56-devel

php56と明示しない場合はPHP5.3がインストールされます。
同じくphp55でバージョン5.5がインストールできますが、現在の標準リポジトリでphp57はインストールできません。Laravel5.2の必要環境がPHP5.5.9以上なので5.6を入れます。

PHPからMySQLへの接続は、5年ほど前ならmysql、mysqli、PDO_MySQLといった拡張モジュールが利用されていましたが、PHP5.3.0から利用できるMySQLネイティブドライバ(mysqlnd)を利用することが強く推奨されているのでこちらを利用。機能もネイティブドライバの方が上です。

php.iniにtimezoneを設定

date.timezoneのコメントアウトを外し日本に設定します。
そのままだと日付関係の関数を呼び出した時に警告が出て正しい時刻が取得できません。

vi /etc/php.ini
date.timezone = "Asia/Tokyo"

その他のパッケージインストール

Composer

PHP用パッケージ依存解決マネージャー、Laravelを使うなら必須です。

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

公式サイトにある上記のインストール方法で問題は無いものの、Amazon Linuxのrootには /usr/local/bin へのパスが通っていないため、rootユーザー時は絶対パスで指定しなければ実行できないので注意してください(composer self-update時など)。

gitのインストール

yum install -y git

まとめ

Amazon LinuxはRedHat系のディストリビューションなので、CentoOSには無いawsコマンドが最初からインストールされていたり、yumの設定にreleaseverが追加されていたりと細かい違いはありますが、CentoOSを使ったことがあれば特に違和感なく利用できます。

CentOs7でもRemiリポジトリを利用しなければPHP5.6はインストール出来ないので、EC2を使う場合は特に理由が無ければAmazon Linuxを使えばいいでしょう。

今まで最小構成がt2.micro(1ヶ月で約2,000円)だったものが、t2.nano(1ヶ月で約900円)という構成が追加されたおかげで、費用的な問題でさくらVPS(月980円)などを利用していたケースでもEC2が選択肢に入ってくるようになったのではないかと思います。個人利用でも手を出しやすくなりました。

PaaSやBaaSの利用も増えていますが、まだまだEC2の利用価値は高そうです。