Starting Nginx
Nginxとは
Nginx is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption.
Unlike traditional servers, Nginx doesn't rely on threads to handle requests. Instead it uses a much more scalable event-driven (asynchronous) architecture. This architecture uses small, but more importantly, predictable amounts of memory under load.
from Nginx Wiki
高速で軽量なHTTPサーバ&リバースプロキシサーバ。Nginxはリクエスト処理をスレッドでなく、イベントドリブンな(非同期な)アーキテクチャで実現している。
という感じかな。
Getting Started on Mac OSX
まずは動かすことから。
$ brewinstall nginx
$ /usr/local/sbin/nginx
でok。
$ ps aux | grep nginx kotaroito 15036 0.0 0.0 2435964 752 ?? S 12:57AM 0:00.00 nginx: worker process kotaroito 15034 0.0 0.0 2435768 268 ?? Ss 12:57AM 0:00.00 nginx: master process nginx
プロセスはこんな感じ。 8080番にアクセスすると...
設定ファイルは(Mac OSXなら)
/usr/local/etc/nginx/nginx.conf
にある。
# ワーカープロセス数 worker_processes 1; events { # 1プロセスあたりの最大同時接続数 worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # Virtual Serverに関する設定を書く server { listen 8080; server_name localhost; # virtual host(apache同様に*も使える) # REQUEST_URIごとの設定 location / { root html; # rootディレクトリ index index.html index.htm; } # HTTPエラーステータスに対応するURIを指定 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
が初期で有効になっている設定である。
References
このあたりがよさそう。
アーキテクチャ
http://nginx.org/ja/から抜粋してみる。
- 一つのマスタープロセスと複数のワーカープロセス。ワーカーは非特権ユーザとして動く
- kqueue (FreeBSD 4.1+)、epoll (Linux 2.6+)、rt シグナルs (Linux 2.2.19+)、/dev/poll (Solaris 7 11/99+)、イベントポート (Solaris 10)、select、poll
- EV_CLEAR, EV_DISABLE (イベントを一時的に無効にする)、 NOTE_LOWAT, EV_EOF、利用可能なデータの数、エラーコードを含む様々な kqueue 機能のサポート
- sendfile (FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5)、sendfile64 (Linux 2.4.21+)、sendfilev (Solaris 8 7/01+) のサポート
- ファイル AIO (FreeBSD 4.3+, Linux 2.6.22+)
- Accept-filters (FreeBSD 4.1+) と TCP_DEFER_ACCEPT (Linux 2.4+) のサポート
- 1 万の非アクティブな HTTP キープアライブ接続は約 2.5M のメモリーを使用
同時接続してみる
クライアント
ワーカプロセスは10個で。
use strict; use warnings; use 5.010; use Parallel::Prefork; use Furl; my $pm = Parallel::Prefork->new({ max_workers => 10, trap_signals => { TERM => 'TERM', HUP => 'TERM', USR1 => undef, } }); my $furl = Furl->new( agent => 'Furl', timeout => 1 ); while ($pm->signal_received ne 'TERM') { $pm->start(sub { my $res = $furl->get('http://127.0.0.1:8080/'); say $res->status; }); } $pm->wait_all_children();
nginx
worker_process 1; events { worker_connections 4; }
でやってみると1割強のリクエストで500(Internal Server Error)になった。
worker_process 1; events { worker_connections 20; }
だと全て200が返ってくるようになった。クライアントの2倍のワーカ割当てしてるので、当たり前だけど^^
まとめ
NginxをMac OS Xで動かしてみて、configurationがちょっとだけわかった(気になった)。 次はどういうシーンに適用すべきなのという話になるんだけど、C10K Problemの理解が必要だなぁ。次回。