株式会社ライブキャストロゴ 株式会社ライブキャスト

新年明けましておめでとうございます。
今年もよろしくお願いいたします。

ここ数年、ブログの更新が滞りがちなので、今年は新年のご挨拶もかねて、休み中に少しいじってみたnginxのエントリでスタートしたいと思います。

今回は、Amazon EC2でMicro Instanceを立ち上げ、nginxをセットアップしてWebサーバを立ち上げ、PHPが動く環境を構築したいと思います。

まずは、Micro Instanceを立ち上げたいと思います。

AWS Management Consoleのインターフェイスも日々改善されていて、以前に書いたInstance立ち上げのエントリとはずいぶん変わってますので、あらためてInstanceを立ち上げる部分から記載します。

過去のAWS関係のエントリはこちら。
Amazon EC2 | 株式会社ライブキャスト
Amazon S3 | 株式会社ライブキャスト
CloudFront | 株式会社ライブキャスト

Webサーバを立ち上げるまでの流れ

Instanceの立ち上げから、Webサーバをセットアップするまでの大まかな手順は、以下のような流れになります。

  1. Amazon EC2でMicro Instanceを立ち上げる。
    • AWS Management ConsoleにログインしてLaunch Instancesボタンをクリックする。
    • AMIを選択する。
    • Instanceタイプを選択する。
    • Instanceの詳細を設定する。
    • ストレージを設定する。
    • Instanceにタグを設定する。
    • Instanceを起動するセキュリティグループを設定する。
    • 設定内容を確認する。
    • キーペアを指定して、Instanceを起動する。
  2. nginxのセットアップ
    • nginxのインストール
  3. PHPのセットアップ
    • PHPのインストール
    • PHPの設定変更
    • nginxの設定を変更する。

それでは、この手順に従って進めていきたいと思います。

Micro Instanceを起動する

Instanceを起動します。AWS Management Consoleにログインして「EC2 Dashboard」の「Launch Instance」ボタンをクリックします。
※ 「Launch Instance」ボタンはAWS Management Consoleのいたるところにありますので、必ずしも「EC2 Dashboard」の「Launch Instance」でなくても構いません。



Step1.AMIを選択する

今回は「Quick Start」からAmazon Linux AMIを選択しました。Micro Instanceとして起動したいので、32-bitを選択して「select」ボタンをクリックします。



Step2.Instanceの種類を選択する。

Micro Instanceを選択します。



画面下部の「Next: Configure Instance Detail」ボタンをクリックして次に進みます。

Step3.Instanceの詳細を設定する

ここではInstanceを起動するにあたって、いくつかの設定することが可能です。



Shutdown Behaviorでは、シャットダウン時の振る舞いを設定することができます。

Specify the instance behavior when an OS-level shutdown is performed. Instances can be either terminated or stopped.

サーバ上でshutdownコマンドを実行した時にInstanceを終了(terminate)するか、停止(stop)するかを選択することができます。

今回は、手っ取り早くnginxでWebサーバをたてたいので、とりあえずデフォルトのまま進めたいと思います。
画面下部の「Next: Add Storage」ボタンをクリックして次に進みます。

Step4.Storageを追加する

キャプチャを見ると、このステップでのタイトルが「Add Storage」となっているので「追加する」としましたが、起動するInstanceのハードディスクの容量をいくつにするかを設定するようなイメージです。ですが、概念としてInstanceとEBS(ELASTIC BLOCK STORE)は別物なのでInstanceに付加するようなものだと思ってもらえれば良いと思います。

Instanceに付加するディスクの容量を指定できますが、とりあえず、デフォルトのまま8GBで進めます。



画面下部の「Next: Tag Instance」ボタンをクリックして次に進みます。

Step5.タグ名をつける

Instanceにタグ名をつけることができます。keyとvalueをペアで設定することができます。



用途によってわかりやすいタグをつければ良いと思いますが、今回は特に何も指定せずに進めます。
「Next: Configure Security Group」ボタンをクリックします。

Step6.Configure Security Group

