nginx架构笔记2

转载请注明: TheViper http://www.cnblogs.com/TheViper

摘自 tengine的Nginx开发从入门到精通

还是本屌无法看懂大部分内容,暂且记下看的懂的。

nginx是以多进程(一个master进程和多个worker进程)的方式来工作的,当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式.(关于进程与线程的不同,可以参见http://www.cnblogs.com/TheViper/p/4180551.html)

master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个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的方式来处理请求,每个worker里面只有一个主线程,worker内部采用了异步非阻塞的方式来处理请求。

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

关于异步非阻塞 ,就是事件(这里指事件消费者,即nginx的各种处理模块?)没有准备好,马上返回EAGAIN,告诉你,事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的。所以,才会有了异步非阻塞的事件处理机制。

具体到系统调用就是像select/poll/epoll/kqueue这样的系统调用。它们提供了一种机制,让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制正好解决了我们上面的两个问题,拿epoll为例,当事件没准备好时,放到epoll里面,事件准备好了,我们就去读写,当读写返回EAGAIN时,我们将它再次加入到epoll里面。这样,只要有事件准备好了,我们就去处理它,只有当所有事件都没准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了。

当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。更多的并发数,只是会占用更多的内存而已.

推荐设置worker的个数为cpu的核数,在这里就很容易理解了,更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,提供了cpu亲缘性的绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。

如果您觉得本文的内容对您有所帮助,您可以打赏我:

时间: 2024-07-29 09:35:46

nginx架构笔记2的相关文章

nginx架构笔记1

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

Nginx基础笔记

Nginx基础笔记 资源 安装 ubuntu下 编译安装 基本操作 HTTP基本配置 配置说明 配置文件目录结构 配置文件结构 模块 模块化 index模块 Log模块 Real IP模块 Access模块 Rewrite模块 Proxy模块 upstream模块 其他 配置静态化目录 负载均衡 控制页面缓存 nginx的内置变量 nginx小结 资源 资源 Nginx 官网 Nginx 官方下载地址 Nginx最佳实践配置项目 地址 Nginx Configuration wiki 教程 ag

Keepalived+Nginx架构详解

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

[转载] 深入 nginx 架构

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

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root、alias、index配置

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root.alias.index配置 实验环境: centos 测试节点IP:172.16.3.101 基于端口的虚拟主机: vim /etc/nginx/nginx.conf # 向里面的http {}里面加入如下内容   server { # server定义一个虚拟主机         listen 8080; # 监听本机所有IP端口8080         server_name www.test.com; # 虚拟主机名为:w

Nginx架构的企业级应用

Nginx架构的企业级应用 ==================================================== 实现HA高可用集群 实现LB负载均衡集群 Nginx实现反向代理 Nginx实现动静分离 ================================================== 需求: 客户端访问静态的请求,由nginx反向代理给后端的Apache服务器: 客户端访问动态的请求,由nginx反向代理给后端的php-fpm(fastCGI)服务器,而且

2.nginx架构及工作流程

nginx是模块化设计: 模块大致可以分为: 1.核心模块(core) 2.基础模块(http,mail) 3.第三方模块(upstream,proxy,fastcgi) 功能:1.核心模块为nginx作为webserver,web or mail proxy提供一个大的基础 2.基础模块是核心模块与扩展模块的抽象衔接,同时完成某协议的功能 3.第三方模块,在对应基础模块的基础上,完成特定功能 nginx架构: nginx对于一个http请求的处理流程: 1.tcp/ip连接建立 2.woerk

Nginx 架构和基础原理

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

Nginx学习笔记01Nginx简要介绍与目录说明

1.1. Nginx简要介绍 (1)Nginx是Web服务器. Apache.IIS:经典的通用Web服务器. Lighttpd.Nginx:轻量级Web服务器. Tomcat.Jetty:面向Java的Web服务器. (2)Nginx的优点. Nginx最吸引人的优点在于以下三个方面: (a)支持高并发. 单机10万并发. (b)低内存消耗.10000个非活跃连接仅消耗2.5MB内存. (c)热部署.24x7不间断服务. (3)Nginx的架构特点. (a)多进程架构:1个Master进程+N