您的位置:首页 > 运维架构 > Nginx

NGINX----源码阅读一(main函数)

2016-12-18 16:11 876 查看
1、ngx_debug_init();

初始化debug函数,一般为空。

2、ngx_strerror_init();

将系统错误码+错误信息,以ngx_str_t数组保存。

3、ngx_get_options(int argc, char *const *argv)

nginx启动函数选项,

4、ngx_show_version_info();

如果上一步启动nginx输入量v选项,则显示nginx版本信息,

5、ngx_time_init();

初始化nginx系统时间。

如下

1 void
2 ngx_time_init(void)
3 {
4     ngx_cached_err_log_time.len = sizeof("1970/09/28 12:00:00") - 1;
5     ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1;
6     ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1;
7     ngx_cached_http_log_iso8601.len = sizeof("1970-09-28T12:00:00+06:00") - 1;
8     ngx_cached_syslog_time.len = sizeof("Sep 28 12:00:00") - 1;
9
10     ngx_cached_time = &cached_time[0];
11
12     ngx_time_update();
13 }


6.ngx_pid = ngx_getpid();

获取进程id,在进程文件process.c中,

#define ngx_getpid getpid

7、ngx_log_init(ngx_prefix);

初始化nginx日志,打开日志文件。ngx_prefix为文件路径,由nginx -p选项确定

nginx日志结构体如下

1 struct ngx_log_s {
2     ngx_uint_t           log_level;
3     ngx_open_file_t     *file;
4
5     ngx_atomic_uint_t    connection;
6
7     time_t               disk_full_time;
8
9     ngx_log_handler_pt   handler;
10     void                *data;
11
12     ngx_log_writer_pt    writer;
13     void                *wdata;
14
15     /*
16      * we declare "action" as "char *" because the actions are usually
17      * the static strings and in the "u_char *" case we have to override
18      * their types all the time
19      */
20
21     char                *action;
22
23     ngx_log_t           *next;
24 };


8.ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));初始化全局cycle

1     ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));
2     //初始化init_cycle的log
3     init_cycle.log = log;
4     ngx_cycle = &init_cycle;
5     //给init_cycle创建内存池
6     init_cycle.pool = ngx_create_pool(1024, log);


内存池结构入口

9、ngx_save_argv(&init_cycle, argc, argv)

保存启动参数,通过alloc函数分配空间。

10、ngx_process_options(&init_cycle)

将路径及配置路径写入cycle中

1         cycle->conf_prefix.len = len;
2         cycle->conf_prefix.data = p;
3         cycle->prefix.len = len;
4         cycle->prefix.data = p;


11、ngx_os_init(log) ngx_crc32_table_init()不懂

系统初始化

12、ngx_add_inherited_sockets(&init_cycle)

这个是重启时继承监听端口。不懂

13、ngx_preinit_modules()

初始化模块,index及name

1 ngx_int_t
2 ngx_preinit_modules(void)
3 {
4     ngx_uint_t  i;
5
6     for (i = 0; ngx_modules[i]; i++) {
7         ngx_modules[i]->index = i;
8         ngx_modules[i]->name = ngx_module_names[i];
9     }
10
11     ngx_modules_n = i;
12     ngx_max_module = ngx_modules_n + NGX_MAX_DYNAMIC_MODULES;
13
14     return NGX_OK;
15 }


View Code
14、ngx_init_cycle(&init_cycle)

这个函数做的事情比较多,开始先把原来init_cycle里的原始数据进行拷贝

然后创建并解析了核心模块的配置。这个单列出来说吧。

15.ngx_signal_process(cycle, ngx_signal);

如果ngx_signal模式启动nginx的话,nginx的启动准备工作到此就已经结束了

此步,采用非master-workers的启动模式,单进程启动nginx。

16.ngx_os_status(cycle->log);

17.ngx_init_signals(cycle->log);

18.ngx_create_pidfile(&ccf->pid, cycle->log);

19.ngx_master_process_cycle(cycle);

准备工作就绪,这里master就开始真正工作了。单列出来说下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: