nginx接受请求连接事件模块流程
操作系统内核:
三次握手,当用户发来一个 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接受请求连接事件模块流程的更多相关文章
- nginx的请求接收流程(一)
今年我们组计划写一本nginx模块开发以及原理解析方面的书,整本书是以open book的形式在网上会定时的更新,网址为http://tengine.taobao.org/book/index.htm ...
- Nginx 多进程连接请求/事件分发流程分析
Nginx使用多进程的方法进行任务处理,每个worker进程只有一个线程,单线程循环处理全部监听的事件.本文重点分析一下多进程间的负载均衡问题以及Nginx多进程事件处理流程,方便大家自己写程序的时候 ...
- nginx的请求接收流程(二)
在ngx_http_process_request_line函数中,解析完请求行之后,如果请求行的uri里面包含了域名部分,则将其保持在请求结构的headers_in成员的server字段,heade ...
- 【Nginx】Nginx事件模块
一.事件处理框架概述 事件处理框架所要解决的问题是如何收集.管理.分发事件.事件以网络事件和定时器事件为主,而网络事件中以TCP网络事件为主.事件处理框架需要在不同的操作系统内核中选择一种事件驱动机制 ...
- nginx源代码分析--事件模块 & 琐碎
通过HUP信息使得NGINX实现又一次读取配置文件,使用USR2信号使得NGINX实现平滑升级. 在nginx中有模块这么一说,对外全部的模块都是ngx_module_t类型,这个结构体作为全部模块的 ...
- 高性能Web服务器Nginx的配置与部署研究(8)核心模块之事件模块
一.事件模块的作用是什么? 用来设置Nginx处理链接请求. 二.相关指令 1. accept_mutex 含义:设置是否使用连接互斥锁进行顺序的accept()系统调用. 语法:accept_mut ...
- Nginx:事件模块
参考资料<深入理解Nginx> 根据不同的系统内核,Nginx会使用不同的事件驱动机制,本次描述的场景是使用epoll来驱动事件的处理. epoll的使用方法 1.int epoll_cr ...
- nginx日志模块、事件模块
日志模块 1.access_log指令 语法: access_log path [format [buffer=size [flush=time]]]; access_log logs/access. ...
- Nginx请求连接限制
目录 Nginx的请求限制 HTTP协议的连接与请求 连接限制 配置示例 做个演示: 请求限制 配置示例 基本指令 limit_req_zone limit_req zone 做个演示: Nginx的 ...
- nginx 的限制连接模块limit_zone与limit_req_zone
转载于:http://storysky.blog.51cto.com/628458/642970/ nginx 上有两个限制连接的模块一个是 limit_zone 另一个是 limie_req_zon ...
随机推荐
- centos8 \CentOS 9 Stream \Oracle Linux8\Oracle Linux 9 rpm 安装mysql8.0.28 mysql8.0.34
centos8 rpm 安装mysql8.0.28 检查 检测系统是否自带安装 MySQL 命令如下: rpm -qa | grep mysql 如果如下存在已安装的包,就需要卸载 mysql80-c ...
- centos6.5下安装配置apache2.4.9
centos6.5下安装配置apache2.4.9 摘要: 需要下载的包 apr-1.5.0.tar.gz apr-util-1.5.3.tar.gz pcre-8.33.tar.gz httpd-2 ...
- docker 应用篇————容器共享数据卷[十五]
前言 简单介绍一下多个容器间容器卷共享. 正文 先启动上一节的test:2.0 这个镜像. docker run --name test01 -it test:2.0 /bin/bash 然后 ctr ...
- Triton部署mmdeploy导出的TensorRT模型失败篇
记录一下历程,最终没有部署成功,应该是Ubantu系统版本的问题.现在没有时间搞了,先记录一下,后续用到再填坑. Triton demo git clone -b r22.06 https://git ...
- java调用QQ影音进行截图
import java.awt.Graphics2D; import java.awt.Image; import java.awt.Robot; import java.awt.Toolkit; i ...
- golang开发 深入理解 context
context的历史 context包在Go 1.7版本正式加入Go标准库.在加入之前我们看看Go团队核心成员Sameer Ajmani在2014年发表的一篇关于context介绍博客,地址:http ...
- Exception in thread "main" java.util.NoSuchElementException
Exception in thread "main" java.util.NoSuchElementException 用了两个scanner的时候,执行程序发生报错:Except ...
- 力扣539(java)-最小时间差(中等)
题目: 给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示. 示例 1: 输入:timePoints = [" ...
- 干掉讨厌的 CPU 限流,让容器跑得更快
简介: 让人讨厌的 CPU 限流影响容器运行,有时人们不得不牺牲容器部署密度来避免 CPU 限流出现.本文介绍的 CPU Burst 技术可以帮助您既能保证容器运行服务质量,又不降低容器部署密度.文 ...
- 漫画 | 一口气搞懂 Serverless !
简介: 第二届云原生编程挑战赛为热爱技术的年轻人提供一个挑战世界级技术问题的舞台,希望用技术为全社会创造更大价值. 作者 | 刘欣 呃,我可能是别人眼中所说的不用奋斗的一代. 大家喜欢听的什么多姿多 ...