操作系统内核:

三次握手,当用户发来一个 SYN 报文时,系统内核会返回一个SYN+ACK确认给客户端,当客户端再次发送ACK来的时候,此时就已经建立了三次握手.

完成三次握手后,操作系统会根据系统内的负载均衡算法来选中一个worker线程,它会返回一个建立连接的epoll_wait的连接句柄.

拿到了epoll_wait的连接句柄后找到它监听的端口 80 或 443 等端口.

拿到端口后,开始调用accept方法来分配512字节的连接内存池 (connection_pool_size:512).

分配完内存池后,http模块会从事件中接入请求的处理过程.

http模块启动后,ngx_http_init_connection设置并启用一个回调方法: epoll_ctl, 并为这个方法添加定时器 (client_header_timeout:60s) 然后将读事件添加到这个epoll事件中.并开始计时60s. 如果60秒没收到请求就会返回超时.

在请求完成后,nginx会将请求数据读取到用户态中,并在连接内存池中为他分配一个读的缓冲区: client_header_bufer_size:1k [之前分配的是512字节,这里是可扩展的分配的1k,这里的1k 是强制占用,无论你现有字节会不会超过1k 都会强行占用1k]

接收请求HTTP模块:

收到请求的URI后,开始分配内存池,并做上下文分析,分析每个head和http协议,所以这里需要分配一个默认请求内存池: request_poll_size:4k;

此时状态机会解析请求行,如:方法名,url,协议, 解析请求行的过程中 可能会发现有的URL更大,已经超过了我们之前设置的1k了,此时我们会调用一个大内存: large_client_header_buffers: 4 8k; (最多32k). 当状态机解析完了请求行后,标识URI用于指向请求行(这里也是nginx强大的原因,他可以指定请求行,不用遍历). 标识结束后,开始接受head,并开始解析header,同时复用large_client_header_buffers: 4 8k;的的内存.接收完整的header后,标识header,并且移除超时定时器 (client_header_timeout:60s),移除定时器后就开始了 11 个阶段的http请求处理过程.

nginx接受请求连接事件模块流程的更多相关文章

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

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

  2. Nginx 多进程连接请求/事件分发流程分析

    Nginx使用多进程的方法进行任务处理,每个worker进程只有一个线程,单线程循环处理全部监听的事件.本文重点分析一下多进程间的负载均衡问题以及Nginx多进程事件处理流程,方便大家自己写程序的时候 ...

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

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

  4. 【Nginx】Nginx事件模块

    一.事件处理框架概述 事件处理框架所要解决的问题是如何收集.管理.分发事件.事件以网络事件和定时器事件为主,而网络事件中以TCP网络事件为主.事件处理框架需要在不同的操作系统内核中选择一种事件驱动机制 ...

  5. nginx源代码分析--事件模块 & 琐碎

    通过HUP信息使得NGINX实现又一次读取配置文件,使用USR2信号使得NGINX实现平滑升级. 在nginx中有模块这么一说,对外全部的模块都是ngx_module_t类型,这个结构体作为全部模块的 ...

  6. 高性能Web服务器Nginx的配置与部署研究(8)核心模块之事件模块

    一.事件模块的作用是什么? 用来设置Nginx处理链接请求. 二.相关指令 1. accept_mutex 含义:设置是否使用连接互斥锁进行顺序的accept()系统调用. 语法:accept_mut ...

  7. Nginx:事件模块

    参考资料<深入理解Nginx> 根据不同的系统内核,Nginx会使用不同的事件驱动机制,本次描述的场景是使用epoll来驱动事件的处理. epoll的使用方法 1.int epoll_cr ...

  8. nginx日志模块、事件模块

    日志模块 1.access_log指令 语法: access_log path [format [buffer=size [flush=time]]]; access_log logs/access. ...

  9. Nginx请求连接限制

    目录 Nginx的请求限制 HTTP协议的连接与请求 连接限制 配置示例 做个演示: 请求限制 配置示例 基本指令 limit_req_zone limit_req zone 做个演示: Nginx的 ...

  10. nginx 的限制连接模块limit_zone与limit_req_zone

    转载于:http://storysky.blog.51cto.com/628458/642970/ nginx 上有两个限制连接的模块一个是 limit_zone 另一个是 limie_req_zon ...

随机推荐

  1. CentOS 8开启防火墙端口关闭防火墙端口端口对外放行

    1:查看firewall防火墙状态 firewall-cmd --state 或者 systemctl status firewalld 2:打开防火墙 systemctl start firewal ...

  2. centos7搭建vsftpd环境详解[亲测成功]

    centos7搭建vsftpd环境详解(亲测) 标签: centos7vsftpd   分类: linux相关(关于centos)(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 初学L ...

  3. Excel 分组后计算

    分组后的计算都类似,仍然采用 groups 函数,分组并同时计算出各洲的 GDP 总量,然后再求一遍各洲的 GDP 总量占全球 GDP 的百分比值. SPL 代码如下:   A B 1 =clipbo ...

  4. 重新整理.net core 计1400篇[五] (.net core 修改为Startup模式 )

    前言 随着不断的升级改版,我们离dotnet帮我们生成的文件中还差一步,那就是我们少了一个Startup,那么这个有什么用呢?让我们来补上it吧. 在此之前需要明白一件事,那就是Startup是一种约 ...

  5. 技术人如何"结构化"高效思考?

    1 前言 你是否在解决问题时,常常觉得脑子很乱,很多零散的信息迸发出来,但就是无法形成解决方案. 之所以这样,原因就在于,我们的大脑处理不了太多零散而复杂的信息.人类大脑在处理信息的时候,有两个规律: ...

  6. Oracle的主键id自增

    Oracle的主键id自增 可以直接用序列加触发器的方式实现 首先表里面要有个主键,没有的话用语句或者在编译器中加一下,都可以 然后创建一个序列,一般来说最常用的有这几个参数 CREATE SEQUE ...

  7. 阿里云交互式分析与Presto对比分析及使用注意事项

    阿里云交互式分析与Presto对比分析及使用注意事项本文由阿里巴巴耿江涛带来以"阿里云交互式分析与Presto对比分析及使用注意事项"为题的演讲.文章首先介绍了Presto以及它的 ...

  8. 龙蜥正式开源 SysOM:百万级实战经验打造!一站式运维管理平台 | 龙蜥技术

    ​简介:SysOM集监控.告警.诊断.修复.安全能力于一体的操作系统运维平台. ​ 文/系统运维 SIG 如果你被突如其来的 OOPS 和满屏奇怪的函数弄得满头问号?机器内存明明很大,却申请不出来内存 ...

  9. OpenYurt 如何 “0 侵入” 攻破云边融合难点

    简介: 随着 5G.IoT.直播.CDN 等行业和业务的发展,越来越多的算力和业务开始下沉到距离数据源或者终端用户更近的位置,以期获得很好的响应时间和成本,这是一种明显区别于传统中心模式的计算方式-- ...

  10. 如何基于MaxCompute快速打通数据仓库和数据湖的湖仓一体实践

    简介: MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库,以 Serverless 架构提供快速.全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户 ...