StoryEdit 開発日誌

ウェブアプリ StoryEditを作ってましたが延期。普通のブログ。

nginx、つれづれリーディング。

ウェブサーバの仕組みを知る為に、とりあえずnginxを読む。
だらだらと読みながらのログとなるので、解説と間違わないように。

nginx.c

main関数がある。
いろんな機能をinitしたあとに、init_cycleというのがある。どうやら、ここで、ウェブサーバの起動がありそう。cycleというのが何を指すのかはわからないが。

ngx_cycle.c

init_cycleの中でやってるのは基本的に、以下の流れ。

  1. poolの確保。そこから、cycleを確保。(init_cycleという構造体へ書き込まれる。)
  2. list_initというものを行う。(listが何かは不明)
  3. コンフィギュレーションファイル構造体?(conf_ctx)を確保
  4. hostnameを取得
  5. モジュールのコンフィギュレーション構造体を確保
  6. コンフィギュレーションファイルのパース(エラーチェック)
  7. モジュールのコンフィギュレーション初期化
  8. pidファイルを作る(後のデーモン化に備えて、最初の一回目はつくらないらしい)
  9. ファイルを作る(なんのため?)
  10. SharedMemを確保
  11. ソケットのハンドリングと書いてある部分。(なにしてるか不明)
  12. ngx_open_listening_sockets(cycle)で、ソケットを開く。
  13. 続く。(ngx_cycle.c: 573以降)

というわけで。ngx_open_listening_socketが怪しいので、こちらを読んでいく。
いきなり、TODOにぶつかったが、いわゆる、socket, setsockopt, bind, listenの流れを5回試みる。
再試行時に、ngx_msleepで、500ミリ待つようだ。この辺は経験則として参考になると思う。

さて。listening_socketsでは、cycleに持たせているlistening_socket (ls)を、開いて、
コネクトするようだ。既にCycleに持たせているソケットってのがなんなのかはわからない。まだ、Acceptしてないよね??? 初回起動時を区別する分岐が入っていたので、init_cycleは何度も使われる関数なのだろう。一回目の起動はきっと関係ないはず。
そして、init_cycleの処理は、引き続き、必要のないlistening socket, filesなどを閉じていく。

init_cycleをでて、mainに戻ろう。

cycleの初期化などが終わったら、deamonizeに入る。
そして、master_process_cycleか、single_process_cycleに入っていく。(どうやら、ここがacceptが入るべき場所のようだ)

この、masterとsingleは、プロセスが増えたときにどのみちとおるパスなのか、実行モデルの違いなのかは、定かではないが、とりあえずmasterのほうをのぞいてみよう。

ngx_process_cycle.c