Security Groupの設定をします。ここでは既存のSecurity Groupではなく新規でSecurity Groupを作成し、Firewallのルールを2つほど設定しました。

  • クライアントからsshで接続するためのルール
  • Webサイトにアクセスするためのルール



何か、Warningが表示されています。

Rules with source of 0.0.0.0/0 allow all IP addresses to access your instance. We recommend setting security group rules to allow access from known IP addresses only.

接続もとのIPアドレスは特定しておくことをお勧めします、とあります。

例えば、sshで接続する場合、すべてのクライアントからアクセス可能な状態より、接続可能なクライアントを特定しておいた方が比較的安全だよ、ということだと思いますが、プロトコルと環境にもよりますので、用途に応じて適切に設定するのが良いと思います。

「Review and Launch」ボタンをクリックして次に進みます。

Step7.Review Instance Launch

Instanceを起動する前の最終確認です。



ここでもWarningが出ています。

Improve your instance’s security. Your security group, launcher, is open to the world.

Your instance may be accessible from any IP address. We recommend that you update your security group rules to allow access from known IP addresses only.
You can also open additional ports in your security group to facilitate access to the application or service you’re running, e.g., HTTP (80) for web servers. Edit security groups

Step6と同様ですね。用途に応じて適切に設定しましょう。

「Launch」ボタンをクリックすると、


keypair選択ポップアップが表示されます。

I acknowledge that I have access to the selected private key file (xxx.pem), and that without this file, I won’t be able to log into my instance.

keypairファイルを使用してアクセスすることに同意して(チェックボックスを選択)、「Launch Instances」ボタンをクリックします。

しばらくするとMicro Instanceが立ち上がります。

nginxをセットアップする

続いて、nginxをインストールします。

[root@ip-10-132-8-99 ec2-user]# yum install nginx
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/latest | 2.1 kB 00:00
amzn-updates/latest | 2.3 kB 00:00
依存性の解決をしています
–> トランザクションの確認を実行しています。
—> パッケージ nginx.i686 1:1.4.2-1.12.amzn1 を インストール
–> 依存性の処理をしています: libGeoIP.so.1 のパッケージ: 1:nginx-1.4.2-1.12.amzn1.i686
–> 依存性の処理をしています: libgd.so.2 のパッケージ: 1:nginx-1.4.2-1.12.amzn1.i686
–> 依存性の処理をしています: GeoIP のパッケージ: 1:nginx-1.4.2-1.12.amzn1.i686
–> 依存性の処理をしています: libprofiler.so.0 のパッケージ: 1:nginx-1.4.2-1.12.amzn1.i686
–> 依存性の処理をしています: gd のパッケージ: 1:nginx-1.4.2-1.12.amzn1.i686
–> トランザクションの確認を実行しています。
—> パッケージ GeoIP.i686 0:1.4.8-1.5.amzn1 を インストール
—> パッケージ gd.i686 0:2.0.35-11.10.amzn1 を インストール
–> 依存性の処理をしています: libXpm.so.4 のパッケージ: gd-2.0.35-11.10.amzn1.i686
—> パッケージ gperftools-libs.i686 0:2.0-11.5.amzn1 を インストール
–> 依存性の処理をしています: libunwind.so.8 のパッケージ: gperftools-libs-2.0-11.5.amzn1.i686
–> トランザクションの確認を実行しています。
—> パッケージ libXpm.i686 0:3.5.10-2.9.amzn1 を インストール
—> パッケージ libunwind.i686 0:1.1-2.1.amzn1 を インストール
–> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
========================================================================================================================
インストール中:
nginx i686 1:1.4.2-1.12.amzn1 amzn-main 485 k
依存性関連でのインストールをします:
GeoIP i686 1.4.8-1.5.amzn1 amzn-main 780 k
gd i686 2.0.35-11.10.amzn1 amzn-main 150 k
gperftools-libs i686 2.0-11.5.amzn1 amzn-main 546 k
libXpm i686 3.5.10-2.9.amzn1 amzn-main 51 k
libunwind i686 1.1-2.1.amzn1 amzn-main 61 k

