描述
nginx是一款著名的高性能开源Web与反向代理服务器,支持windows和linux操作系统,因为在windows系统上还不支持SCM(服务控制管理),所以只能以控制台方式运行,但这样并不是在后台运行,也不能在系统登录前启动。针对这些问题,本方法通过改进源码,使nginx良好地支持了SCM,方便了部署运行
特点
最大地复用了nginx源码;支持SCM,并兼容控制台运行方式;统一处理异常退出而报告服务停止
实现 变换原主函数
将原来的main函数更名为ngx_main,并增加第3个参数is_scm来标识运行方式,非0表示服务方式,0表示控制台方式,流程如下
![](/images/cppblog_com/qinqing1984/ngx_mod_old_main.png)
图上红色部分为插入的逻辑,其它部分为nginx原来的逻辑。由于服务初始化须将错误记录在log(日志)中,所以应在初始化log模块后调用
增加主函数
这个主函数也就是程序入口main,可被控制台或SCM调用,当被SCM调用时,注册服务以及启动服务控制调度程序,流程如下
![](/images/cppblog_com/qinqing1984/ngx_add_main.png)
如果以命令行启动nginx 也就是master进程(管理进程),或nginx产生worker进程(工作进程)时,那么以控制台方式调用main,进而以is_scm为0调用ngx_main,当ngx_main返回时,就表示master或worker进程退出了
服务主函数
由SCM生成的一个逻辑线程调用,流程如下
![](/images/cppblog_com/qinqing1984/ngx_service_main.png)
这里的逻辑线程代替了nginx的master进程,到这里就表明已经以SCM方式运行了,所以以is_scm为1调用ngx_main,当ngx_main返回时,就表明master进程退出了,应该更新服务状态为已停止,然后返回表明当前服务结束了
服务初始化 由ngx_main调用,见变换原主函数流程图,流程如下
由于在nginx实现中,有多处出现异常错误而直接退出,因此首先注册了进程退出处理器,在其内报告服务状态为已停止,这样只要当进程退出了,在SCM上就能看到已停止的状态了
服务控制处理器 由SCM的主线程调用,流程如下
调用关系 下图左边为master进程调用模块与函数,右边为worker进程调用模块与函数,委托主函数是
ngx_main
posted on 2019-11-20 19:45
春秋十二月 阅读(833)
评论(0) 编辑 收藏 引用 所属分类:
Opensrc