Nginx架构解析

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

daemon守护线程

  nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。

  当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。

  master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

  worker进程则是处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。

  worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,具有cpu绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。

惊群现象

  每个worker进程都是从master进程fork过来。在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket(当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)。一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败。

相对于线程,采用进程的优点

  进程之间不共享资源,不需要加锁,所以省掉了锁带来的开销。

  采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。

  编程上更加容易。

多线程的问题

  而多线程在多并发情况下,线程的内存占用大,线程上下文切换造成CPU大量的开销。想想apache的常用工作方式(apache也有异步非阻塞版本,但因其与自带某些模块冲突,所以不常用),每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战,线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不去了,而这些开销完全是没有意义的。

异步非阻塞

  异步的概念和同步相对的,也就是不是事件之间不是同时发生的。

  非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。但是,多次询问也会带来额外的开销。

  总的来说,Nginx采用异步非阻塞的好处在于:

  • 不需要创建线程,每个请求只占用少量的内存
  • 没有上下文切换,事件处理非常轻量
时间: 2024-10-12 15:25:38

Nginx架构解析的相关文章

Keepalived+Nginx架构详解

Keepalived+Nginx架构 keepalived是一个类似于layer3.4.7交换机制的软件,也就是我们平时说的第3层.第4层和第7层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器.Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web.Mysql服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复

nginx架构笔记1

转载请注明: TheViper http://www.cnblogs.com/TheViper  摘自<<深入理解nginx模块开发与架构解析>> Nginx进程间关系 nginx使用一个master进程管理多个worker进程.一般情况下,worker进程数与服务器的cpu核心数相等.worker进程提供真正的服务,master进程只负责监控管理worker进程. master-worker方式启动多个进程的好处: 1.由于master进程仅专注于自己的管理工作,可以完全的管理w

nginx动态解析的实现

1 nginx 的upstream的解析,默认在nginx 启动后,缓存将永久,除非 -s reload. 如: upstrem web_backend {server web1:80;} 在启动的时候web1的地址为1.1.1.1 (dns控制),后来架构调整 web1的地址变为2.2.2.2.然后这个时候nginx并不会自动感应到dns的变化,而是一直缓存着. 除非使用一下手段 -s reload (但是是手动的或者脚本,在一定场合如 docker容器里面,是有局限性的,并且不至智能 ) 使

nginx全面解析【负载均衡、反向代理、高可用、宕机容错】

nginx全面解析[负载均衡.反向代理.高可用.宕机容错]原创itcats_cn 最后发布于2018-09-06 10:24:33 阅读数 15799 收藏展开什么是nginx?nginx是一款高性能的http服务器,官方测试nginx能够支支撑5万并发链接,并且cpu.内存等资源消耗却非常低,运行非常稳定,所以现在很多知名的公司都在使用nginx. nginx有什么作用?1.负载均衡(可以减轻单台服务器的压力) 2.反向代理(隐藏企业真实的ip地址) 3.搭建虚拟服务器 4.用做静态服务器(实

Nginx 架构和基础原理

Nginx 的应用场景 Nginx 的应用场景主要有三个: 静态资源服务 反向代理服务 API 服务 静态资源服务 Nginx 可以通过本地文件系统提供静态资源的服务,例如纯静态的 HTML 页面等. 反向代理服务 很多应用服务的运行效率是很低的,QPS,TPS,并发等都是受限的,所以需要把很多应用服务组成一个集群,向用户提供高可用性的服务,这个时候需要 Nginx 的反向代理功能,而应用服务的动态扩容需要负载均衡功能,另外一个,Nginx 层还需要做缓存.因此反向代理服务主要是三个功能: 反向

后端分布式系列:分布式存储-HDFS 架构解析

本文以 Hadoop 提供的分布式文件系统(HDFS)为例来进一步展开解析分布式存储服务架构设计的要点. 架构目标 任何一种软件框架或服务都是为了解决特定问题而产生的.还记得我们在 <分布式存储 - 概述>一文中描述的几个关注方面么?分布式文件系统属于分布式存储中的一种面向文件的数据模型,它需要解决单机文件系统面临的容量扩展和容错问题. 所以 HDFS 的架构设计目标就呼之欲出了: 面向超大文件或大量的文件数据集 自动检测局部的硬件错误并快速恢复 基于此目标,考虑应用场景出于简化设计和实现的目

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

深入HBase架构解析(二)【转】

转自:http://www.blogjava.net/DLevin/archive/2015/08/22/426950.html 前言 这是<深入HBase架构解析(一)>的续,不多废话,继续.... HBase读的实现 通过前文的描述,我们知道在HBase写时,相同Cell(RowKey/ColumnFamily/Column相同)并不保证在一起,甚至删除一个Cell也只是写入一个新的Cell,它含有Delete标记,而不一定将一个Cell真正删除了,因而这就引起了一个问题,如何实现读的问题

[转载] 深入 nginx 架构

原文: http://www.cnbeta.com/articles/402709.htm 了解 nginx 架构帮助我们学习如何开发高性能 web 服务. 为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的 (process-based)架构, NGINX则以一种复杂的事件驱动(event-driven)的架构脱颖而出,这种架构能支持现代硬件上成千上万的并发