ec2でnginxを使ってみよう jaws大阪第9回勉強会資料

40
EC Nginx で でででででで

Upload: masahiro-haraoka

Post on 30-Jun-2015

2.066 views

Category:

Technology


3 download

DESCRIPTION

WEBサーバNginxに関する説明やapacheとの比較ベンチマーク、EC2での使用方法など

TRANSCRIPT

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

EC 2で Nginxを使ってみよう!

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

自己紹介

名前 原岡 昌寛 所属 株式会社ビヨンド     http://beyondjapan.com

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

仕事 インフラエンジニア 年齢  36 才  3 児の父 愛読書 少年ジャンプ 好きな食べ物 ハンバーグ カレー ラーメン

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

せっかちな人々

2009 年  Akamai 社の調査結果

Q1:WEB サイトの表示にどれぐらい時間がかかると「遅い」と感じるか?

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

Q2:WEB サイトの読み込みが何秒で終わることを期待するか?

A2:47% の消費者が「 2 秒」と回答。

2006 年の調査では 4 秒という判断であり、3 年でユーザーはかなりせっかちになっている。

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

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

Google ではページスピードが検索の 1% に影響している。

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

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

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

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

速いサイトはインフラにかかるコストを50% かそれ以上削減する。

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

つまり

速さこそが正義!… いい時代になったものだ

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

んじゃ速くしましょ

インフラ面で考えてみる

サーバ・ネットワークを増強 ⇒  お金がかかります

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

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

⇒  Nginxって速いらしいよ!?

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

ここまで、前振り。 で、本題です。

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

本日のアジェンダ

Nginx とは?

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

Apache との違い

PHP-FPM について

ベンチマーク!

まとめ

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

Nginx とは?1

「えんじんえっくす」と読みます。 名前が強そうです。

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

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

 なんかもある

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

Nginx とは?2

採用サービス

Facebook

Drop box

Hulu

Wikipedia

Git hub

pixiv

クックパッド

などなど多くの企業で使われています。

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

Nginx とは?3

Developer July 2013 PercentAugust 2013

Percent Change

Apache364,696,79

252.19%

336,622,050

46.96% -5.23

Microsoft137,351,21

119.65%

163,098,703

22.75% 3.10

nginx 95,017,255 13.60%104,311,56

814.55% 0.96

Google 27,406,059 3.92% 30,550,914 4.26% 0.34

Netcraft 社調査

WEB サーバのシェア

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

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

要件

サーバは EC 2 m1.medium

Amazon Linux

Nginx はソースインストール

PHP は PHP-FPM(Fast-CGI) で実行

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

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

php-fpm のインストール# yum install php php-devel php-fpm # chkconfig php-fpm on

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

php-fpm の起動# /etc/init.d/php-fpm start

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

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

Nginx のインストール

必要モジュールのインストール# yum install pcre pcre-devel openssl openssl-devel gcc

ユーザの追加# 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 --with-http_ssl_module --with-http_realip_module# make# make install

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

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

logrotate の設定 # vim /etc/logrotated/nginx

