http://tengine.taobao.org/book/index.html   算是看书笔记吧,太多了就用自己的话写一下了
nginx是以多进程 的方式来工作的,启动时会有一个master进程和多个worker进程,多个worker进程之间是对等的,一般我们的worker进程数设置为与机器cpu核数一致,这样就不会存在争抢资源了。
nginx启动后,我们操作其实是与master进程通信,worker受master控制,当一个请求过来,每个进程都有可能处理,那就要抢一个accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接,之后就开始处理连接(读取请求,解析请求,处理请求,产生数据再返回)。
worker如何处理高并发呢?是创建线程来应对吗?肯定不是了,要是那么多线程,光切换也要费好多开销了。nginx是用异步非阻塞处理的,注意是异步,具体到系统调用就是你select/poll/epoll/kqueue这样的系统调用。事件没准备好先放在epoll里面,准备好后再去处理。此时的线程只有一个,同时处理的请求也只有一个,只是在请求间不断的切换,这里的切换是没有开销的,因为主动让出的。TODO 此处要查资料
对于一个web服务器来说,事件通常有三种类型:网络事件,信号,定时器。
Connection:
nginx启动时,会解析配置文件,得到监听的端口与ip,然后在master进程中初始化这个监控的socket。
连接数=worker_connections*worker_processes。如果http作为反向代理则并发数量要除2,因为要与后端服务的连接。
一个连接过来,多个worker如何保证公平?还记得上面提到的accept_mutex吗,只有拿到这个锁才可以加accept事件,nginx有一个设置可以控制进程要不要支竞争accept_mutex锁,ngx_accept_disabled的值。这个值 如何确定呢?
它是nginx单进程的所有连接总数的八分之一减去剩下的空闲连接数量,也就是说,空间的连接数越小,这个值就会越大,当这个值 大于0时就不会去获取accept_mutex锁,就等于把机会让出去,数值越大,让出的机会就越多。
request:
也就是http请求,在nginx中的数据结构是ngx_http_request_t。它是对一个http请求的封装。对nginx来说,一个请求是从ngx_http_init_requeset开始的,在这个函数中会设置读事件ngx_http_process_request_line(处理请求行),要处理就要读取请求数据ngx_http_read_request_header,读取好了用ngx_http_parse_request_line函数来解析请求行。整个请求行解析到的参数会保存到Ngx_http_request_t结构当中。
在解析完请求行后,nginx会设置读事件的handler为ngx_http_process_request_headers,后续的处理就在这个函数中进行,读取和解析跟上面一样,ngx_http_read_request_header,ngx_http_parse_header_line,请求头保存在ngx_http_headers_t的域headers_in中。headers_in是一个链表结构,保存所有的请求头。一些特殊处理的请求头与请求函数会放在一个映射表里面ngx_http_headers_in。
当nginx解析到有两个回画换行符时,表示请求头结束,会调用ngx_http_process_request来处理请求,具体读写事件(ngx_http_request_t中的read_event_handler或write_event_handler)处理函数为ngx_http_request_handler,然后再调用ngx_http_handler来真正处理一个完整的http请求。
请求头读取完了,nginx先不读取请求的body,会把read_event_handler设置为ngx_http_block_reading;真正处理数据是在ngx_http_handler里设置write_event_handler为ngx_http_core_run_phases并执行。
ngx_http_core_run_phases执行多阶段请求处理,因为它最后会产生数据,产生的响应头会放在ngx_http_request_t的headers_out中。
keepalive
长连接:在一个连接上面执行多人请求,前提要先确定请求头与响应体的长度。
http1.0 响应头用content-length,http1.1用Transfer-encoding为chunked传输。
keepalive_timeout为0表示关掉keepalive。
pipe
pipeline其实就是流水线作业
lingering_close
延迟关闭,当nginx关闭连接时,并非立即关闭,而是先关闭tcp连接的写,再等待一段时间后再关掉连接的读。

