Nginx 进程模型

​​​​

  1. 多进程模型

    进程间相互独立,无需加锁,且互不影响;

    一个进程退出了不影响其他的进程运行,降低风险;

    当请求到来,多个 worker 通过竞争 accrpt_mutex 而获得注册 listenfd 读事件,在读事件里调用 accept 接受连接。

     
  2. 异步非阻塞:

    处理网络事件与 I/O 复用相同,同时监控多个事件,当有事件就绪了就去读写;

    一个进程同时处理的请求只有一个,在请求间不断切换;

    切换是因为异步事件未准备好而主动让出的,类似于循环处理多个准备好的事件,没有任何代价

     
  3. 信号

    如果 Nginx 在等待事件(epoll_wait 时),程序收到信号,在信号处理函数处理完成后,epoll_wait 会返回错误,然后程序可以再次进入 epoll_wait 调用

     
  4. 定时器

    Nginx 借助 epoll_wait 的超时时间实现定时器;

    Nginx 的定时器事件是放在一颗维护定时器的红黑树里面,每次进入 epoll_wait 前,先从该红黑树中拿到所有定时器事件的最小时间,在计算出 epoll_wait 的超时时间后进入 epoll_wait;

    所以,当没有任何网络事件到来,也没有信号发生时,epoll_wait 会超时,即定时器事件到了;

    这时 Nginx 会检查所有的超时事件,将它们状态设置为超时,然后再去处理网络事件。

Nginx事件处理模型(伪代码)

while (true) {
for t in run_tasks:
t.handler();
update_time(&now);
timeout = ETERNITY; // 重置超时时间
for t in wait_tasks: /* sorted already */
if (t.time <= now) {
t.timeout_handler(); // 超时
} else {
timeout = t.time - now; // 更新超时时间
break;
}
nevents = poll_function(events, timeout); // I/O复用处理事件
for i in nevents:
task t;
if (events[i].type == READ) {
t.handler = read_handler;
} else { /* events[i].type == WRITE */
t.handler = write_handler;
}
run_tasks_add(t);
}

Nginx学习笔记(一):Nginx 进程模型 / 事件处理模型的更多相关文章

  1. nginx 学习笔记(2) nginx新手入门

    这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...

  2. nginx 学习笔记(1) nginx安装

    1.nginx安装 根据操作系统的不同,nginx的安装方式也不相同. 1.1 对linux系统来说,nginx.org提供了nginx安装包.http://nginx.org/en/linux_pa ...

  3. Nginx学习笔记六Nginx的模块开发

    1.Nginx配置文件主要组成:main(全局配置)这部分的指令将影响其他所有部分.server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.upstream(主要为反向代理,负载均 ...

  4. nginx 学习笔记(3) nginx管理

    nginx可以通过向其发送信号来进行管理.默认情况下主进程的进程ID写到文件/usr/local/nginx/logs/nginx.pid中.当然也可以在配置文件中自定义该pid文件,自定义使用pid ...

  5. 七、Nginx学习笔记七Nginx的Web缓存服务

    user www; worker_processes 1; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/l ...

  6. nginx学习笔记(7)Nginx如何处理一个请求---转载

    如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...

  7. nginx 学习笔记(5) nginx调试日志

    为启动一个调试日志,nginx需要在构建时配置城支持调试模式. ./configure --with-debug ... 而且调试级别应该使用err_log指令来设置: err_log /path/t ...

  8. nginx 学习笔记(6) nginx配置文件中的度量单位

    容量大小可以用比特(byte),千比特(kilobyte,后缀k或者K)或者兆(megabytes,后缀m或者M),例如:“1024”,“8k”,“1m”. 时间间隔可以用毫秒(millisecond ...

  9. Nginx学习笔记4 源码分析

    Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...

  10. Nginx 学习笔记之安装篇

    在windows下安装Nginx其实非常简单,只需如下几个步骤: 1. 在Nginx官网下载相应版本的安装程序,上面有最新版.稳定版等各种版本,正式运营的项目建议下载最新的稳定版 2.将下载后的压缩包 ...

随机推荐

  1. android studio3.4打jar包

    第一步在build.gradle文件里的android{}里面加入下面内容 //生成jar包 task makeJar(type:Copy) { delete 'build/outputs/netwo ...

  2. php的IP转换成整型函数ip2long()易出现负数

    php中将IP转换成整型的函数ip2long()容易出现问题,在IP比较大的情况下,会变成负数.如下<?php$ip = "192.168.1.2";$ip_n = ip2l ...

  3. pgpool 的配置文件详解

    listen_addresses = 'localhost' # Host name or IP address to listen on: # '*' for all, '' for no TCP/ ...

  4. python 设计模式之迭代器模式

    #写在前面 真的有一大把年纪了,回头看看, 明明也很努力,却发现自己穷的一无所有,昨夜的事更是让我眼泪止不住的流,眼睛也肿了,委屈的愣是说不出一个字.前面荆棘丛生,身后已无退路,生活一地鸡毛,糟糕的一 ...

  5. SQL-W3School-函数:SQL HAVING 子句

    ylbtech-SQL-W3School-函数:SQL HAVING 子句 1.返回顶部 1. HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使 ...

  6. IfcWallStandardCase

    ENTITY IfcWallStandardCase SUBTYPE OF (IfcWall); WHERE HasMaterialLayerSetUsage : SIZEOF (QUERY(temp ...

  7. Greenwich.SR2版本的Spring Cloud Eureka实例

    作为微服务架构中最为核心和基础的服务治理,注册中心提供了微服务实例的自动化注册与发现.而作为一个服务注册中心,eureka的作用与传统的zk.etcd的作用是一样的,同样也支持高可用(集群).不同之处 ...

  8. 123457123457#0#-----com.twoapp.FromPuzzle02--前拼后广--儿童农场拼图游戏jiemei

    com.twoapp.FromPuzzle02--前拼后广--儿童农场拼图游戏jiemei

  9. JBPM使用

    jbpm+mysql5.7 https://blog.csdn.net/tyn243222791/article/details/79033555

  10. NET-使用Js调用WebService

    注:JsWebServiceObject 此类是我做测试示例时为了测试js是否能调用webService中的复合类型而单独新建的一个类 此类中只有名字与年龄的属性. 最近身边的一个朋友做项目,其中有一 ...