インフラSE日記

OSS、仮想化、金融工学、ゲーム、ときどきラーメン

nginxソースコードリーディング ver0.1

nginx起動

main()関数から読んでいきます。

エラーハンドリングのif文は重要なもの以外は省きます。

コメントは僕が書いたもので、実際のソースコードには書かれていません。

また、書きやすいように一部コードを変更することもありますが、

処理内容が変わらないように注意しています。

 

core/nginx.c

int ngx_cdecl

main(int argc, char *const *argv)

{

 変数宣言

 ︙

 ngx_strerror_init();

 ngx_get_options(argc, argv);

 if (ngx_show_version) {

  ngx_show_version_info();

 }

 ngx_time_init();

 ngx_pid = ngx_getpid();

 

}

 

とりあえずここまで。

最初は初期化処理が多いですね。

 

core/ngx_errono.c

エラーに関する初期化処理。

ngx_int_t

ngx_sterror_init(void)

{

 len = NGX_SYS_NERR * sizeof(ngx_str_t);

 ngx_sys_errlist = malloc(len);

 // エラー番号0からNGX_SYS_NERR-1までの文字列をngx_sys_errlistに格納

 for (err = 0; err < NGX_SYS_NERR; err++) {

  ︙

  msg = strerror(err);

  len =  ngx_strlen(msg);  //実際はただのstrlen(mgs)

  p = malloc(len);

  ngx_memcpy(p, msg, len); //実際はただのmemcpy(p, msg, len)

  ngx_sys_errlist[err].len = len;

  ngx_sys_errlist[err].data = p;

 } 

}

エラーメッセージのリストを作ってエラー番号0からエラー番号NGX_SYS_NERR-1に対応するエラーメッセージを格納しているだけですね。

簡単な処理ならわざわざソースコード書かなくてもいいかな…?

 

core/nginx.c

 

引数の処理。

static ngx_int_t

ngx_get_options(int argc, char *const *argv);

オプション(引数)の処理をしているだけなので省きます。

nginxってロングオプション(--versionみたいなやつ)に対応してないんですね。

 

core/ngx_times.c

 

時間に関する初期化処理です。

void

ngx_time_init(void)

{

 文字列の長さを格納

 ︙

 ngx_cached_time = &cached_time[0];

 ngx_time_update();
}

 

void

ngx_time_update(void)

{

 ① ngx_trylock(&ngx_time_lock);

 ② ngx_gettimeofday(&tv);

 ③ 各ログの時間をログの時間を表す構造体のデータに格納

}

 

① 時間処理を行うため、最初にロックをとっています。

② 現在の時刻を取得

 

って感じですかね。

最初は簡単ですね、これから難しくなる感じでしょうか。

 

 

そんな感じです。