写在前面的话
大概一年多以前,我看了一些ligty的代码,并且在这里给出了一些自己的分析,这部分应该到了状态机部分,后来由于我没有继续跟进ligty的代码,或者说,不再像最初那样对它感兴趣,所以也就没有再跟进了.
最近,我开始看一些nginx的代码,和当初阅读ligty一样,我不知道我会看到哪儿,分析的有多么深,所以,作为读者的您,还是把这一系列文章看作是个人的一些学习笔记好了,我随时看到一些我觉得可以分享的点,随时在这里更新一下,但是,我不能保证更新的频率和数量了.
顺便说一句,Nginx的更新似乎非常的频繁,隔个几天就有个新的版本,不知道为什么,这在我之前跟进过的开源代码中属于比较少见的了,而这里的分析,是基于0.7.61版本的代码.
============== 分割线 ==============
首先分析的是nginx中的进程管理部分.
之前分析过ligty的monitor+worker模型,简单的说就是主进程负责创建子进程,然后主进程就阻塞在wait函数上,一旦有子进程退出,这个函数会返回,然后再次创建出新的worker进程来.
Nginx中的进程管理与这个类似.同样是worker子进程负责真正的干活.但是,Nginx中,master进程(其实就是ligty中的monitor进程,也就是程序最开始启动时的进程,也就是所有worker进程的父进程)对子进程的控制更多,不仅仅关注子进程是否退出了,简单的总结如下:
1) 进程之间通过socketpair来进行通信,因此,每次创建了一个新的子进程之后,需要同时创建出对应的socketpair,还要把自己的socketpair告诉已经创建好的兄弟子进程.
2) master进程的主循环中主要完成以下几个工作:比如子进程退出,比如用户发出指令要求重新加载配置文件,比如用户发出指令说更新了新的二进制文件,等等,所有这些工作,其实都是以信号的形式来区分,发出不同的信号意味着不同的动作.Nginx中所谓的“热更新配置文件”,“热更新程序”等都是通过这个来实现的。
3) worker进程的主循环除了一般的监听网络I/O事件如客户端连接上来,可读/写之外,还需要将自己的socketpair加入到监听socket中,因为master进程就是通过向这些子进程的socketpair发送信号来通知子进程完成不同的操作.
以上,就是Nginx中进程管理的大致模型了,其实看明白了,也不复杂.
我不打算罗列代码了,在 这里 ,有一份更加详细的涉及代码的分析.
可以看到,Nginx和ligty一样,都没有采用非常复杂的进程模型,都是多进程 + 非阻塞I/O + 多路复用I/O处理的网络模型,这在我之前提到 半同步半异步模式 时也提到过.
大概一年多以前,我看了一些ligty的代码,并且在这里给出了一些自己的分析,这部分应该到了状态机部分,后来由于我没有继续跟进ligty的代码,或者说,不再像最初那样对它感兴趣,所以也就没有再跟进了.
最近,我开始看一些nginx的代码,和当初阅读ligty一样,我不知道我会看到哪儿,分析的有多么深,所以,作为读者的您,还是把这一系列文章看作是个人的一些学习笔记好了,我随时看到一些我觉得可以分享的点,随时在这里更新一下,但是,我不能保证更新的频率和数量了.
顺便说一句,Nginx的更新似乎非常的频繁,隔个几天就有个新的版本,不知道为什么,这在我之前跟进过的开源代码中属于比较少见的了,而这里的分析,是基于0.7.61版本的代码.
============== 分割线 ==============
首先分析的是nginx中的进程管理部分.
之前分析过ligty的monitor+worker模型,简单的说就是主进程负责创建子进程,然后主进程就阻塞在wait函数上,一旦有子进程退出,这个函数会返回,然后再次创建出新的worker进程来.
Nginx中的进程管理与这个类似.同样是worker子进程负责真正的干活.但是,Nginx中,master进程(其实就是ligty中的monitor进程,也就是程序最开始启动时的进程,也就是所有worker进程的父进程)对子进程的控制更多,不仅仅关注子进程是否退出了,简单的总结如下:
1) 进程之间通过socketpair来进行通信,因此,每次创建了一个新的子进程之后,需要同时创建出对应的socketpair,还要把自己的socketpair告诉已经创建好的兄弟子进程.
2) master进程的主循环中主要完成以下几个工作:比如子进程退出,比如用户发出指令要求重新加载配置文件,比如用户发出指令说更新了新的二进制文件,等等,所有这些工作,其实都是以信号的形式来区分,发出不同的信号意味着不同的动作.Nginx中所谓的“热更新配置文件”,“热更新程序”等都是通过这个来实现的。
3) worker进程的主循环除了一般的监听网络I/O事件如客户端连接上来,可读/写之外,还需要将自己的socketpair加入到监听socket中,因为master进程就是通过向这些子进程的socketpair发送信号来通知子进程完成不同的操作.
以上,就是Nginx中进程管理的大致模型了,其实看明白了,也不复杂.
我不打算罗列代码了,在 这里 ,有一份更加详细的涉及代码的分析.
可以看到,Nginx和ligty一样,都没有采用非常复杂的进程模型,都是多进程 + 非阻塞I/O + 多路复用I/O处理的网络模型,这在我之前提到 半同步半异步模式 时也提到过.