・サーバ構成

AmazonLinuxをOSとしてphpコンテンツ用のスタンドアロンサーバーを作ってみます。
DBとメール送受信を利用するプログラムが動作することを想定しています。

構成は以下の通り。
  • Tokyo リージョンを利用
  • EC2 micro (non-VPC)
  • AmazonLinux 32bit  (64bitより、使用メモリ量が少なくて済むハズ)
  • EIP を利用
  • DNS は DDNS を利用
ミドルウェアは以下のものを使用します。
  • Aapache 2.x~
  • php 5.3.x~ (5.3.x 以上であれば何でもOKのツモリ)
  • MySQL 5.x (基本的なSQLしか使わないので、バージョンは気にしない)
  • Postfix (バージョンは…気にしたことないです)


・セキュリティグループ作成
今回はセキュリティグループを複数利用したいので、先行して、GUIのインスタンス設定画面で以下のようなセキュリティグループを作成しておきます。
名前 = 解放ポート -- 許可するアクセス元
-------------------------------------------------
web = tcp 80,443 -- 0.0.0.0/0
mail = tcp 25 -- 0.0.0.0/0
ssh = tcp 22 -- 自宅のIP

※自宅に固定IPを持っていないなら 0.0.0.0/0 で...
セキュリティグループを用途ごとに分割しておけば、後で変更が容易になる…と想像しています(^^;


・EC2インスタンス作成
特に難しい手順は必要ないので、サクっと作成します。
作成時に、先ほど登録しておいた三つのセキュリティグループを指定するのを忘れないようします。
後から追加は出来ないので…。
EC2 micro のインスタンスが作成できたら、EIPを割り当てておきます。


・DynamicDNSを登録する
no-ip.biz というサービスを利用してDynamicDNSを登録します。
no-ip.biz でアカウント作成後、操作画面経由で適当なサプドメインを発行してもらい、AWS で作成した EIP のアドレスを登録しておきます。
しかし、無料サービスの範囲では A、MX レコードは登録できるものの TXT (SPF)レコードの登録は出来ないようです。
むむむ…。まぁ、メールが送れないわけではないので、TXT(SPF)は未設定のままでも良いでしょう。
A   = 【AWSのEIP】
MX = 【発行されたホスト名】.no-ip.biz
TXT =  無料版のno-ip.bizでは利用不能

・AWS EC2 へ ssh ログイン
no-ip.biz だと、登録と同時に使えるようになったので、さっそくその名前でsshログインしてみます。
ssh -l ec2-user  ~.no-ip.biz
特に困ることもなくログインできます。


・Linuxアカウントを設定する
今回は、別の開発者がAWSにsshログインする予定なので、そのユーザーのためのアカウントを作成します。
まず、アカウント名が重複しないように /etc/passwd を確認し、重複しないアカウント名を考えます。
ここでは、(ec2-user を真似て) dev-user という識別子のアカウントを作成します。
ec2-user$ sudo adduser dev-user

ec2-user$ sudo su - dev-user

dev-user$ pwd
/home/dev-user

dev-user$ groups
dev-user

dev-user$ exit
logout

adduserコマンドに対して何も応答が無いのが不気味ですが、一応 dev-user というアカウントは出来たようです。

ssh 経由で dev-user がログインできるように、ssh公開鍵を追加しておきます。
ec2-user$ sudo su - dev-user

dev-user$ ls
dev-user$ mkdir ~/.ssh
dev-user$ cd ~/.ssh
dev-user$ ls -la
total 8
drwxrwxr-x 2 dev-user dev-user 4096 Jul 31 09:58 .
drwx------ 3 dev-user dev-user 4096 Jul 31 09:58 ..

dev-user$ chmod og-w .
dev-user$ echo '【SSH公開鍵】' > authorized_keys
dev-user$ chmod og= authorized_keys
dev-user$ ls -la
total 12
drwxr-xr-x 2 dev-user dev-user 4096 Jul 31 09:59 .
drwx------ 3 dev-user dev-user 4096 Jul 31 09:58 ..
-rw------- 1 dev-user dev-user 231 Jul 31 09:59 authorized_keys

dev-user$ exit
logout
設定出来たら、ssh -l dev-user ~.no-ip.biz などとして、sshログインできることを確認しておいてください。


・ミドルウェアをインストールする
以下のコマンドでインストール済みパッケージをアップデートし、さらにインストール済みパッケージも確認しておきます。
yum update
yum list installed
基本的なパッケージしかインストールされていないようで、httpd, mta 等はリストにありませんでした。
とりあえず、ハッキリ必要だと判明しているパッケージをインストールします。
httpd.i686 : Apache HTTP Server
php.i686 : PHP scripting language for creating dynamic web sites
mysql.noarch : MySQL meta package
mysql-server.noarch : The MySQL server and related files
postfix.i686 : Postfix Mail Transport Agent
sudo yum install …で上記パッケージをインストールすれば、特に指定しなくても php-cli なども依存関係としてインストールされるようです…。
これで、以下のモノがインストールされました。
Apache2.2.25
php5.3.27
MySQL5.5.31 (server含む)
Postfix2.6.6
特に期待から外れるようなバージョンにはならなかったので、コレでOKということにします。


・そのほかのツール
なぜか telnet クライアントがインストールされていないので、コレをインストールしておきます。
sudo yum install telnet.i686
Apache の動作確認などで使うので… (curlでも困らないけど…)。


・Apacheの設定

AmazonLinuxでは、Apache用 httpd.conf は /etc/httpd/conf に配備されているようです。
早速確認して編集します。
…と思いましたが、それ以前に apache が起動されていないようです。起動して、動作確認しておきましょう。
$ sudo apachectl -k start
$ curl 'http://localhost/'
apachectl が無反応なのが気になりますが、一応、期待通りに起動しました。

まず、初期からインストールされている「ようこそ」のページを表示している ~/conf.d/welcome.conf を削除します。
$ cd /etc/httpd/conf.d/
$ sudo rm welcome.conf
次に、httpd.conf 内で用意されている DocumentRoot を消去します。単純に以下の部分を消去します。
DocumentRoot "/var/www/html"

<Directory />

</Directory>
名前ベースのVirtualHostを使用するため、NameVirtualHost タグを httpd.conf 内に設定します。
NameVirtualHost *:80

DocumentRoot の代わりに、VirtualHost 用の /etc/httpd/conf.d/virtualhost.conf ファイルを作成して、先頭にカラッポの VirtualHost を定義します。専用のDocumentRoot ディレクトリも作成しておきます。
$i sudo mkdir /var/www/default

$ cat /etc/httpd/conf.d/virtualhost.conf

<VirtualHost *:80>
ServerName example.com
ServerAdmin webmaster@example.com

DocumentRoot "/var/www/default"
<Directory />
Order deny,allow
deny from all
Options None
AllowOverride None
</Directory>

LogLevel info
CustomLog /dev/null combined
ErrorLog /dev/null
</VirtualHost>

# END of FILE #
この「最初のVirtualHost」がワーム等のアクセスを引き受けてくれるようになるので、ゴミのようなログが出なくて済むようになります。無駄なログが出力されてもよいのであれば、このVirtualHostは不要ですが…。


ここから実際に使用されるハズの VirtualHost を定義しますが、その前に ログフォーマットを規定します。httpd.conf に、以下のような設定を追記します。
LogFormat "%V\t%{%Y-%m-%d %H:%M:%S}t\t%h\t%u\t%r\t%>s\t%b\t%D\t%I\t%O\t%{Referer}i\t%{User-Agent}i\t%{HOST}i" tsvlog
このフォーマットは TAB 区切りにしているだけなので、別の形式が良いのなら、適当に変更ください。

で、作成したログフォーマットを使用して、 VirtualHost を作成します。先ほどの virtualhost.conf の末尾に、以下のような設定を追記します。
<VirtualHost *:80>
ServerName ~.no-ip.biz
ServerAdmin webmaster@~.no-ip.biz

LogLevel warn
CustomLog "| /usr/sbin/rotatelogs /var/log/httpd/~.acc.%Y-%m-%d 86400 +540" tsvlog
ErrorLog "| /usr/sbin/rotatelogs /var/log/httpd/~.err.%Y-%m-%d 86400 +540"

DocumentRoot /var/www/~
<Directory />
AllowOverride None
Options None
</Directory>

<Directory "/var/www/~">
AllowOverride None
Options None
</Directory>
</VirtualHost>
「~」の部分は、自分のホスト名に変更して使用ください。

これで apache を再起動すれば、~.no-ip.biz でアクセスすれば /var/www/~ を DocumentRoot とする 名前ベースのバーチャルホストにアクセスできます。Apacheの再起動は以下の通り。
$ sudo apachectl -k restart


あと、予備的に、httpd.conf で設定されている AddDefaultCharset UTF-8 も消しておきます。
主に php プログラムで利用するので、文字コードをphp側で明示的に指定させるためです。





ここまでで 名前ベースの VirtualHost を利用する Apache が設定できた……ツモリです。


次回は、php (mod_php)を設定します。