nginx Internal

48 views
Skip to first unread message

Jason Lai

unread,
Aug 4, 2011, 4:14:05 AM8/4/11
to Info Sharing
Hi all,

那天在给公司里面准备讲异步/非阻塞 IO 编程的幻灯片的时候,在网上找到淘宝牛人朱照远关于 nginx 内部实现机理的一个 slides,讲得非常深入,非常不错。如果有对 Unix 服务器编程感兴趣或者需要研究服务器性能调优的童鞋,可以好好研究一下这个 slides 里面讲的内容。

http://www.slideshare.net/joshzhu/nginx-internals

Slides 最后,关于 nginx 二进制文件热升级的部分,讲得很明白。以前我一直纳闷 nginx 怎么在可执行文件 bin 发生变化并且启动新进程以后,通过新 master 进程保证基本不间断地服务原有的监听端口(如 HTTP 默认的 80 端口)。原来它是通过以下步骤完美实现的:
1) 用户更新 nginx 二进制文件;
2) 用户向原有 master 进程发送 USR2 信号;
3) 原 master 进程给 PID 文件改名;
4) 原 master 进程通知所有 worker 进程退出;
a) 所有 worker 在处理完现有请求之后安全退出;
5) 原 master fork,生成一个新进程,然后将原有的监听端口 socket 文件描述符通过环境变量方式传入新进程;
6) 新进程运行 exec,把自己替换成热部署后的新 nginx 二进制文件,成为新的 master;
7) 新 master 接管原监听端口 socket 文件描述符,并 fork 出 worker 进程等;
8) 原 master 退出。

一系列过程做得非常巧妙,不得不佩服 Unix 系统编程的精妙之处。

Cheers,
Jason

ChenDavid

unread,
Aug 4, 2011, 5:16:51 AM8/4/11
to share...@googlegroups.com
д�IJ��?nginx���Լ���ɫ�ĵط�����Ҳ�в���ĵط����粻֧��vhost������֧���ٵȣ�������Ը���Լ���ҵ���������ʹ��

apache  lighttpd  nginx�ıȶ�


nginx�İ�װ��apache�ȶ�
http://blog.s135.com/nginx_php_v6/

���������õ���apache+fastcgi+mod_jk+mod_perl,��Ϊ�кܶలȫ��׼���еĵ���������²�����ʱ�������FIPS��֧�֣�����NSS�ȡ�

��ʱ����Դ��nginx�Ļ�������:)


> From: ja...@jasonlai.net
> Subject: nginx Internal
> Date: Thu, 4 Aug 2011 16:14:05 +0800
> To: share...@googlegroups.com
>
> Hi all,
>
> �����ڸ�˾����׼�����첽/������ IO ��̵Ļõ�Ƭ��ʱ���������ҵ��Ա�ţ������Զ���� nginx �ڲ�ʵ�ֻ����һ�� slides�����÷dz����룬�dz����?����ж� Unix ��������̸���Ȥ������Ҫ�о����������ܵ��ŵ�ͯЬ�����Ժú��о�һ����� slides ���潲�����ݡ�
>
> http://www.slideshare.net/joshzhu/nginx-internals
>
> Slides ��󣬹��� nginx �������ļ�����IJ��֣����ú����ס���ǰ��һֱ���� nginx ��ô�ڿ�ִ���ļ� bin ����仯���������½���Ժ�ͨ���� master ��̱�֤����ϵط���ԭ�еļ���˿ڣ��� HTTP Ĭ�ϵ� 80 �˿ڣ���ԭ������ͨ�����²�������ʵ�ֵģ�
> 1) �û����� nginx �������ļ���
> 2) �û���ԭ�� master ��̷��� USR2 �źţ�
> 3) ԭ master ��̸� PID �ļ�����
> 4) ԭ master ���֪ͨ���� worker ����˳���
> a) ���� worker �ڴ�������������֮��ȫ�˳���
> 5) ԭ master fork�����һ���½�̣�Ȼ��ԭ�еļ���˿� socket �ļ�������ͨ�������ʽ�����½�̣�
> 6) �½������ exec�����Լ��滻���Ȳ������� nginx �������ļ�����Ϊ�µ� master��
> 7) �� master �ӹ�ԭ����˿� socket �ļ������� fork �� worker ��̵ȣ�
> 8) ԭ master �˳���
>
> һϵ�й�����÷dz�������ò���� Unix ϵͳ��̵ľ���֮����
>
> Cheers,
> Jason

黄昊

unread,
Aug 4, 2011, 5:18:32 AM8/4/11
to share...@googlegroups.com
我去,第 5)步是个什么概念,这个超出了我的理解范围了
一个socket文件的完整描述可以直接传到新进程,然后就可以直接用了吗?
这个简直太先进了把

yang.xuhui

unread,
Aug 4, 2011, 5:29:46 AM8/4/11
to shareinfors
环境变量不可能传递描述符,但可以通过UNIX socket 或者streams方式传递
 
 
2011-08-04

