EC2でNginxを
使ってみよう!
 名前

原岡

昌寛

 所属

株式会社ビヨンド
http://beyondjapan.com

自己紹介

ホスティングとかクラウド構築・保守とかやって
ます。あとWEB系開発も。

 仕事

インフラエンジニア

 年齢

36才

 愛読書

3児の父

少年ジャンプ

 好きな食べ物

ハンバーグ

カレー

ラーメン
2009年 Akamai社の調査結果
 Q1:
WEBサイトの表示にどれぐらい時間がかかると
「遅い」と感じるか?

せっかちな
人々

 A1:
約半数のユーザーは、ページ表示の待ち時間が2秒
を超えるとイライラし始める。

 Q2:
WEBサイトの読み込みが何秒で終わることを期待
するか?
 A2:
47%の消費者が「2秒」と回答。

 2006年の調査では4秒という判断であり、
3年でユーザーはかなりせっかちになっている。
 Googleではページスピードが検索の1%に影響している。

 ユーザーがページ表示に待てるのは2秒まで。

数字で見る
ページ
スピード

 3秒以上かかると40%以上のユーザーは離脱する。

 表示が1秒遅れるごとにコンバージョン率は7%落ちる。

 表示が1秒遅れるごとに顧客満足度は16%落ちる。

 速いサイトはインフラにかかるコストを
50%かそれ以上削減する。
速さこそが正義!
…いい時代になったものだ
つまり
インフラ面で考えてみる
 サーバ・ネットワークを増強
 ⇒ お金がかかります

んじゃ
速くしましょ

 (OS、ミドルウェアの)チューニング
 ⇒ なかなか効果がでない場合も

 いっそWEBサーバを入れ替えてしまえ!!

⇒

Nginxって速いらしいよ!?
ここまで、
前振り。

で、本題です。
 Nginxとは?
 とりあえず、インストール

本日の
アジェンダ

 Apacheとの違い
 PHP-FPMについて
 ベンチマーク!
 まとめ
 「えんじんえっくす」と読みます。
 名前が強そうです。

 特徴

Nginxとは?
1







高い並列性
処理性能
メモリ使用量の少なさ
処理が軽い
大量リクエストの処理にも向いている

 他にも
 リバースプロキシ ※よく使われる
 メールプロキシ
 ロードバランサ

なんかもある
 採用サービス
 Facebook
 Drop box
 Hulu

Nginxとは?
2

 Wikipedia
 Git hub

 pixiv
 クックパッド
などなど多くの企業で使われています。
WEBサーバのシェア
Netcraft社調査

Nginxとは?
3

Developer
Apache

July 2013

Percent

August 2013

Percent

Change

364,696,792

52.19%

336,622,050

46.96%

-5.23

Microsoft

137,351,211

19.65%

163,098,703

22.75%

3.10

nginx

95,017,255

13.60%

104,311,568

14.55%

0.96

Google

27,406,059

3.92%

30,550,914

4.26%

0.34
要件
 サーバはEC2
 m1.medium
 Amazon Linux

とりあえず
インストール
1

 Nginxはソースインストール
 PHPはPHP-FPM(Fast-CGI)で実行
 php-fpmのインストール
# yum install php php-devel php-fpm
# chkconfig php-fpm on

とりあえず
インストール
2

 php-fpm の設定
# vim /etc/php-fpm.d/www.conf
# UnixSocketで通信
listen = /var/run/php-fpm/www.sock
user = nginx
group = nginx

 php-fpmの起動
# /etc/init.d/php-fpm start
Nginx のインストール
 必要モジュールのインストール
# yum install pcre pcre-devel openssl openssl-devel gcc

 ユーザの追加

とりあえず
インストール
3

# useradd –s /sbin/nologin –d /usr/local/nginx nginx

 ソースからのインストール
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.2.3.tar.gz
# tar zxvf nginx-1.2.3.tar.gz
# cd nginx-1.2.3
# ./configure --user=nginx --group=nginx --withhttp_ssl_module --with-http_realip_module
# make
# make install
 logrotateの設定
