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番にアクセスすると...

f:id:kotaroito2002:20121114011549p:plain

設定ファイルは(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の理解が必要だなぁ。次回。