/var/log/nginx/*log {missingok

NotifemptySharedscriptsrotate 12WeeklyCompressPostrotatekill -USR1 `cat /var/run/nginx.pid`Endscript}

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

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

起動スクリプト# vim /etc/init.d/niginx

起動スクリプトのパーミッションの変更# chmod 755 /etc/init.d/niginx

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

Nginx の起動# /etc/init.d/nginx start

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

nginx.conf の要点 1

nginx.conf の要点 1

worker_processes 1;# CPU コア数に揃える

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

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

server_tokens off;#Apache の ServerTokens  と同じ

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

nginx.conf の要点 2

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

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

keepalive_timeout 0;#Apache の Keepalive と同じ (0= off)

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

nginx.conf の要点 3

location ~ \.php$ { 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 を使う設定

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

OS側もちょっと設定

nginx ユーザのファイルディスクリプタの上限を変更

  # vi /etc/security/limits.conf

  nginx soft nofile 4096

  nginx hard nofile 4096

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

  # vi /etc/sysctl.conf

  fs.file-max = 50000

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

とりあえず使ってみたい方は

yum も使えるよ♪

(リポジトリを準備して)# yum install –y php php-fpm

# yum install –y nginx

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

Apache との違い 1

.htaccess が使えない⇒   conf にベタ書きしか方法が。 ( 要再起動 )

mod_php が使えない⇒   fast-cgi を使って下さい。

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

Apache との違い 2

Rewrite の記述が変わる

Apache<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{HTTP_HOST} ^beyondjapan\.com$ [NC]

RewriteRule ^(.*)$ http://www.beyondjapan.com/$1 [R=301,L]

</IfModule>

⇓ あら簡単

Nginxserver {

server_name beyondjapan.com;

rewrite ^(.*)$ http://www.beyondjapan.com$1 ;

}

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

Apache との違い 3

Apache プロセスで処理( prefork の場合)※ worker もあ

る プロセス駆動アーキテクチャ リクエストが大量に来た際、プロセスが同時起動す

るのでオーバヘッドが大きくなるデメリット 重い処理は比較的得意

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

でプロセスがブロックされ処理能力が低下する

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

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

PHP-FPM( FastCGI)

FPM FastCGI Process Manager

PHP の FastCGI 実装のひとつ 高負荷のサイトで有用な追加機能がある (slowlog出力など )

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

プロトコル: FastCGI FastCGI はプロセスをメモリ上に永続化して使

いまわすことによって負荷を軽減する

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

PHP-FPMの独自機能(1)

slowlog を出力することができる N 秒以上かかるアクセスを検出 N 秒時点でのバックトレースも取れる

slowlog を出力する閾値 ( 秒 ) request_slowlog_timeout = 2

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

該当ファイルの、一番最初に N 秒を超えたものしかトレースしない。

※ 全てをトレースするわけではないもしかしたらやり方があるのかも。。。

  こんな感じでログ

が出力される

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

PHP-FPMの独自機能( 2)

使用していない子プロセスを自動的に削減する(メモリの節約)  micro インスタンスなんかにはよさそう  ・ pm = ondemand

  ・ pm.start_servers=1

しばらくアクセスが無いと、子プロセスがなくなる。

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

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

ベンチマーク環境

AWS EC2 (AmazonLinux) m1.medium + Wordpress

AWS RDS   db.m1.large

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

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

:20リクエスト回数 :50リクエスト回数 :100リクエスト回数 :200リクエスト回数 :400リクエスト回数

Apache 35 ミリ秒 36 ミリ秒 60 ミリ秒 122 ミリ秒 250 ミリ秒

Nginx 35 ミリ秒 37 ミリ秒 43 ミリ秒 40 ミリ秒 57 ミリ秒

リクエスト回数

:20

リクエスト回数

:50

リクエスト回数

:100

リクエスト回数

:200

リクエスト回数

:400

0 ミリ秒

50 ミリ秒

100 ミリ秒

150 ミリ秒

200 ミリ秒

250 ミリ秒

300 ミリ秒

ab 結果 静的コンテンツ

Apache Nginx

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

つまり

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

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

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

:20リクエスト回数 :50リクエスト回数 :100リクエスト回数 :200リクエスト回数 :400リクエスト回数

Apache 3005 ミリ秒 7344 ミリ秒 12718 ミリ秒 19524 ミリ秒 41889 ミリ秒

Nginx 3193 ミリ秒 6115 ミリ秒 9401 ミリ秒 17752 ミリ秒 48944 ミリ秒

リクエスト回数

:20

リクエスト回数

:50

リクエスト回数

:100

リクエスト回数

:200

リクエスト回数

:400

0 ミリ秒

10000 ミリ秒

20000 ミリ秒

30000 ミリ秒

40000 ミリ秒

50000 ミリ秒

60000 ミリ秒

ab 結果 動的コンテンツ

Apache Nginx

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

うーん・・

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

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

じゃあリソースは?

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

メモリ使用率 (動的コンテンツ 100同時アクセス × 500 回)

Nginx

Apache

Apache

Nginx

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

おお!

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

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

ベンチのまとめ

Nginx は静的コンテンツ爆速

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

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

けどリソース使用率は大幅に下がる

ってことは低スペックサーバでも結構動くはず

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

結論

これは使えるね!! micro,small でも結構動きます・・・

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

おまけでも Apacheも使い続けたいって人は

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

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

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

■Nginx側server {

listen 80;

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

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

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

画像サーバ的に使う

動的コンテンツは apache のまま、静的コンテンツはnginx を使用する

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

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

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

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

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