ec2でnginxを使ってみよう jaws大阪第9回勉強会資料
DESCRIPTION
WEBサーバNginxに関する説明やapacheとの比較ベンチマーク、EC2での使用方法などTRANSCRIPT
EC 2で 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
「えんじんえっくす」と読みます。 名前が強そうです。
特徴 高い並列性 処理性能 メモリ使用量の少なさ 処理が軽い 大量リクエストの処理にも向いている
他にも リバースプロキシ ※よく使われる メールプロキシ ロードバランサ
なんかもある
Nginx とは?2
採用サービス
Drop box
Hulu
Wikipedia
Git hub
pixiv
クックパッド
などなど多くの企業で使われています。
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
要件
サーバは EC 2 m1.medium
Amazon Linux
Nginx はソースインストール
PHP は PHP-FPM(Fast-CGI) で実行
とりあえずインストール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 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
起動スクリプトのパーミッションの変更# chmod 755 /etc/init.d/niginx
コンフィグ設定# vim /usr/local/nginx/conf/nginx.conf
Nginx の起動# /etc/init.d/nginx start
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 と同じ
nginx.conf の要点 2
sendfile on;# ファイル読み書きの効率化
tcp_nopush# sendfile が on の時、パケットの効率化
keepalive_timeout 0;#Apache の Keepalive と同じ (0= off)
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 を使う設定
OS側もちょっと設定
nginx ユーザのファイルディスクリプタの上限を変更
# vi /etc/security/limits.conf
nginx 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
Apache との違い 1
.htaccess が使えない⇒ conf にベタ書きしか方法が。 ( 要再起動 )
mod_php が使えない⇒ fast-cgi を使って下さい。
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 ;
}
Apache との違い 3
Apache プロセスで処理( prefork の場合)※ worker もあ
る プロセス駆動アーキテクチャ リクエストが大量に来た際、プロセスが同時起動す
るのでオーバヘッドが大きくなるデメリット 重い処理は比較的得意
Nginx スレッドで処理 イベント駆動アーキテクチャ 少ないプロセスでより多くのアクセスが捌ける 1 つの処理時間が長くなる処理を実行した際、そこ
でプロセスがブロックされ処理能力が低下する
つまり、大量アクセスには Nginx 、1 処理が重いなら Apache
PHP-FPM( FastCGI)
FPM FastCGI Process Manager
PHP の FastCGI 実装のひとつ 高負荷のサイトで有用な追加機能がある (slowlog出力など )
対応バージョン PHP 5.3.3 からバンドル PHP 5.4.0 から PHP公式サポート
プロトコル: FastCGI FastCGI はプロセスをメモリ上に永続化して使
いまわすことによって負荷を軽減する
PHP-FPMの独自機能(1)
slowlog を出力することができる N 秒以上かかるアクセスを検出 N 秒時点でのバックトレースも取れる
slowlog を出力する閾値 ( 秒 ) request_slowlog_timeout = 2
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
静的コンテンツベンチマーク
: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
うーん・・
結果はいまいち動的コンテンツはあんまり速くない?
じゃあリソースは?
ロードアベレージ (動的コンテンツ 100同時アクセス × 500回)
メモリ使用率 (動的コンテンツ 100同時アクセス × 500 回)
Nginx
Apache
Apache
Nginx
おお!
軽いじゃないの!!CPU 、メモリ共に負荷が大幅に下がった!
ベンチのまとめ
Nginx は静的コンテンツ爆速
特に、大量アクセスだと俺のターン
動的コンテンツはそんなに速くない
けどリソース使用率は大幅に下がる
ってことは低スペックサーバでも結構動くはず
結論
これは使えるね!! micro,small でも結構動きます・・・
おまけでも Apacheも使い続けたいって人は
こんな方法もあります(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
こんな方法もあります(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
おわり ご清聴ありがとうございました