Webサーバ

Webサーバは、DellのPowerEdge 860です。もちろん10万円未満で調達したものです。10万超えると、消耗品じゃなくなって減価償却必要になっちゃうからです。OSは、Debianのtestingです。Webサーバは３台存在し、LVSフロントからリクエストが振り分けられます。

httpdは、lighttpd 1.4.19です。mod_nicodhという、ニコニコ大百科専用のlighttpdモジュールを組み込んでいます。mod_nicodhは、C言語で簡単なアクセスハンドリングなどを行うモジュールです。ニコニコミュニティ掲示板の認証なども、mod_nicodhで処理します。

ニコニコ大百科は、ほとんどのコンテンツが静的になるように注意深く設計してあります。動的な要素が欲しい場合でも、Cookie/AJAXなどを用いてローカルで動的にページを生成できるようにします。たとえば、ニコニコ大百科の右メニューはログイン時・非ログイン時で表示が変わりますが、これはCookieの「login」という値を見てブラウザ側が動的に生成します。

静的なページは、ファイルとして保存されています。lighttpdは、そのファイルをそのまま返したり、gzip圧縮したりして返します。非常にシンプルで、かつパフォーマンスも悪くありません。

静的なページがファイルで保存されていなかったり、全体が動的なページがリクエストされたりした場合には、mod_nicodhで判定を行い、FastCGI経由でRubyに処理を渡します。FastCGIは、プロセスがWebサーバと分かれるのでハンドルしやすいです。ただ、プロセスが複数立ち上がるので、mmapなどをして論理空間・物理空間の浪費を防ぐ必要があります。

ニコニコ大百科はRubyを使って構築した、と言うと「Railsなんですね〜」とよく言われます。しかし、Railsは使っていません。ニコニコ大百科専用に、テキトーなフレームワークを書き起こしました。

FastCGIのハンドリング部分は、fcgiモジュールを使って書いています。また、Ruby標準のcgiモジュールは使わず、桑田誠さんがリライトしたcgi/cgiextモジュールを改造して使っています。テンプレートエンジンは、桑田誠さんのErubisを使っています。O/Rマッパは、テーブルごとに手で書いています。今であれば、FastCGIのハンドリング部分はRackを使いたいところですね。

ニコニコ大百科には、キーワードの自動リンク機能があります。以下のエントリにもあるように、Sennaは高速にキーワードの自動リンクを生成することができます。

キーワードリンクを行うRubyモジュールをC言語で書いて、利用しています。

静的なコンテンツで、キャッシュファイルが存在しない場合には、それを生成します。次回から、同じコンテンツに対するリクエストはlighttpdのみで処理されます。

Rubyを用いたのは、当時Rubyをほとんど使ってなかったので復習のために使いたかったのと、同僚にRubyが書ける人がいたからです。Rubyは遅いといわれますが、実用上困っていません。遅い部分は、C言語で書いたlighttpdのモジュールやRubyのモジュールが処理しているためです。むしろ、Hpricotのメモリリークや、libxml-rubyのメモリリークやバグや仕様変更、libmemcachedのRubyバインディングの挙動に悩まされました。今だったらNokogiri使えっていう話なんでしょうけど…

ちなみに、webサーバの種別は、Apache Baseball Armyにしてあります。