RubyOnRailsとPHPを各複数バージョンで同時テストが可能な開発環境をAWSで作る(その1：基本設定編)

# はじめに
## 動機
・RubyもPHPもバージョン差多すぎめんどくさい
・WebサーバはApacheばかり使ってたけどnginx使いたい。RubyもRaptor試してみたい
・設定する度に忘れてるから、毎度リセットしてる気がする。というかしてる、どうかしてる
## 目的
・RubyやPHP周りのバージョン差とかの検証をすぐにできる開発環境を整備する(とりあえずEC2で)
・サーバの初期設定やら何やらを記録しておく
## 完成形
EC2のmicro.t2に以下が乗った状態
・RHEL7
・nginx：1.6.2。PassengerやPHP-FPMへの振り分け
・Ruby：1.9.3-p551/2.0.0-p598/2.1.5をrbenvで切り替え
・Rails：3系/4系をアプリケーションごとに切り替え
・Passenger：5.0.0.beta1(Raptor)で、アプリケーションごとにRuby1.9系/2.0系/2.1系を切り替え
・PHP：5.3.29/5.4.35/5.5.19/5.6.3をphpenvで切り替え
・PHP-FPM：上記を同一ソースでドメインごとに切り替え
・MariaDB：5.5.40
## 想定読者
・EC2などでPHPやRubyOnRailsの開発用サーバを用意したい方
・LinuxサーバにSSHで繋いでコマンド叩いたりくらいはできる方
・物忘れの激しいWeb系の技術者(主に私)
## 記事内容
・ググったり推測したりで試してうまくいったら記録
・一応初期状態から上記の構成が完成するまでのほぼ全記録になるはず
・特別目新しいことがあるわけではない。たぶん
## お願い
・一応0から一式試したけど、バージョンなどによってはこの通りに行かないのでそのときはぐぐってください
・筆者はLinuxにあまり慣れているわけではありませんので、設定など、こうした方がいいというものがあったらご指摘ください
・~~コマンド打ってバージョン切り替えればいいじゃない~~まあそんなこといわずに
・~~Dockerでやれ~~そのため公開に迷ったのですが、導入コストが低いしせっかく書いたので載っけることにしました

この記事はその1：基本設定編です。
多くの人は読み飛ばしてしまっても構わない部分だと思います。
続きはその2：RubyOnRails編、その3：PHP編をご覧ください。

# EC2のローンチ

## インスタンスの立ち上げ
リージョンは特に理由がなければ東京にしておこう。EC2ダッシュボードの右上から選択可能だ。
AMIはとりあえずRHEL7。インスタンスはまずは実験なのでmicro.t2にした。期間限定だけど月750時間分まで無料だし、完成したら本運用するということで。テスト用の環境なのでこのまま継続でもいいかもしれない。
その他ストレージ(別途必要な場合)やセキュリティグループ(後で設定変更)を設定すれば完了。
完了時に、SSHの秘密鍵について尋ねられる。初回ならその画面で作ってしまおう。もちろん鍵はなくさないように。
とまあ、これだけでインスタンスが立ち上がる。

## ElasticIPの割り当て～SSH接続
SSHで接続する前にElasticIPを割り当てておく。EC2ダッシュボードの左側にメニューがあるので、そこからIPを1つ取得する。
なお、執筆時点では東京リージョンではインスタンスに1つだけ割り当てるElacticIPについては特に料金はかからないようだ。料金プランについては念のために調べておくとよいだろう。
ということで早速さっきのインスタンスにこのIPを割り当てる。別に割り当てなくても接続は可能なのだが、インスタンスを変えたり(ぶっ壊れて立ち上げ直した方が早くなったり)ドメインを割り当てたりするのに、固定IPを持っておくと何かと都合がいい。

SSHクライアントはPuTTYを使っているが、もちろん何でもよい。私は窓しかろくに使えない雑魚なものでして。
今作ったpemをPuTTYgenで開いてppkの鍵を用意しつつ、今割り当てたIPを指定して、生成した鍵を使ってSSHで接続する。
ユーザ名はec2-userがデフォルト、パスワードは不要だ。

