1. worker进程工作机制
  现在我们了解了当我们在操作nginx的时候,nginx内部做的一些事情,那么worker进程又是如何处理请求的呢?

  我们前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。

当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?

  首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,这句话的意思就是说master进程会监听来自客户端的请求,然后再fork出多个worker进程。且所有worker进程的listenfd会在新连接到来时变得可读,为了保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex ,worker进程处理请求的过程大概如下图所示:

看图顺序是先看绿色,然后再看蓝色,最后看红色。
绿色部分表示客户端发送的请求,蓝色部分表示master进程管理(fork)的worker进程,红色部分表示worker进程抢夺accept_mutex,灰色部分表示注册事件,然后accpet接受连接并处理。

  对于nginx的抢占机制来说,当master进程listen到来自client发送的请求时,会让所有处于空闲状态的worker进程抢夺accept_mutex ,抢到accept_mutex(互斥锁)的worker进程注册listenfd读事件,然后在读事件里调用accept接收并处理client的请求。

注意:**所有**处于空闲状态的worker进程在进行accept接收client的请求之前,都会先对client的accept_mutex锁进行try_lock尝试加锁,需要强调的是这个过程是竞争式的。

  另外要明白的一点是,这里为什么是try_lock(尝试加锁),而不是lock(加锁)。

  假设是lock的话,除了对client的请求的accept_mutex进行加锁(lock)成功的worker进程外,其他所有对client的accept_mutex锁进行lock加锁的worker进程都会阻塞,除非已经对client请求的accept_mutex加锁成功的worker进程调用unlock进行解锁释放(在解锁的同时会唤醒阻塞在此accept_mutex的其他所有worker进程),否则其他worker进程会一直阻塞在此处于空闲状态,这势必会造成资源浪费。

  而如果是try_lock的话,那么其他worker进程对client尝试加锁失败就会立即返回,去处理其他client的请求,因此不会有其他worker进程阻塞在这,也就不会造成资源浪费了。

  当一个worker进程对client的accept_mutex加锁成功,accept这个连接并注册读事件,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,一个完整的请求就是这样的了。

2. nginx处理请求过程
  nginx使用一个多进程模型来对外提供服务,一个master进程和多个worker进程,master进程负责管理nginx本身和其他worker进程。

  所有实际上的业务处理逻辑都在worker进程。worker进程中有一个函数,执行无限循环,不断处理收到的来自客户端的请求,并进行处理,直到整个nginx服务被停止。

  worker进程中,ngx_worker_process_cycle()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:

操作系统提供的机制(例如epoll, kqueue等)产生相关的事件。
接收和处理这些事件,如是接受到数据,则产生更高层的request对象。
处理request的header和body。
产生响应,处理响应数据并发送回客户端。
完成request的处理。
重新初始化定时器及其他事件,断开连接。
---------------------

转自:https://blog.csdn.net/qq_35733751/article/details/79832005

Nginx处理请求过程的更多相关文章

  1. Nginx作为高性能服务器的缘由以及请求过程

    Nginx作为高性能服务器的缘由以及请求过程 简介: Nginxx采用的是多进程(单线程)&多路IO复用模型,使用I/O多路复用技术的Nginx,就成了"并发事件驱动"的服 ...

  2. nginx的请求接收流程(二)

    在ngx_http_process_request_line函数中,解析完请求行之后,如果请求行的uri里面包含了域名部分,则将其保持在请求结构的headers_in成员的server字段,heade ...

  3. nginx的请求接收流程(一)

    今年我们组计划写一本nginx模块开发以及原理解析方面的书,整本书是以open book的形式在网上会定时的更新,网址为http://tengine.taobao.org/book/index.htm ...

  4. client和nginx简易交互过程

    # client和nginx简易交互过程- step1:client发起http请求- step2:dns服务器解析域名得到主机ip- step3:默认端口为80,通过ip+port建立tcp/ip链 ...

  5. TOMCAT原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

  6. TOMCAT原理详解及请求过程(转载)

    转自https://www.cnblogs.com/hggen/p/6264475.html TOMCAT原理详解及请求过程 Tomcat: Tomcat是一个JSP/Servlet容器.其作为Ser ...

  7. Nginx处理请求的11个阶段(agentzh的Nginx 教程学习记录)

    Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 post-read.server-rewrite.find-config.rewrite.post-rewrite.preacc ...

  8. 一次完整的 HTTP 请求过程

    一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端, ...

  9. Tomcat学习(二)------Tomcat原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

随机推荐

  1. SpringMVC 的运行原理

    0. 灵魂的拷问   问:SpringMVC 是什么?它有什么作用?  答:SpringMVC 的全称是 Spring Web Model-View-Controller,它是 Spring Fram ...

  2. Eclipse中SVN插件的安装和配置(在线安装)

    公司项目中用到了svn来管理项目,然后需要在Eclipse中进行配置.网上参考了很多资料,离线安装的方式装上了,但是导入项目后报错,可能是离线安装包的问题.然后又采用了Eclipse在线安装的方式,总 ...

  3. SaaS技术栈的走势

    本地部署时代 在软件还是“本地部署(on-premise)”的时候,SaaS的版图被大型玩家把持着,几乎所有的垂直领域(营销.支持.销售.人力)都被微软.SAP等大公司的解决方案占据.那时候的用户并没 ...

  4. springboot之单元测试

    springboot在写完之后,肯定都需要进行单元测试,如下给出一些样例 工程层次结构如图 代码如下: controller: package com.rookie.bigdata.controlle ...

  5. C#基础(201)--常量枚举

    本文知识点: 1.掌握常量的定义和使用方法 2.理解枚举的作用和特点 3.掌握枚举的使用方法 1.1.常量的定义语法 const  数据类型   常量名称  =  值: 1.2.常见错误 1.3常量的 ...

  6. SSIS 包部署错误 0xC0010014

    SSIS 包部署错误 0xC0010014 Reinhard 在部署 SSIS 包时,提示如下错误. 由于错误 0xC0010014"发生了一个或多个错误.在此消息之前应有更为具体的错误消息 ...

  7. JVM调优日志解析分析

    一.调优参数设置 JVM的GC日志的主要参数包括如下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStam ...

  8. Charles 抓包手机app

    最近在测为移动端提供的API, 使用mac系统, 发现fiddler在mac下无法使用, 不知道其他朋友是否遇见过, 只能找替代工具. 先去百度上搜索下载Charles 破解版, 选择Charles是 ...

  9. 基于OpenSSL的HTTPS通信C++实现

      HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.Nebula是一个为开发者提供一个快速开发 ...

  10. 多级nginx代理,获取客户端真实ip

    今天服务里的微信公众号支付业务突然不能用了,报错为网络环境未能通过安全验证,请稍后再试.检查后端日志,没有任何问题,看来是成功创建支付订单,但是调起支付时出现了问题.上网查了一下,这个报错的直接原因是 ...