`

深入浅出Nginx之工作原理

阅读更多

nginx被称为高性能web server,是与其架构和工作原理分不开的

 

nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各个worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu 核数一致。

 

nginx默认是单进程(master进程)提供服务的,运营环境下按照master-worker方式配置同时启动多个进程的好处主要是:

 

1、由于master进程不会对用户请求提供服务,只用于管理真正提供服务的worker进程,所以master进程可以是唯一的,它仅专注于自己的纯管理工作,为管理员提供命令行服务,包括诸如启动服务、停止服务、重载配置文件、平滑升级程序等。master进程需要拥有较大的权限,例如,通常会利用root用户启动master进程。worker进程的权限要小于或等于master进程,这样master进程才可以完全地管理worker进程。当任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务。

 

2、多个worker进程处理互联网请求不但可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是,这样可以充分利用现在常见的SMP多核架构,从而实现微观上真正的多核并发处理。因此,用一个进程(master进程)来处理互联网请求肯定是不合适的。

 

worker进程的个数设置与机器cpu核数一致的原因大致有两点:

 

一是nginx一般只做高并发代理,基本没用IO操作,算是CPU密集操作,所以在处理时基本是瞬时完成的,很少出现IO阻塞;二是进程与CPU调度的关系,单个核心处理多个进程的时候,是排队处理的,所以将Worker进程个数设置超过cpu核数是没有太大意义的。

 

worker进程是如何处理http请求的呢?

 

首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex(共享锁),抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这就是一个完整的请求了,并且一个请求完全由worker进程来处理,而且只在一个worker进程中处理。采用这种方式的好处是:

 

1、节省锁带来的开销 。对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查上时,也会方便很多。

 

2、独立进程,减少风险 。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断, master进程则很快重新启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

 

nginx的事件处理机制,采用异步非阻塞事件处理机制,一个worker进程只有一个主线程,通过异步非阻塞的事件处理机制,实现了循环处理多个准备好的事件,从而实现轻量级和高并发。

 

异步非阻塞事件处理机制:

 

同步和异步的概念,这两个概念与消息的通知机制有关。同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者。

 

阻塞和非阻塞,这两个概念与程序等待消息(无所谓同步或者异步)时的状态有关。

 

当读写事件没有准备好时,就放入epoll里面。如果有事件准备好了,那么就去处理;如果事件返回的是EAGAIN,那么继续将其放入epoll里 面。从而,只要有事件准备好了,我们就去处理,只有当所有时间都没有准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件。

 

与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。更多的并发数,只是会占用更多的内存而已。

 

 参考原文  http://hzcsky.blog.51cto.com/1560073/1533354

分享到:
评论

相关推荐

    跟我学Nginx+Lua开发_nginxlua原理_nginx_

    总结,《跟我学Nginx+Lua开发》这本书深入浅出地讲解了如何利用Nginx与Lua进行Web服务开发,无论你是运维人员、开发人员还是架构师,都能从中学习到实用的技能,提升你的Web服务开发水平。通过阅读本书,你可以掌握...

    深入浅出分布式技术原理 教程 下载 下载4.zip

    分布式技术是现代IT领域中的重要概念,它涉及多个计算节点协同工作以处理大规模数据和提供高可用性服务。...下载“深入浅出分布式技术原理 教程 下载 下载4.txt”文件,开始您的分布式技术探索之旅吧!

    187深入浅出分布式技术原理

    本资料“187深入浅出分布式技术原理”旨在帮助读者理解分布式系统的精髓,掌握如何设计和实现高效、可靠的分布式系统。 分布式技术的核心理念在于将任务分解到多个独立的节点上,以实现并行处理,提高系统的性能和...

    《实战nginx》电子版

    本书通过丰富的案例分析,深入浅出地介绍了Nginx的各种模块,旨在提升读者在实际工作中的配置和优化能力。 Nginx是一款高性能的HTTP和反向代理服务器,广泛应用于网站的负载均衡、静态文件处理、SSL终止等场景。其...

    Nginx经典教程

    代理zh的Nginx教程不仅是一系列技术文档,更是深入浅出的技术宝典,旨在帮助Nginx用户提升技能,无论是新手还是经验丰富的系统管理员都能从中获益匪浅。通过这些教程的学习,可以掌握Nginx的高级特性,从而更好地...

    python基础教程第三版+精通nginx第二版

    这本书深入浅出地介绍了变量、数据类型、控制流、函数、模块、异常处理、面向对象编程等核心概念,同时也涉及了标准库的使用和文件操作。对于想要在Python编程领域打下坚实基础的读者来说,这是一个很好的起点。 在...

    Nginx 应用技术指南 pdf 高清

    Nginx由俄罗斯程序员Igor Sysoev开发,最初是为了解决高并发的网站需求,尤其是为了应对Rambler.ru...整体而言,这份技术指南对Nginx的应用技术作了深入浅出的介绍和详细的实例演示,是学习Nginx的一个不可多得的资源。

    实战Nginx:取代Apache的高性能Web服务器

    《实战Nginx:取代Apache的高性能Web服务器》这本书提供了深入浅出的讲解,帮助读者理解Nginx的工作原理以及如何将其应用于实际项目中。无论是对于初学者还是有一定经验的技术人员来说,都是一本不可多得的好书。...

    《精通Nginx 二版》高清、内容可复制、带目录标签

    《精通Nginx 二版》是一本专为IT专业人士准备的深度学习Nginx的权威指南。本书详细阐述了Nginx的核心...通过阅读这本书,你可以深入了解Nginx的工作原理,提升运维技能,为企业或个人项目构建更高效、可靠的网络服务。

    nginx cookbook-en

    通过对负载均衡、内容缓存、Web服务器安全控制及监控管理等方面进行深入浅出的讲解,本书为读者提供了丰富的实践经验和技巧。无论是对于新手还是经验丰富的开发者而言,这本书都具有极高的参考价值。

    nginx 如何取代 apache 一书

    综上所述,《Nginx如何取代Apache》这本书深入浅出地介绍了如何利用Nginx的强大功能,替换Apache来提升Web服务器的性能和稳定性。通过理解两者的工作原理、核心特性,以及迁移和配置的步骤,读者可以成功地将网站从...

    ngnix.rar_ngnix学习视频_ngnix视频_ngnix视频教程_怎样学习ngnix

    【Nginx简介】 Nginx(发音为 "engine-x")是一款高性能...教程会深入浅出地讲解每个知识点,确保即使是没有经验的新手也能轻松上手。在实践中不断探索和学习,你将能够灵活运用Nginx来构建高效、稳定的Web服务环境。

    《分布式服务框架原理与实践》高清完整版

    《分布式服务框架原理与实践》这本书深入浅出地讲解了分布式服务的基础理论和实际操作,对于想要深入了解和掌握这一领域的读者来说是一份宝贵的学习资料。 在分布式服务框架中,主要涉及以下几个核心知识点: 1. *...

    私塾在线 高级java软件架构师实战培训视频教程 阶段一 代码及目录 32-37 讲 共148讲

    这个阶段的学习聚焦在Java架构设计与实施的核心技术上,通过深入浅出的教学方式,帮助学员提升在实际项目中的应用能力。 在提供的压缩包文件中,我们可以看到涉及到Nginx服务器的多个关键主题,这在现代Web应用程序...

    大型网站技术架构——核心原理与案例分析_李智慧

    讲解高并发访问下的网站发展变迁,对常用的网站技术进行了深入浅出的分析罗列,内容通俗易懂,而且对架构师的领导艺术进行了介绍,值得一读

    常用文档java5.rar

    阅读《深入浅出Spring Boot 2.x.pdf》可以深入了解Spring Boot的特性,如嵌入式Web服务器、健康检查、配置文件、Actuator等。 5. Nginx: Nginx是一款高性能的HTTP和反向代理服务器,常用于负载均衡、静态资源处理...

    [高清]大型网站技术架构 核心原理与案例分析+李智慧.pdf

    这本书深入浅出地介绍了大型网站在应对高并发、大数据量、高可用性等挑战时所采用的技术策略和实践经验,是IT行业中尤其是互联网开发者和架构师的重要参考资料。 首先,书中详细讲解了网站架构的基础知识,包括软件...

    大型网站技术架构_核心原理与案例分析_李智慧

    《大型网站技术架构_核心原理与案例分析_李智慧》这本书深入浅出地探讨了互联网行业中大型网站在设计、建设和优化过程中所面临的关键问题及解决方案。以下是对书中的主要知识点的详细解读: 一、网站架构概述 大型...

Global site tag (gtag.js) - Google Analytics