nginx源码分析之main

nginx启动过程如下。
1.调用ngx_strerror_init()初始化错误列表
strerror(errno)该函数以errno为下标返回错误值,这样初始化的好处是每次出错的时候不用再次调用strerror函数来获取错误原因,而直接根据错误编号找到对应得错误原因,提高执行效率,即他已经存放在一个数组中
2.调用ngx_get_options()解析命令参数;
解析nginx的启动参数,内部的函数是通过对字符串的判断,设置相应的变量,比如如果发现了-v就把设置ngx_show_version=1,那么就会显示它的版本信息。类似的还有ngx_show_configure、它内部是一个while循环,因为他可能会有多个启动参数需要解析,依次赋值给那些全局变量
-p:ngx_prefix
-c:ngx_conf_file
-g:ngx_conf_params
-s:ngx_signal
3.调用ngx_time_init()初始化并更新时间,如全局变量ngx_cached_time;
4.调用ngx_log_init()初始化日志,如初始化全局变量ngx_prefix,打开日志文件ngx_log_file.fd;
5.清零全局变量ngx_cycle,并为ngx_cycle.pool创建大小为1024B的内存池;
6.调用ngx_save_argv()保存命令行参数至全局变量ngx_os_argv、ngx_argc、ngx_argv中;
7.调用ngx_process_options()初始化ngx_cycle的prefix, conf_prefix, conf_file, conf_param等字段;
8.调用ngx_os_init()初始化系统相关变量,如内存页面大小ngx_pagesize,ngx_cacheline_size,最大连接数ngx_max_sockets等;
9.调用ngx_crc32_table_init()初始化CRC表(后续的CRC校验通过查表进行,效率高);
10.调用ngx_add_inherited_sockets()继承sockets,该函数主要处理的就是继承的socket
该函数通过解析环境变量NGINX_VAR=”NGINX”,将其中的socket number保存至ngx_cycle.listening数组,该数组元素类型为ngx_listening_t。这些socekts在环境变量中以’:’或’;’隔开
{
inherited = (u_char ) getenv(NGINX_VAR); / NGINX_VAR为宏,值为”NGINX” *
ls = ngx_array_push(&cycle->listening);
ngx_memzero(ls, sizeof(ngx_listening_t));
ls->fd = (ngx_socket_t) s; /* 保存该socket至listening数组元素的fd字段 */
return ngx_set_inherited_sockets(cycle); /* 该函数逐一设置cycle->listening数组每个元素 */

}
Ngx_set_inherited_sockets()
{
该函数从参数cycle(后续调用ngx_init_cycle()函数后全局变量ngx_cycle会指向该参数)的listening数组中逐一对每个元素(ngx_listening_t结构)进行初始化,即初始化除fd字段外的其他的字段。
对全局变量ngx_cycle的listening数组,逐一设置该数组每个元素的以下字段
• ls[i].sockaddr (调用getsockname())
• ls[i].addr_text_max_len
• ls[i].addr_text
• ls[i].backlog
• ls[i].rcvbuf (调用getsockopt())
• ls[i].sndbuf (调用getsockopt())
• ls[i].accept_filter
• ls[i].deferred_accept

涉及到的相关系统函数调用如下。
• getenv()获取环境变量,并返回指向该值字符串的指针;
• getsockname()获取socket名字(地址及长度);
• getsockopt()获取socket选项;

}
11.初始化每个module的index,并计算ngx_max_module
12. 调用ngx_init_cycle()进行初始化
详细见nginx_cycle_t的初始化
13.若有信号,则进入ngx_signal_process()处理
14.调用ngx_init_signals()初始化信号;主要完成信号处理程序的注册
详细见nginx信号的使用
15.若无继承sockets,且设置了守护进程标识,则调用ngx_daemon()创建守护进程;
16.调用ngx_create_pidfile()创建进程记录文件;(非NGX_PROCESS_MASTER=1进程,不创建该文件)
17.通过ngx_process的值确定使用哪种进程模式
若为NGX_PROCESS_SINGLE=1模式,则调用ngx_single_process_cycle()进入进程循环;
否则为master-worker模式,调用ngx_master_process_cycle()进入进程循环;

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Vue.js前端技术的大学生第二课堂系统,旨在为大学生提供一个便捷、高效的学习和实践平台。项目包含了完整的数据库设计、后端Java代码实现以及前端Vue.js页面展示,适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 在功能方面,系统主要实现了以下几个模块:用户管理、课程管理、活动管理、成绩管理和通知公告。用户管理模块支持学生和教师的注册、登录及权限管理;课程管理模块允许教师上传课程资料、设置课程时间,并由学生进行选课;活动管理模块提供了活动发布、报名和签到功能,鼓励学生参与课外实践活动;成绩管理模块则用于记录和查询学生的课程成绩和活动参与情况;通知公告模块则实时发布学校或班级的最新通知和公告。 技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,确保了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提升了用户体验和开发效率。 该项目不仅提供了完整的源代码和相关文档,还包括了详细的数据库设计文档和项目部署指南,为学习和实践提供了便利。对于基础较好的学习者,可以根据自己的需求在此基础上进行功能扩展和优化,进一步提升自己的技术水平和项目实战能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值