Nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部原理,但是国内却没有一本关于这方面的书,源于此我们决定自己来写一本。本书的作者为淘宝核心系统服务器平台组的成员,本书写作的思路是从模块开发逐渐过渡到nginx原理剖析。书籍的内容会定期在这里更新,欢迎大家提出宝贵意见,不管是本书的内容问题,还是字词错误,都欢迎大家提交issue(章节标题的左侧有评注按钮),我们会及时的跟进。
众所周知,Nginx性能高,而Nginx的高性能与其架构是分不开的。那么Nginx究竟是怎么样的呢?这一节我们先来初识一下Nginx框架吧。
Nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。我们也可以手动地关掉后台模式,让Nginx在前台运行,并且通过配置让Nginx取消master进程,从而可以使Nginx以单进程方式运行。很显然,生产环境下我们肯定不会这么做,所以关闭后台模式,一般是用来调试用的,在后面的章节里面,我们会详细地讲解如何调试Nginx。所以,我们可以看到,Nginx是以多进程的方式来工作的,当然Nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是Nginx的默认方式。Nginx采用多进程的方式有诸多好处,所以我就主要讲解Nginx的多进程模式吧。
刚才讲到,Nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与Nginx的进程模型以及事件处理模型是分不开的。Nginx的进程模型,可以由下图来表示:
在Nginx启动后,如果我们要操作Nginx,要怎么做呢?从上文中我们可以看到,master来管理worker进程,所以我们只需要与master进程通信就行了。master进程会接收来自外界发来的信号,再根据信号做不同的事情。所以我们要控制Nginx,只需要通过kill向master进程发送信号就行了。比如kill -HUP pid,则是告诉Nginx,从容地重启Nginx,我们一般用这个信号来重启Nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。master进程在接收到HUP信号后是怎么做的呢?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。当然,直接给master进程发送信号,这是比较老的操作方式,Nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。比如,./Nginx -s reload,就是来重启Nginx,./Nginx -s stop,就是来停止Nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的Nginx进程,而新的Nginx进程在解析到reload参数后,就知道我们的目的是控制Nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。
现在,我们知道了当我们在操作Nginx的时候,Nginx内部做了些什么事情,那么,worker进程又是如何处理请求的呢?我们前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。
那么,Nginx采用这种进程模型有什么好处呢?当然,好处肯定会很多了。首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。当然,好处还有很多,大家可以慢慢体会。
推荐教程:http://www.linuxidc.com/Linux/2015-07/120463.htm
相关推荐
《Nginx高性能Web服务器实战教程》是一本深入讲解如何利用Nginx构建高效稳定Web服务的书籍。Nginx以其高性能、轻量级、反向代理和负载均衡等特性,已经成为许多企业和开发者首选的Web服务器。这本书涵盖了从基础配置...
Nginx是一款高性能的Web服务器,它以其反向代理、负载均衡、静态文件处理和高效非...通过阅读《Nginx高性能Web服务器详解(完整版)》PDF文档,你将全面了解Nginx的各项特性和配置技巧,进一步提升你的运维和开发能力。
《Nginx高性能Web服务器》是一本深入探讨Nginx技术的权威著作,它涵盖了Nginx的基础知识、配置技巧以及优化策略。Nginx,以其高性能、轻量级和反向代理能力著称,是现代互联网架构中的关键组件。在本资料中,我们将...
, 《Nginx高性能Web服务器详解》特别适合于希望了解和掌握Nginx服务器应用技术和实现技术的广大教师、学生和电脑爱好者阅读,对使用Nginx服务器搭建Web服务器架构或进行网络服务器应用开发的技术人员尤其具有重要的...
总之,《Nginx高性能Web服务器详解》是深入了解和掌握Nginx的宝贵资料,无论你是运维工程师、开发人员还是系统架构师,都能从中受益,提升你的Web服务管理和优化技能。通过阅读本书,你将能够构建起一套高效、稳定的...
《Nginx高性能Web服务器详解》全面介绍了当前Internet上流行的一款开放源代码的Web服务器——Nginx。全书一共分为四大部分,分别从入门、功能、实现和应用等四个方面对Nginx服务器的知识进行完整阐述,从而满足广大...
本资源“Nginx高性能Web服务器详解.rar”将深入探讨Nginx的核心特性、配置技巧以及在实际应用中的最佳实践。 一、Nginx简介 Nginx由俄罗斯开发者Igor Sysoev于2002年开发,其设计目标是解决高并发问题,提供低延迟...
《Nginx高性能Web服务器详解》全面介绍了当前Internet上流行的一款开放源代码的Web服务器——Nginx。全书一共分为四大部分,分别从入门、功能、实现和应用等四个方面对Nginx服务器的知识进行完整阐述,从而满足广大...
, 《Nginx高性能Web服务器详解》特别适合于希望了解和掌握Nginx服务器应用技术和实现技术的广大教师、学生和电脑爱好者阅读,对使用Nginx服务器搭建Web服务器架构或进行网络服务器应用开发的技术人员尤其具有重要的...
总的来说,《Nginx高性能Web服务器实战教程》将引导读者全面掌握Nginx的安装、配置、优化以及与其他技术(如PHP、Docker等)的集成,帮助构建高效、可靠的Web服务架构。无论你是初学者还是经验丰富的运维人员,这...
Nginx的高性能主要得益于它的异步非阻塞模型epoll,而这种模型是Linux内核2.6版本后引入的。epoll模型的选择机制效率高于传统的select模型,它无需遍历所有句柄,而是直接响应有事件发生的句柄。 Nginx的架构分为...
NGINX高性能WEB服务器详解_PDF电子书下载 带书签目录 高清完整版_.zip 周鸿祎自述:我的互联网方法论.pdf 实战Nginx.取代Apache的高性能Web服务器.2010.pdf 构建高效、安全的CDN-阿里CDN核心技术揭秘(叔度).pdf 浅...
11构建Nginx均衡LAMP高性能服务器,rar 12 Nginx日志分析及脚本编写.rar 13 Nginx日志切割案例讲解.rar 14 Nginx均衡TCP协议服务器案例.rar 15 Nginx防盗链配置案例置.rar, 16 Nginx运维日常故障解决方案.rar 17 ...