# vim /etc/logrotated/nginx
/var/log/nginx/*log {
missingok

とりあえず
インストール
4

Notifempty
Sharedscripts
rotate 12
Weekly
Compress
Postrotate
kill -USR1 `cat /var/run/nginx.pid`
Endscript
}
 起動スクリプト
# vim /etc/init.d/niginx

 起動スクリプトのパーミッションの変更

とりあえず
インストール
5

# chmod 755 /etc/init.d/niginx

 コンフィグ設定
# vim /usr/local/nginx/conf/nginx.conf

 Nginxの起動
# /etc/init.d/nginx start
nginx.confの要点1
 worker_processes 1;
# CPUコア数に揃える

 worker_rlimit_nofile 4096;

nginx.confの要
点1

#ファイルの同時オープン数(ApacheのServerLimit )

 worker_connections 4096;
# workerの同時接続数(ApacheのMaxClients)

 server_tokens off;
#ApacheのServerTokens と同じ
 sendfile

on;

#ファイル読み書きの効率化

 tcp_nopush

nginx.confの要
点2

# sendfile がonの時、パケットの効率化

 keepalive_timeout 0;
#ApacheのKeepaliveと同じ(0=off)
 location ~ .php$ {





nginx.confの要
点3

include /usr/local/nginx/conf/fastcgi_params;
fastcgi_pass unix:/tmp/php.socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
/var/www/vhosts/beyondjapan.com$fastcgi_script_
name;

}
 # fcgiを使う設定
 nginxユーザのファイルディスクリプタの上限
を変更
# vi /etc/security/limits.conf
nginx

OS側も
ちょっと設定

soft nofile 4096

nginx

hard nofile 4096

 システム全体のファイルディスクリプタの制限
をアップ

# vi /etc/sysctl.conf
fs.file-max = 50000
yumも使えるよ♪
とりあえず
使ってみたい
方は

(リポジトリを準備して)
# yum install –y php php-fpm
# yum install –y nginx
 .htaccess が使えない

Apacheとの
違い1

⇒ confにベタ書きしか方法が。(要再起動)

 mod_phpが使えない
⇒ fast-cgiを使って下さい。
 Rewriteの記述が変わる
 Apache
<IfModule mod_rewrite.c>

RewriteEngine on
RewriteCond %{HTTP_HOST} ^beyondjapan.com$ [NC]
RewriteRule ^(.*)$ http://www.beyondjapan.com/$1 [R=301,L]

Apacheとの
違い2

</IfModule>

⇓あら簡単
 Nginx
server {
server_name beyondjapan.com;
rewrite ^(.*)$ http://www.beyondjapan.com$1 ;
}
 Apache
 プロセスで処理(preforkの場合)※workerもある
 プロセス駆動アーキテクチャ
 リクエストが大量に来た際、プロセスが同時起動
するのでオーバヘッドが大きくなるデメリット
 重い処理は比較的得意

Apacheとの
違い3

 Nginx





スレッドで処理
イベント駆動アーキテクチャ
少ないプロセスでより多くのアクセスが捌ける
1つの処理時間が長くなる処理を実行した際、そこ
でプロセスがブロックされ処理能力が低下する

 つまり、大量アクセスにはNginx、
1処理が重いならApache
 FPM
 FastCGI Process Manager

 PHP の FastCGI 実装のひとつ

PHP-FPM
(FastCGI)

 高負荷のサイトで有用な追加機能がある
 (slowlog出力など)

 対応バージョン
 PHP 5.3.3からバンドル
 PHP 5.4.0 からPHP公式サポート

 プロトコル:FastCGI
 FastCGIはプロセスをメモリ上に永続化して使い
まわすことによって負荷を軽減する
 slowlogを出力することができる
 N秒以上かかるアクセスを検出
 N秒時点でのバックトレースも取れる
 slowlogを出力する閾値(秒)
 request_slowlog_timeout = 2

PHP-FPMの
独自機能
(1)

 slowlogの出力先
 slowlog = /var/log/php-fpm/www-slow.log

 該当ファイルの、一番最初にN秒を超えたもの
しかトレースしない。
※ 全てをトレースするわけではない
もしかしたらやり方があるのかも。。。

こんな感じでログ
が出力される
使用していない子プロセスを自動的に削減する

(メモリの節約)

PHP-FPMの
独自機能
(2)

microインスタンスなんかにはよさそう
・pm = ondemand
・pm.start_servers=1

しばらくアクセスが無いと、
子プロセスがなくなる。
 ベンチマーク環境

ベンチマーク
をとってみる

 AWS EC2 (AmazonLinux) m1.medium
+ Wordpress
 AWS RDS db.m1.large
リクエスト回数:2 0

リクエスト回数:5 0

リクエスト回数:1 0 0

リクエスト回数:2 0 0

リクエスト回数:4 0 0

A p a ch e

3 5 ミリ秒

3 6 ミリ秒

6 0 ミリ秒

1 2 2 ミリ秒

2 5 0 ミリ秒

N gi x
n

3 5 ミリ秒

3 7 ミリ秒

4 3 ミリ秒

4 0 ミリ秒

5 7 ミリ秒

ab結果 静的コンテンツ
300 ミリ秒

250 ミリ秒

200 ミリ秒

静的コンテンツ
ベンチマーク

150 ミリ秒

100 ミリ秒

50 ミリ秒

0 ミリ秒
リクエスト回数:20 リクエスト回数:50 リクエスト回数:100リクエスト回数:200リクエスト回数:400
Apache

Nginx
静的コンテンツは速い!!

つまり
リクエスト回数:2 0

リクエスト回数:5 0

リクエスト回数:1 0 0

リクエスト回数:2 0 0

リクエスト回数:4 0 0

A p a ch e

3 0 0 5 ミリ秒

7 3 4 4 ミリ秒

1 2 7 1 8 ミリ秒

1 9 5 2 4 ミリ秒

4 1 8 8 9 ミリ秒

N gi x
n

3 1 9 3 ミリ秒

6 1 1 5 ミリ秒

9 4 0 1 ミリ秒

1 7 7 5 2 ミリ秒

4 8 9 4 4 ミリ秒

ab結果 動的コンテンツ
60000 ミリ秒

50000 ミリ秒

40000 ミリ秒

動的コンテンツ
ベンチマーク

30000 ミリ秒

20000 ミリ秒

10000 ミリ秒

0 ミリ秒

Apache

Nginx
結果はいまいち
動的コンテンツはあんまり速くない?

うーん・・
ロードアベレージ (動的コンテンツ100同時アクセス× 500回)

Apache

Nginx

じゃあ
リソースは?

メモリ使用率

(動的コンテンツ100同時アクセス× 500回)

Apache
Nginx
軽いじゃないの!!
CPU、メモリ共に負荷が大幅に下がった!

おお!
 Nginxは静的コンテンツ爆速

 特に、大量アクセスだと俺のターン

ベンチの
まとめ

 動的コンテンツはそんなに速くない

 けどリソース使用率は大幅に下がる
 ってことは低スペックサーバでも結構動くはず
これは使えるね!!
micro,smallでも結構動きます・・・

結論
おまけ

でもApacheも使い続けたいって人は
リバースプロキシとして使う
Nginxをリーバスプロキシにして静的コンテンツをキャッシュし、Apacheをバックエ
ンドにして動的コンテンツを実行する方法があります。
下記最低限の設定です。実際に使う場合はもう少し設定あり

■Nginx側
server {
listen 80;

こんな方法
もあります
(1)

server_name beyondjapan.com;
# このサーバへの全てのアクセスを転送

location /var/www/html/wp-admin {
proxy_pass http://127.0.0.1:8080;}
}

■Apace側
Apacheのポートのlistenを変更
Listen 8080
NameVirtualHost 127.0.0.1:8080
<VirtualHost 127.0.0.1:8080>
ServerName hogehoge.com:8080
画像サーバ的に使う
 動的コンテンツはapacheのまま、静的コンテンツは
nginxを使用する

つまり画像ファイルだけ分離する

こんな方法
もあります
(2)

 ポート、サブドメイン、ドキュメントルートを設定して
server {
listen 8080;
server_name img.beyondjapan.com;
...
location / {
root /home/beyondjapan/www;
index index.php;
}
}

画像側はこんな感じでアクセス
http://img.beyondjapan.com:8080/aaaa.png
おわり

 ご清聴ありがとうございました

EC2でNginxを使ってみよう JAWS大阪第9回勉強会資料