第2回勉強会資料 岩本(配布用)

Post on 20-Nov-2014

825 views 4 download

description

 

Transcript of 第2回勉強会資料 岩本(配布用)

Nginxのおはなし

いらちな現代人のためのWEBサーバ

とりあえず自己紹介

名前 岩本 貴久 所属 株式会社ビヨンド 生息地 おなか吹田市 仕事 セールスエンジニア

年齢  31歳

インテリアが大好き 「いわもん」と呼ばれたり呼ばれなかったり 好きな食べ物 パイナップル ラムネ 鶏肉 好きな観光地 自宅 (引きこもり )

いらちな人々

2009年  Akamai社の調査結果

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

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

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

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

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

サイトを高速化する理由

コンバージョン率の最適化

カスタマーエクスペリエンスとカスタマー満足度の向上

直帰率を下げる。

競争率が非常に激しいキーワードでオーガニックからのトラフィックを増やす。

全体的な競争力を高める。

運用費を節約する。

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

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

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

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

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

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

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

つまり 早いは正義!( ー `д ー ´) キリッ

じゃあ早くするよ

インフラ面で考えてみる

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

(ミドルウェアの )チューニング ⇒ 効果が薄い

根本的に早くするには、WEBサーバを入れ替えてしまえ!!

⇒ Nginxが早いらしい!!

(*´∀ ` *) ポワワ

ここまで、前振り。

で、本題です。

本当の戦いはこれからだっ!!

本日のアジェンダ

Nginxとは?

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

Apacheとの違い

ベンチマーク!

php-cgiを分離してみる

今日のまとめっ!

Nginxとは?1

「えんじんえっくす」と読みます。

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

他にも リバースプロキシ メールプロキシ ロードバランサ WAF

Nginxとは?2

採用サービス

クックパッド

サイバーエージェント

Wikipedia

Facebook

Hulu

DropBox

グルーポン

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 サーバのシェア

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

要件

Nginxはソースインストール

PHPは Fast-CGIで実行し、Nginx⇔PHP間は Fast-CGI+UnixSocketで通信する

とりあえずインストール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

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

Nginx のインストール

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

ユーザの追加# useradd –s /sbin/nologin –d /usr/local/nginx -M 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

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

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

/var/log/nginx/*log {missingok

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

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

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

~長くて収まりませんでした。 m(_ _)m ~

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

nginx.sh

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

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

~長くて収まりませんでした。 m(_ _)m ~

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

nginx.conf

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

nginx.confの要点 1

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

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

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

server_tokens off;#Apacheの ServerTokens と同じ

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

nginx.confの要点 2

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

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

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

とりあえずインストール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を使う設定

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

今まで内容を⇓

Ctrl +A :全選択⇓

Ctrl +C :コピー⇓

Ctrl +V :ペースト⇓

以上っ!ヽ (*´∀ ` ) ノ キャッホーイ !!

Apacheとの違い 1

.htacsess が使えない

mod_phpが使えない

Rewriteの記述が変わる

プロセス型とスレッド型

Apacheとの違い 2

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

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

Apacheとの違い 3

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 ;

}

Apacheとの違い 4

プロセス型とスレッド型

Apache プロセスで処理 プロセス駆動アーキテクチャ リクエストが大量に来た際、プロセスが同時起動するのでオーバヘッドが大きくなるデメリット

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

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

みんな大好きベンチマーク

ベンチマーク環境

AWS EC2 (AmazonLinux) + Wordpress

AWS RDS

みんな大好きベンチマーク

: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

みんな大好きベンチマーク

: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

php-cgiを分離してみる1

ベンチマーク環境

AWS EC2 (AmazonLinux) + Wordpress

AWS EC2   php-fpm用

AWS RDS 

php-cgiを分離してみる2

php-fpm ; listen = /var/run/php-fpm/www.sock listen = 0.0.0.0:9000

; listen.allowed_clients = 127.0.0.1 コメントアウト

Nginx #fastcgi_pass unix:/tmp/php.socket; fastcgi_pass 192.168.101.20:9000;

php-cgiを分離してみる3

リクエスト回数

:20

リクエスト回数

:50

リクエスト回数

:100

リクエスト回数

:200

リクエスト回数

:400

0 ミリ秒

10000 ミリ秒

20000 ミリ秒

30000 ミリ秒

40000 ミリ秒

50000 ミリ秒

60000 ミリ秒

ab 結果 動的コンテンツ

Apache Nginx Nginx+php-fpm

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

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

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

Nginx+php-fpm 1985 ミリ秒 4198 ミリ秒 9309 ミリ秒 25010 ミリ秒 41538 ミリ秒

php-cgiを分離してみる4

あれ・・・? ( ゚ д ゚ ) ポカーン

php-cgiを分離してみる5

理想 PHPとWEBを分けたから、倍の速度出るだろう

+ ( 0 ゚・∀・) + ワクテカ +

現実 1 台構成と大差ない (´Д`|||) ドヨーン

php-cgiを分離してみる5

この後、 Nginx+php-fpm 構成 x2 とNginx x1 + php-fpmx1 構成のベンチマークを考えていたけど 

割愛

本日のまとめっ!

Nginxは静的コンテンツ爆速

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

PHPプログラムを動かすには、別途 fcgiがいる

この fcgiをなんとかすればなんとかなる

ホントは、 Nginxと php-fpmを分離してヤッホイヽ ( ・∀・ ) ノ と書きたかった

早くするなら (phpが動く )サーバ増やせ!

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