nginx的基础概念的更多相关文章

  1. nginx架构与基础概念

    1       Nginx架构 Nginx 高性能,与其架构有关. Nginx架构: nginx运行时,在unix系统中以daemon形式在后台运行,后台进程包含一个master进程和多个worker ...

  2. nginx基础概念

    nginx基础概念(100%) connection¶ 在nginx中connection就是对tcp连接的封装,其中包括连接的socket,读事件,写事件.利用nginx封装的connection, ...

  3. zabbix监控的基础概念、工作原理及架构(一)

    zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...

  4. Docker 基础概念科普 和 常用操作介绍

    Docker 基础概念 Docker是什么?         Docker的思想来自于集装箱,集装箱解决了:在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之 ...

  5. Kubernetes 学习笔记(一):基础概念

    个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...

  6. 1-2、kubernetes架构概述和kubernetes基础概念

    kubernetes https://draveness.me/understanding-kubernetes http://kubernetes.kansea.com/docs/ master/n ...

  7. kubernetes基础概念知多少

    kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用.高扩展性和可预测性的方式来管理容器应用的生命周期.通过k8s,用户可以定义程序运行方式.部署 ...

  8. 4、kubernetes基础概念

    一.基础概念 1.Master节点 整个集群的控制中枢.Master节点是Kubernetes集群的控制节点,在生产环境中不建议部署集群核心组件外的任何Pod,公司业务的Pod更是不建议部署到Mast ...

  9. 4.第三篇 PKI基础概念、cfssl工具介绍及kubernetes中证书

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483787&idx=1&sn=08dd3404 ...

随机推荐

  1. 如何在Ubuntu下搭建tftp服务器

    远程桌面连接工具   今天开始调试arm的板子,要通过tftp下载到板子上,所以又要配置tftp服务器,真的烦死了… (本人酷爱装系统,所以经常都要搞配置) 因为之前已经在Ubuntu下搭建过很多次t ...

  2. php ltrim()函数 语法

    php ltrim()函数 语法 ltrim()函数怎么用? php ltrim()函数用于删除字符串左边的空格或其他预定义字符,语法是ltrim(string,charlist),返回经过charl ...

  3. JS中Object的一些关于原型的方法

    1.Object.getPrototypeOf(obj) 该方法返回 obj 对象的原型对象,等同于 obj.__proto__.获取对象的原型对象推荐使用该方法而不是 obj.__proto__方法 ...

  4. CodeForces - 1038D (线性DP)

    题目:https://codeforces.com/problemset/problem/1038/D 题意:给你n个数字,每个数字可以吃左右两边的数,然后吃完后自己变成 a[i]-a[i+1]或者a ...

  5. nodejs 程序(有的功能和前端js是不一样的)

    node文档:http://nodejs.cn/api/ 1.控制台输出 (node的输出是在命令框中输出的): 有颜色的输出 :console.log('\x1B[33m%s\x1b[0m:', p ...

  6. jumpserver安装和使用

    jumpserver安装 #centos6 centos7都可用yum -y install git python-pip mysql-devel gcc automake autoconf pyth ...

  7. 5 August

    P1016 旅行家的预算 单调队列. 再看看单调队列怎么用的. #include <cstdio> int n, l, r; double D, dd, d[9], C, p[9], an ...

  8. How to: Use a Custom User Name and Password Validator(WCF)

    在wcf中使用自定义的用户名和密码验证方式 https://msdn.microsoft.com/en-us/library/aa702565.aspx http://www.codeproject. ...

  9. SQLServer2008不允许保存更改

    sql server 2008在更改表结构的时候提示 “不允许保存更改,您所做的更改要求删除并重新创建以下表” 解决方案: 1.一般情况下:工具--选项--Designers--表设计器和数据库设计器 ...

  10. python基础之运算符和编码

    while循环 什么是循环? 就是不断的重复做一件事 while --关键字 后边跟条件 :还有循环体. 条件体为真,循环体内执行,为假不执行 while else 两者为一体的,相当于 if els ...