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 Percent August 2013 Percent Change
Apache 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
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 = nginx
group = 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
Notifempty
Sharedscripts
rotate 12
Weekly
Compress
Postrotate
kill -USR1 `cat /var/run/nginx.pid`
Endscript
}
とりあえず
インストール
5
 起動スクリプト
# vim /etc/init.d/niginx
~長くて収まりませんでした。 m(_ _)m ~
 起動スクリプトのパーミッションの変更
# chmod 755 /etc/init.d/niginx
とりあえず
インストール
6
 コンフィグ設定
# vim /usr/local/nginx/conf/nginx.conf
~長くて収まりませんでした。 m(_ _)m ~
 Nginxの起動
# /etc/init.d/nginx start
とりあえず
インストール
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>
⇓あら簡単
 Nginx
server {
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
A pache 35 ミリ秒 36 ミリ秒 60 ミリ秒 122 ミリ秒 250 ミリ秒
N ginx 35 ミリ秒 37 ミリ秒 43 ミリ秒 40 ミリ秒 57 ミリ秒
0 ミリ秒
50 ミリ秒
100 ミリ秒
150 ミリ秒
200 ミリ秒
250 ミリ秒
300 ミリ秒
リクエスト回数:20 リクエスト回数:50 リクエスト回数:100リクエスト回数:200リクエスト回数:400
ab結果 静的コンテンツ
Apache Nginx
みんな大好き
ベンチマーク
リクエスト回数:20 リクエスト回数:50 リクエスト回数:100 リクエスト回数:200 リクエスト回数:400
A pache 3005 ミリ秒 7344 ミリ秒 12718 ミリ秒 19524 ミリ秒 41889 ミリ秒
N ginx 3193 ミリ秒 6115 ミリ秒 9401 ミリ秒 17752 ミリ秒 48944 ミリ秒
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
0 ミリ秒
10000 ミリ秒
20000 ミリ秒
30000 ミリ秒
40000 ミリ秒
50000 ミリ秒
60000 ミリ秒
ab結果 動的コンテンツ
Apache Nginx Nginx+php-fpm
リクエスト回数:20 リクエスト回数:50 リクエスト回数:100 リクエスト回数:200 リクエスト回数:400
A pache 3005 ミリ秒 7344 ミリ秒 12718 ミリ秒 19524 ミリ秒 41889 ミリ秒
N ginx 3193 ミリ秒 6115 ミリ秒 9401 ミリ秒 17752 ミリ秒 48944 ミリ秒
N ginx+ 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が動く)サーバ増やせ!
おわり  ご清聴ありがとうございました

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