nginx多进程代码实现

nginx启动后,会有两种类型的进程,master进程和worker进程,master进程是管理进程,用于管理worker进程,如接受外界信号,向worker进程发送信号,管理worker进程的启动和停止。但是真正处理业务逻辑的是worker进程。

 1.nginx进程配置

如果nginx.conf配置为单进程且关闭master进程,则nginx启动后只有一个进程,

 当然该配置通常仅用于调试,不用与正式的生成环境。

将nginx.conf配置为多进程模型,如下图

 启动nginx后,将生成1个master进程,16个worker进程。

2.worker进程是在何时生成的?如何生成的?我们看下nginx具体代码。

单进程模型我们不在讨论,下面看一下多进程模型

nginx版本为1.4.7

在src/core/nginx.c的main函数最后,通过ngx_master_process_cycle函数管理进程,在其中通过ngx_start_worker_processes启动worker进程,在ngx_spawn_process中通过fork()得到worker进程。

3.如果我在nginx中添加自己开发的第三方模块,如何实现每个worker进程有自己的变量?

这里有两种方式,

a. 初始化模块,该行为在fork()之前。初始化模块完毕后,进行fork(),通过复制进程,在子进程中得到与父进程完全相同的数据,继续向下执行。

b. 初始化进程,该行为为fork()之后,fork之后,在子进程即work进程中初始化变量,可使得各子进程分别拥有自己的进程变量。

 

亲测redisContext可通过fork复制进程。即先创建redisContext,再fork(), 在子进程中复制得到的redisContext,可在进程中使用。因此可以在init_module函数中初始化redisContext。

但是zmqContext通过fork复制进程后,不能在各进程中正常使用,而在fork复制进程之后,分别初始化自己的zmqContext,可以在自己的进程中正常使用。因此需要在init_process中初始化zmqContext。

详情可了解下fork()过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值