yang.xuhui

发件人: 黄昊
发送时间: 2011-08-04  16:11:07
收件人: shareinfors
抄送:
主题: Re: nginx Internal

David chen

unread,
Aug 4, 2011, 5:34:56 AM8/4/11
to My Network
我在hotmail里回复都是乱码郁闷,看看这两个是基于集群的应用,nginx在集群里应用是比较广的
http://www.slideshare.net/Cary/nginx-presentation
http://www.slideshare.net/addame/montreal-on-rails-5-rails-deployment-193082


On Aug 4, 5:29 pm, "yang.xuhui" <yang.xu...@jfsys.com> wrote:
> 环境变量不可能传递描述符,但可以通过UNIX socket 或者streams方式传递
>
> 2011-08-04
>

> yang.xuhui

yang.xuhui

unread,
Aug 4, 2011, 5:36:46 AM8/4/11
to shareinfors
看错了,他的第5步是:master fork,生成一个新进程..........
这个是可以用环境变量,但是既然是fork出来的进程,子进程本来就已经有了父进程的描述符,何必再通过环境变量传递呢,很奇怪
 
 
2011-08-04

yang.xuhui

发件人: yang.xuhui
发送时间: 2011-08-04  16:24:40
收件人: shareinfors
抄送:
主题: Re: Re: nginx Internal

David chen

unread,
Aug 4, 2011, 5:49:22 AM8/4/11
to My Network
估计是针对不同请求会有一些区别,因此是通过变量来识别的,在集群里可能是这样用。

On Aug 4, 5:36 pm, "yang.xuhui" <yang.xu...@jfsys.com> wrote:
> 看错了,他的第5步是:master fork,生成一个新进程..........
> 这个是可以用环境变量,但是既然是fork出来的进程,子进程本来就已经有了父进程的描述符,何必再通过环境变量传递呢,很奇怪
>
> 2011-08-04
>

> yang.xuhui


>
> 发件人: yang.xuhui
> 发送时间: 2011-08-04 16:24:40
> 收件人: shareinfors
> 抄送:
> 主题: Re: Re: nginx Internal
>
> 环境变量不可能传递描述符,但可以通过UNIX socket 或者streams方式传递
>
> 2011-08-04
>

> yang.xuhui

黄昊

unread,
Aug 4, 2011, 6:17:33 AM8/4/11
to share...@googlegroups.com
哦,原来是这样啊,牛xx
同一个master进程来回倒腾,其他所有的进程,包括新的master都是他fork出来的,只要不关闭原来的句柄就可以接着用。
我打算试试

Jason Lai

unread,
Aug 4, 2011, 10:51:48 PM8/4/11
to share...@googlegroups.com
对的。我昨晚用 Python 写了一个示例程序,重构了一下,实现了我说的这个功能。

地址是 https://github.com/jasonlai/nginx-hotswap-sample.py

运行原理是这样:

1) python hotswap.py,启动一个 daemon 进程,监听 7890 端口
2) 7890 端口最多连三个连接,用 nc localhost 7890,会循环不断往客户端发送 Hello, world 的消息,每 5 秒一次;
3) 如果超过三个连接连到 7890 端口,这些新连接会阻塞;
4) 如果给 daemon 进程发送 SIGQUIT 或者 SIGTERM,daemon 进程会给子进程发 SIGQUIT 信号,通知它们在服务完请求之后安全关闭连接(会向连接的客户端发送一个 'Bye-bye' 的信息)
5) 如果你修改 hotswap.py 的内容,把 MSG_PING 改成其它字符串(比如 'Fxxx you!' 之类的),然后给 daemon 进程发送一个 SIGUSR2 的信号,那么:
a) daemon 进程会给在服务的子进程发送 SIGQUIT 信号,通知它们安全完成服务请求;
b) daemon 进程会 fork 出一个子进程,用自己的启动参数加载 hotswap.py 的脚本,从子进程中生成一个新 daemon 作为新 master,接管 7890 端口的监听,原 daemon 退出;
c) 原有的阻塞客户端请求会开始服务,并且以新的内容输出(如上面给的 'Fxxx you!'),还是最多只能接收三个并发请求;

以上。有兴趣欢迎讨论。

Cheers,
Jason

黄昊

unread,
Aug 4, 2011, 11:09:27 PM8/4/11
to share...@googlegroups.com
大牛就是速度快,我要好好学习
就是素质有点低,F**K

Jason Lai

unread,
Aug 4, 2011, 11:14:01 PM8/4/11
to share...@googlegroups.com
粗口以后我注意。还是改成 Beep you 吧 :D

Jason

黄昊

unread,
Aug 4, 2011, 11:21:50 PM8/4/11
to share...@googlegroups.com
反应够快的

ChenDavid

unread,
Aug 4, 2011, 11:45:16 PM8/4/11
to share...@googlegroups.com
�ղŶ��˶����룬ȷʵ��ţ��һ����һ������:)


