軽量高機能webサーバーnginx
DESCRIPTION
2010/03/11 フラクタリスト技術知識共有会発表資料TRANSCRIPT
1
軽量高機能 web サーバーnginx
Takayuki Hirayama
Copyright 2010 Fractalist inc. All rights reserved.
2
概要nginx
「エンジンエックス」と読む軽量、高機能 web サーバー2010 年 2 月現在第 4 位のシェア採用実績
Wordpress ( http://wordpress.com/)GitHub ( http://github.com/ )SourceForge ( http://sourceforge.net/ )
Copyright 2010 Fractalist inc. All rights reserved.
出典: http://news.netcraft.com/
3
Apacheじゃダメなの?高機能=リソース消費
例:消費メモリApache
数十 KB ~ / プロセスリクエストの数だけプロセス発生( prefork の場合)
nginx数 KB ~ / プロセス1 ワーカーあたり複数リクエストを捌ける(一般的に CPU orCPU コア数 = ワーカー数)
C10K問題接続数 10K=10,000 というのが今後日常化していく
Ajax などの技術1 リクエスト 1 プロセス / スレッドモデルとかだと耐えられなくなる
特に、リバースプロキシーサーバーなどnginx の場合、 1 ワーカーで数千単位のリクエストを並列処理できる
Copyright 2010 Fractalist inc. All rights reserved.
4
多彩な機能
Copyright 2010 Fractalist inc. All rights reserved.
アクセス制御
認証
ロードバランシング
バーチャルホスト
HTTPプロキシ
Request Rewriting
FastCGI
Gzip圧縮フィルタ
リソース制限
ログフォーマットカスタマイズ
Server Side Include
memcached連携コンテンツキャッシュ
標準モジュール
追加モジュールHTTPS/
SSLサーバーステータスレポー
トコンテンツフィル
タWebDA
VFLVストリーミン
グ
PAM認証
MP4ストリーミング
WSGI
ZIP圧縮
サードパーティモジュール
5
リバースプロキシとして利用する
Copyright 2010 Fractalist inc. All rights reserved.
リバースプロキシ
192.168.0.1 192.168.0.2 192.168.0.3
http { upstream backend { server 192.168.0.1:8080; weight=20; # 2 倍バランス server 192.168.0.2:8080; weight=10; server 192.168.0.3:8080; weight=10; }
server { location 80; server_name example.jp; location / { proxy_pass http://app; } }}
6
アプリケーションサーバーとして利用する
拡張する方法はいくつかCGIFastCGIWSGI組み込み Perlモジュール( C 言語)
Copyright 2010 Fractalist inc. All rights reserved.
7
組み込み Perl
Copyright 2010 Fractalist inc. All rights reserved.
http { perl_modules /somewhere/lib; perl_require NginxTest;
server { location 80; server_name example.jp; location / { perl NginxTest::handler; } }}
package NginxTest;
use nginx;
sub handler { my $r = shift;
$r->send_http_header; $r->print("nginx by embedded perl");
return OK;}
1;
Apache mod_perlと遜色ない容易さで書ける設定ファイル Perlモジュール
8
組み込み Perlの弱点
Copyright 2010 Fractalist inc. All rights reserved.
処理がシングルスレッドになる!なので mod_perl と比べても優位性は少ない・・I/O ブロックなど発生する処理には向かない但し、 $r->sleep() で他リクエスト処理スレッドに yield することができる
package NginxTest;
use nginx;
sub handler { my $r = shift;
$a = rand(100);
$r->variable(randval => $a); $r->sleep(50 => \&send_response);
return OK;}
sub send_response { my $r = shift;
$r->send_http_header(‘text/plain’); $r->print(“hello, world!\n”);
return OK;}
1;
9
nginxモジュール( C言語)
Copyright 2010 Fractalist inc. All rights reserved.
長所nginx 本体の並列処理の機能に載っかれる専用ライブラリが整備されてる
Apache モジュールのようなリソースプールリスト、配列や正規表現、 mutex 排他制御などのライブラリが揃ってる
短所ドキュメントが少ない
Emiller's Guide To Nginx Module Development http://www.evanmiller.org/nginx-modules-guide.html
Apache のような DSO 構造ではないので、毎回本体と一緒にビルドする必要がある(意図的?)
10
まとめ
Copyright 2010 Fractalist inc. All rights reserved.
まとめApache 以外にも HTTP サーバーはいろいろあるよ特に最近は 1 スレッドで多数リクエスト捌く系のサーバーが大流行り( libeventなどイベントループを利用など)
その他最近の高速系サーバーVarnish
Squid の後継とも言われる高速リバースプロキシhttp://www.varnish-cache.org/
Starman高速 PSGI 互換 Web サーバーhttp://search.cpan.org/dist/Starman/