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


    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就开始真正工作了。单列出来说下。

  • 相关阅读:
    《疯狂的程序员》二
    《当程序员的那些狗日日子》五
    《疯狂的程序员》九
    《疯狂的程序员》一
    《疯狂的程序员》三
    和菜鸟一起学算法之递归和分治简单实例
    《疯狂的程序员》八
    《当程序员的那些狗日日子》四
    开放源代码软件利润高于专有代码
    少年黑客破解Google视频播放器
  • 原文地址:https://www.cnblogs.com/wangtengxiang/p/6194668.html
Copyright © 2020-2023  润新知