> Date: Fri, 5 Aug 2011 11:21:50 +0800
> Subject: Re: nginx Internal
> From: huan...@gmail.com
> To: share...@googlegroups.com
>
> ��Ӧ�����
>
> �� 2011��8��5�� ����11:14��Jason Lai <ja...@jasonlai.net> ���
> > �ֿ��Ժ���ע�⡣���Ǹij� Beep you �� :D
> >
> > Jason
> >
> > �� Aug 5, 2011��11:09 AM�� ��� ���
> >
> >> ��ţ�����ٶȿ죬��Ҫ�ú�ѧϰ
> >> ���������е�ͣ�F**K
> >>
> >> �� 2011��8��5�� ����10:51��Jason Lai <ja...@jasonlai.net> ���
> >>> �Եġ��������� Python д��һ��ʾ������ع���һ�£�ʵ������˵��������ܡ�
> >>>
> >>> ��ַ�� https://github.com/jasonlai/nginx-hotswap-sample.py
> >>>
> >>> ����ԭ��������
> >>>
> >>> 1) python hotswap.py������һ�� daemon ��̣����� 7890 �˿�
> >>> 2) 7890 �˿������������ӣ��� nc localhost 7890����ѭ��������ͻ��˷��� Hello, world ����Ϣ��ÿ 5 ��һ�Σ�
> >>> 3) ��������������� 7890 �˿ڣ���Щ�����ӻ�����
> >>> 4) ���� daemon ��̷��� SIGQUIT ���� SIGTERM��daemon ��̻���ӽ�̷� SIGQUIT �źţ�֪ͨ�����ڷ���������֮��ȫ�ر����ӣ��������ӵĿͻ��˷���һ�� 'Bye-bye' ����Ϣ��
> >>> 5) ������޸� hotswap.py �����ݣ��� MSG_PING �ij������ַ����� 'Fxxx you!' ֮��ģ���Ȼ��� daemon ��̷���һ�� SIGUSR2 ���źţ���ô��
> >>> a) daemon ��̻���ڷ�����ӽ�̷��� SIGQUIT �źţ�֪ͨ���ǰ�ȫ��ɷ�������
> >>> b) daemon ��̻� fork ��һ���ӽ�̣����Լ�������������� hotswap.py �Ľű������ӽ�������һ���� daemon ��Ϊ�� master���ӹ� 7890 �˿ڵļ���ԭ daemon �˳���
> >>> c) ԭ�е�����ͻ�������Ὺʼ���񣬲������µ������������������ 'Fxxx you!'�����������ֻ�ܽ��������������
> >>>
> >>> ���ϡ�����Ȥ��ӭ���ۡ�
> >>>
> >>> Cheers,
> >>> Jason
> >>>
> >>> �� Aug 4, 2011��6:17 PM�� ��� ���
> >>>
> >>>> Ŷ��ԭ��������ţxx
> >>>> ͬһ��master������ص��ڣ��������еĽ�̣������µ�master������fork�����ģ�ֻҪ���ر�ԭ���ľ��Ϳ��Խ����á�
> >>>> �Ҵ�������
> >>>>
> >>>> �� 2011��8��4�� ����5:36��yang.xuhui <yang....@jfsys.com> ���
> >>>>> �����ˣ���ĵ�5���ǣ�master fork�����һ���½��..........
> >>>>> ����ǿ����û������������Ǽ�Ȼ��fork�����Ľ�̣��ӽ�̱������Ѿ����˸���̵�������α���ͨ����������أ������
> >>>>>
> >>>>>
> >>>>> 2011-08-04
> >>>>> ________________________________
> >>>>> yang.xuhui
> >>>>> ________________________________
> >>>>> �����ˣ� yang.xuhui
> >>>>> ����ʱ�䣺 2011-08-04 16:24:40
> >>>>> �ռ��ˣ� shareinfors
> >>>>> ���ͣ�
> >>>>> ���⣺ Re: Re: nginx Internal
> >>>>> �������������ܴ�������������ͨ��UNIX socket ����streams��ʽ����
> >>>>>
> >>>>>
> >>>>> 2011-08-04
> >>>>> ________________________________
> >>>>> yang.xuhui
> >>>>> ________________________________
> >>>>> �����ˣ� ���
> >>>>> ����ʱ�䣺 2011-08-04 16:11:07
> >>>>> �ռ��ˣ� shareinfors
> >>>>> ���ͣ�
> >>>>> ���⣺ Re: nginx Internal
> >>>>> ��ȥ���� 5�����Ǹ�ʲô�������������ҵ���ⷶΧ��
> >>>>> һ��socket�ļ���������������ֱ�Ӵ����½�̣�Ȼ��Ϳ���ֱ��������
> >>>>> �����ֱ̫�Ƚ��˰�
> >>>>> �� 2011��8��4�� ����4:14��Jason Lai <ja...@jasonlai.net> ���
Reply all
Reply to author
Forward
0 new messages