# 基本設定
初期設定周りは[EC2インスタンス(Amazon Linux)の初期設定 ](http://www.agilegroup.co.jp/technote/ec2-initial-settings.html)を参考に、セキュリティ周りは[そこそこセキュアなlinuxサーバーを作る](http://qiita.com/cocu/items/e7c305ccffb6841d109c)を参考にした。ただしSELinuxはpermissiveにしてしまっている。
RHEL6から7でけっこういろいろ変わっているようである。

## ユーザ関係
ユーザ追加したりはお好みでどうぞ。まずはさくっとパスワードを設定してsuしてしまおう。

```
$ sudo passwd
$ sudo su
```

ec2-userはパスワード設定して、sudoはパスワードが必要なようにしておく。

```
# passwd ec2-user
# visudo -f /etc/sudoers
```

対応行を変更：

```
ec2-user ALL=(ALL) ALL
```

sudoするとパスワードが求められることを確認。

```
# su ec2-user
$ sudo su
[sudo] password for ec2-user:
```

おっけー。

## 開発環境なのでSELinuxはログに記録するだけにする
開発環境なので効率優先にする。
べ、別に不慣れの言い訳じゃないし(目をそらしながら)

```
vi /etc/sysconfig/selinux
```

以下に変更：

```
SELINUX=permissive
```

```
# setenforce 0
```

引っかかった場合はログに残るので、本運用時の参考にする。

## SSHの設定
何はなくとも。

```
# vi /etc/ssh/sshd_config
```

対応行を変更：

```
Port 3333
Protocol 2
```

ポートは他のサービスにかぶらないように適当に決める。

こっちは設定されていたので確認のみ：

```
PasswordAuthentication no
ChallengeResponseAuthentication no
```

ポートを変えたら、EC2のセキュリティグループも併せて変更しておこう。
あとsshdも再起動。
RHELではsystemctlコマンドでサービスの起動や終了などの制御をするようになったようだ。
詳しくは[RHEL 7 に採用される Systemctl コマンド](http://devnull.synergy-marketing.co.jp/2013/07/rhel7-systemctl/)を見るとよさそうだ。
サービス名の後の.serviceは省略可能らしいので省いていく。

```
# systemctl restart sshd
```

ここで、コンソールは即座に閉じずに、新たに接続することで接続確認をとるように。
そうしないと設定がミスっていたときに復旧できない。

サーバ名はお好みで変更。
cloud.cfgはAWSのインスタンス立ち上げ時に毎回反映されるものらしい。ec2-userのsudoについても言及があるが、何故かこちらは再起動しても変化がなかった。今度引っかかったら変えてみることにする。

```
# hostnamectl set-hostname drac-ec2 --static
# vi /etc/cloud/cloud.cfg
```

追加：

```
preserve_hostname: true
```

再接続するとホスト名が変わっている。

## タイムゾーンと時刻の設定

```
# yum -y install ntp
# timedatectl set-timezone Asia/Tokyo
# date
```

時刻がJSTになっていればOK。

NTPの自動起動とか設定とか。
設定は深く考えずに[Linux/UNIXサーバは立てたらまず時刻同期の設定](http://qiita.com/yuba/items/66d2d45a61b28737c098)をまるっと引用した。

```
# systemctl enable ntpd
# vi /etc/ntp.conf
```

以下に書き換え：

```
# 時刻の狂いがどんなに大きくても動作停止はしないが、300秒以上狂っていたらSLEWせず一気にあわせる
tinker panic 0 step 300

# 時刻の狂う傾向を統計して以下のファイルに記録する
driftfile /var/lib/ntp/drift

# サーバとしての動作は全面禁止
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery

# ただしローカルホストからのアクセスは許可
restrict 127.0.0.1
restrict -6 ::1

# NICTからのアクセス（返答パケット）を許可する
restrict 133.243.238.163 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.164 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.243 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.244 mask 255.255.255.255 nomodify notrap noquery

# 同期先はNICT
server ntp.nict.jp
```

書き換えたら再起動。少し間を置いたら動作確認。

```
# systemctl restart ntpd
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp-a2.nict.go. .NICT.           1 u   13   64    3    4.552    0.187   0.000
```

左側に*を確認。おっけー。

## 使いそうなパッケージのインストールとリポジトリの追加
とりあえずDevelopment Toolsをgroupinstallしてしまうのが手っ取り早い。後になって知った私はモグリ。
リポジトリはとりあえずRPMForgeとEPELとRemi足しておけばいいでしょう。
使いたい場合にenablerepo指定するなら普段はenable=0にしておいてもよい。
その辺は/etc/yum.repos.d/あたりにあるファイルを編集して調整。今回は特にしていない。

```
# yum -y groupinstall 'Development Tools'
# yum -y install wget
# cd /tmp
# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
# rpm -ivh rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
# wget https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
# rpm -ivh epel-release-7-2.noarch.rpm
# wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# rpm -ivh remi-release-7.rpm
```

これで準備は完了。
次はRailsのインストールから。