トランザクションの要約
========================================================================================================================
インストール 1 パッケージ (+5 個の依存関係のパッケージ)

総ダウンロード容量: 2.0 M
インストール容量: 4.6 M
Is this ok [y/d/N]:

インストールが完了したら、バージョンを確認してみます。

[root@ip-10-132-8-99 ec2-user]# nginx -v
nginx version: nginx/1.4.2

nginxを起動します。

[root@ip-10-132-8-99 ec2-user]# /etc/init.d/nginx start
nginx を起動中: [ OK ]

ブラウザでアクセスすると、nginxのデフォルトページが表示されました。



これで、nginxのインストールは完了です。

PHPのセットアップ

次に、PHPをインストールします。
PHPの他に、以下のパッケージもあわせてインストールします。

  • php-fpm
  • php-mbstring

※ nginxとPHP、php-fpmとの関係はこちらのサイトが参考になるかと思います。
さくらのVPS設定[9]-NginxでPHP-FPMを使う。 « cross HVN
Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合] | レンタルサーバー・自宅サーバー設定・構築のヒント

[root@ip-10-132-8-99 ec2-user]# yum install php php-fpm php-mbstring
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/latest | 2.1 kB 00:00
amzn-updates/latest | 2.3 kB 00:00
依存性の解決をしています
–> トランザクションの確認を実行しています。
—> パッケージ php.i686 0:5.3.27-1.0.amzn1 を インストール
–> 依存性の処理をしています: php-cli(x86-32) = 5.3.27-1.0.amzn1 のパッケージ: php-5.3.27-1.0.amzn1.i686
–> 依存性の処理をしています: php-common(x86-32) = 5.3.27-1.0.amzn1 のパッケージ: php-5.3.27-1.0.amzn1.i686
–> 依存性の処理をしています: httpd-mmn = 20051115 のパッケージ: php-5.3.27-1.0.amzn1.i686
–> 依存性の処理をしています: httpd のパッケージ: php-5.3.27-1.0.amzn1.i686
—> パッケージ php-fpm.i686 0:5.3.27-1.0.amzn1 を インストール
—> パッケージ php-mbstring.i686 0:5.3.27-1.0.amzn1 を インストール
–> トランザクションの確認を実行しています。
—> パッケージ httpd.i686 0:2.2.25-1.0.amzn1 を インストール
–> 依存性の処理をしています: httpd-tools = 2.2.25-1.0.amzn1 のパッケージ: httpd-2.2.25-1.0.amzn1.i686
–> 依存性の処理をしています: libapr-1.so.0 のパッケージ: httpd-2.2.25-1.0.amzn1.i686
–> 依存性の処理をしています: libaprutil-1.so.0 のパッケージ: httpd-2.2.25-1.0.amzn1.i686
–> 依存性の処理をしています: system-logos のパッケージ: httpd-2.2.25-1.0.amzn1.i686
–> 依存性の処理をしています: apr-util-ldap のパッケージ: httpd-2.2.25-1.0.amzn1.i686
—> パッケージ php-cli.i686 0:5.3.27-1.0.amzn1 を インストール
—> パッケージ php-common.i686 0:5.3.27-1.0.amzn1 を インストール
–> トランザクションの確認を実行しています。
—> パッケージ apr.i686 0:1.4.6-1.10.amzn1 を インストール
—> パッケージ apr-util.i686 0:1.4.1-4.14.amzn1 を インストール
—> パッケージ apr-util-ldap.i686 0:1.4.1-4.14.amzn1 を インストール
—> パッケージ generic-logos.noarch 0:17.0.0-2.5.amzn1 を インストール
—> パッケージ httpd-tools.i686 0:2.2.25-1.0.amzn1 を インストール
–> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
========================================================================================================================
インストール中:
php i686 5.3.27-1.0.amzn1 amzn-main 2.6 M
php-fpm i686 5.3.27-1.0.amzn1 amzn-main 1.3 M
php-mbstring i686 5.3.27-1.0.amzn1 amzn-main 2.3 M
依存性関連でのインストールをします:
apr i686 1.4.6-1.10.amzn1 amzn-main 109 k
apr-util i686 1.4.1-4.14.amzn1 amzn-main 84 k
apr-util-ldap i686 1.4.1-4.14.amzn1 amzn-main 17 k
generic-logos noarch 17.0.0-2.5.amzn1 amzn-main 589 k
httpd i686 2.2.25-1.0.amzn1 amzn-main 1.1 M
httpd-tools i686 2.2.25-1.0.amzn1 amzn-main 78 k
php-cli i686 5.3.27-1.0.amzn1 amzn-main 2.5 M
php-common i686 5.3.27-1.0.amzn1 amzn-main 1.0 M

