Nginx main 函数主要执行内容

86 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

main 函数工作主体

  1. ngx_int_t ngx_strerror_init(void); // 初始化nginx中定义的错误,初始化 ngx_sys_errlist.

    - ngx_sys_errlist: 是一个ngx_str_t 结构体数组,每一个 ngx_str_t 中存储了错误的信息,例如:ngx 1 号错误可以通过 ngx_sys_errlist[1] 来获取具体的错误信息

  1. static ngx_int_t ngx_get_options(int argc, char *const *argv); // 解析 nginx 后面跟的命令参数,例如:nginx -v

    其主要实现过程是:遍历每一个参数,并用switch case去解析参数中的具体内容


static ngx_int_t

ngx_get_options(int argc, char *const *argv)

{

    u_char     *p;

    ngx_int_t   i;

    for (i = 1; i < argc; i++) { // 解析所有的参数

        p = (u_char *) argv[i]; //

  


        if (*p++ != '-') {

            ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);

            return NGX_ERROR;

        }

        while (*p) {

            switch (*p++) {

  


            case '?':

            case 'h':

                ngx_show_version = 1;

                ngx_show_help = 1;

                break;

            }

        }

    }

}

  1. void ngx_time_init(void);// 初始化 nginx 运行时间

  2. ngx_log_t *ngx_log_init(u_char *prefix); // 初始化日志                

    主进程启动的时候,此时还没有读取配置文件,即没有指定日志打印在哪里。nginx这时候虽然可以将一些出错内容或者结果输到标准输出,但是如果要记录一些系统初始化情况,

socket监听状况,还是需要写到日志文件中去的。在nginx的main函数中,首先会调用ngx_log_init 函数,默认日志文件为:安装路径/logs/error.log,如果这个文件没有权限访问的话,

会直接报错退出。在mian函数结尾处,在ngx_master_process_cycle函数调用之前,会close掉这个日志文件。

  1. static ngx_int_t ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv); 保存参数
  1. static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); 调用ngx_process_options()初始化ngx_cycle的prefix, conf_prefix, conf_file, conf_param等字段;
  1. ngx_int_t ngx_os_init(ngx_log_t *log)  //调用ngx_os_init()初始化系统相关变量

    - 获取内存页面大小ngx_pagesize,

    - 根据 cpu 型号设置 cpu 缓存行, 通过 ngx_cpuinfo 函数获取 cpu 型号

    - 获取每个进程可以打开的最大文件描述符的数目。

  1. ngx_int_t ngx_crc32_table_init(void); //调用ngx_crc32_table_init()初始化CRC表(后续的CRC校验通过查表进行,效率高);

  2. static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle); // nginx 进行平滑升级的时候会继承旧 nginx 中的sockets

    - nginx 通过 get_env 函数获取环境变量来判断是否需要进行平滑升级, 当执行一些动作的时候 nginx 中旧master进程bind监听的fd写入到环境变量NGINX_VAR中

  1. ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle); 初始化cycle 结构体

    cycle 是 nginx 的核心控制  

  1. nginx 设置最初的进程为 master 进程

  2. ngx_int_t ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log) // 创建 pid 文件    

    这些文件保存了进程的 pid,在后面nginx进程升级的时候会用到

  1. ngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle); // 把cycle->log fd设置为STDERR_FILENO

  2. nginx 以单进程或这多进程的方式运行