주말에 nginx 소스코드를 잘 살펴보려고 했는데, 결국 이틀 동안 게임을 하게 되었습니다.
아직 nginx 컴파일을 시작하지 않았고, cygwin도 설치되지 않았고, 미러도 강력하지 않습니다. http://blog.csdn.net/kenbinzhang/article/category/603177에서 nginx 시리즈에 대한 기사를 읽은 후 nginx 프로젝트 구조에 대한 일반적인 인상을 받았습니다.
int ngx_cdecl main(int argc, char *const *argv) { ngx_int_t i; ngx_log_t *log; ngx_cycle_t *cycle, init_cycle; ngx_core_conf_t *ccf; ngx_debug_init(); ngx_strerror_init(); ngx_get_options(argc, argv); // 解析程序参数,设置对应的全局变量 if (ngx_show_version) { // 输出nginx版本 if (ngx_show_help) { // 输出程序帮助 } if (ngx_show_configure) { // 输出nginx编译配置 } if (!ngx_test_config) { return 0; } } /* 计算了一下每种日期格式的字符串长度,并调用ngx_time_update。 每调用一次ngx_time_update,会更新一个日期字符串cache对应slot里面的日期字符 更新顺序为0~63 0~63 …… Question:它这个Cache有什么用?*/ ngx_time_init(); // TODO #if (NGX_PCRE) ngx_regex_init(); // 初始化正则表达式库 #endif ngx_pid = ngx_getpid(); /*初始化日志文件。ngx_prefix是在ngx_get_options函数中解析出来的, 如果没有制定-p参数,那么它就是NULL,此时,程序采用NGX_PREFIX作为日志存储目录。 */ log = ngx_log_init(ngx_prefix); /* STUB */ #if (NGX_OPENSSL) ngx_ssl_init(log); #endif ngx_memzero(&init_cycle, sizeof(ngx_cycle_t)); init_cycle.log = log; ngx_cycle = &init_cycle; init_cycle.pool = ngx_create_pool(1024, log); /*argc存到了ngx_argc变量中,argv存到了ngx_os_argv变量中、每个命令行参数 存到了ngx_argv变量中,ngx_os_environ记录了程序环境变量。*/ ngx_save_argv(&init_cycle, argc, argv); /*初始化了init_cycle中关于conf文件的一些配置*/ ngx_process_options(&init_cycle); /*获取操作系统信息。这个链接到的是ngx_win32_init.c中的函数。 这个函数里面调用了WSAStartup来初始化winsock。同时,这个函数里面还通过 WSAIoctl的SIO_GET_EXTENSION_FUNCTION_POINTER选项获取socket的扩展API*/ ngx_os_init(log); ngx_crc32_table_init(); // Question: 没看明白 ngx_add_inherited_sockets(&init_cycle); ngx_max_module = 0; // 网上说ngx_modules变量是在运行auto/configure脚本的时候生成的 for (i = 0; ngx_modules[i]; i++) { ngx_modules[i]->index = ngx_max_module++; } /* 这个函数有点长,粗略看了一下,包含初始化init_cycle中一些重要的成员 配置解析、配置文件解析等*/ cycle = ngx_init_cycle(&init_cycle); if (ngx_test_config) { return 0; } if (ngx_signal) { return ngx_signal_process(cycle, ngx_signal); } ngx_os_status(cycle->log); ngx_cycle = cycle; ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) { ngx_process = NGX_PROCESS_MASTER; } ngx_create_pidfile(&ccf->pid, cycle->log); ngx_log_redirect_stderr(cycle); if (log->file->fd != ngx_stderr) { if (ngx_close_file(log->file->fd) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, ngx_close_file_n " built-in log failed"); } } ngx_use_stderr = 0; if (ngx_process == NGX_PROCESS_SINGLE) { ngx_single_process_cycle(cycle); } else { ngx_master_process_cycle(cycle); } return 0; }
위의 내용을 포함하여 nginx 소스 code_win32 읽기를 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.