mruby_nginx_moduleやngx_small_lightを開発していることもあってnginxのソースコードを読むことはよくあるんだけど、これまではほとんどの場合とある機能のバグっぽい挙動を追っかけたり、拡張モジュールを書くのに行き詰ってコアAPIの実装や公式のモジュールのソースコードを参照したりと必要に応じてその都度断片的に読んでいた。
逆にnginxの全体像やアーキテクチャについてはまぁ、マルチプロセスで動くとかイベント駆動アーキテクチャでノンブロッキング・非同期I/Oを駆使してるとかは知ってるし、実際にある程度読んだこともあるけど、がっつり読んだことがあるわけではないのでnginx内部でこれらの仕組みがどのように実現されているのかはざっくりとしか理解していなかった。なので今回はそのあたりを理解するためによりコアな部分のコードを読んでいこうと思う。
nginxソースコードリーディングをはじめるまえに
まずリーディング対象のnginxのバージョンだがこれは公式リポジトリのdefaultブランチ(Gitでいうmaster)を対象とする。日々ソースコードが更新されていくので、各エントリはそれを書いた時点のソースコードを元にする。なのでエントリを書くタイミングによって言及しているnginxのバージョンが更新されている場合がある。また、リーディング対象のnginxのコードはLinux用のものを利用する。
nginxのソースコードをダウンロード
nginxのソースコードは公式のMercurialリポジトリからcloneする。
hg clone http://hg.nginx.org/nginx/
リビジョン
5411:5483d9e77b32
使用するツール
Cで書かれた大規模なソースコードを読む上では最早必須とも言えるGNU GLOBALを使う。
cd nginx
gtags -v
nginxのソースコードレイアウト
nginxのソースコードにおける各コンポーネントのディレクトリ配置はこんな感じ。ほかにもあるけどここではWebサーバーとして重要な部分のみを取り上げる。
- core
- nginxのコア
- エントリポイント
- 文字列、メモリプール等の内部API
- event
- イベント駆動エンジン
- http
- HTTPサーバーエンジンおよび拡張モジュール群
- os
- クロスプラットフォームレイヤー
というわけでいつもみたいに必要な部分をボトムアップ的に読むのではなく、main関数からトップダウン的に読んでいこうと思う。
次回
nginxソースコードリーディング その1〜nginx起動〜