トランザクションの要約
========================================================================================================================
インストール 3 パッケージ (+8 個の依存関係のパッケージ)

総ダウンロード容量: 12 M
インストール容量: 30 M
Is this ok [y/d/N]:

インストールが完了したら、バージョンを確認してみます。

[root@ip-10-132-8-99 ec2-user]# php -v
PHP 5.3.27 (cli) (built: Jul 12 2013 22:04:24)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

続いて、php-fpmのwww.confの設定を変更します。

[root@ip-10-132-8-99 etc]# emacs /etc/php-fpm.d/www.conf

まず、userとgroupをapacheからnginxに変更します。

●変更前

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user’s group
; will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

●変更後

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user’s group
; will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

2014年7月5日追記:以下の変更は/etc/php-fpm.d/www.confに対してではなく、/etc/nginx/nginx.confに対してのものでした。

コメントをはずして、location ~ .php$のブロックを有効にします。
fastcgi_paramのSCRIPT_FILENAMEを

/scripts$fastcgi_script_name;

$document_root$fastcgi_script_name;

に変更します。

●変更前

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ .php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

●変更後

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

※ こちらのサイトを参考にさせていただきました。
AmazonEC2 + nginx + php-fpm + mysql + WordPress | エンジニアの端くれブログ

php-fpmを立ち上げます。

[root@ip-10-132-8-99 etc]# /etc/rc.d/init.d/php-fpm start
php-fpm を起動中: [ OK ]

nginxも再起動します。

[root@ip-10-132-8-99 etc]# /etc/init.d/nginx restart
nginx を停止中: [ OK ]
nginx を起動中: [ OK ]

phpinfoを表示してみます。

<?php echo phpinfo(); ?>

その他の設定

サーバ起動時にnginxが自動的に立ち上がるようにする。

[root@ip-10-132-8-99 html]# chkconfig nginx on
[root@ip-10-132-8-99 html]# chkconfig –list nginx
nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off

サーバ起動時にphp-fpmが自動的に立ち上がるようにする。

[root@ip-10-132-8-99 html]# chkconfig php-fpm on
[root@ip-10-132-8-99 html]# chkconfig –list php-fpm
php-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off

サーバ上で動作するPHPのプログラムがsessionを使用する場合、nginxのsessionフォルダの所有者を変更しないと正しく動作しないので、

[root@ip-10-150-178-20 ec2-user]# cd /var/lib/php/
[root@ip-10-150-178-20 php]# ls -lv
合計 4
drwxrwx— 2 root apache 4096 7月 12 22:09 2013 session

所有者をapacheからnginxに変更します。

[root@ip-10-150-178-20 php]# chown root.nginx session
[root@ip-10-150-178-20 php]# ls -lv
合計 4
drwxrwx— 2 root nginx 4096 7月 12 22:09 2013 session

※ こちらのサイトを参考にさせていただきました。
nginxでPHPのセッション変数が効かない時は – console.lealog();

これでAmazon EC2のMicro Instance上のnginxでPHPが起動するようになりました。

今後、この環境をチューニングしていって、何かのWebサービスに利用できたら、と思います。

ちょっと長くなりましたが、新年最初のエントリは以上になります。
本年も、何卒、よろしくお願いいたします。