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. sql判断中文、数字、英文

    IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NUMBER2 GO )) ) AS BEGIN BEGIN ,'' ...

  2. VMware安装MAC OS

    测试环境 安装环境:win10 .VMware Workstation Pro14 镜像:OS X 10.11.5(由于太大,就没有上传网盘,网上也有很多资源) 安装准备 安装前先把关于VMware的 ...

  3. 攻防世界 | CAT

    来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...

  4. 大数据给IT企业带来攫金市场新机遇

    大数据给IT企业带来攫金市场新机遇 大数据,一个时髦的名词,也是当下热门的业务领域.大数据诱人的利益诉求点之一,即通过大数据能更好地提高效率,更好地有的放矢.一方面,大数据让公司内部更有效地运作:另一 ...

  5. day 84 Xadmin组件之构建表单数据

    一 .先设置一些相关配置 1. 创建数据库模型. 在app01 下创建 from django.db import models # Create your models here. class Au ...

  6. 嵌入式C语言4.1 C语言内存空间的使用-指针

    指针:就是内存资源的地址.门牌号的代名词 假如你所在的城市是一个内存(存储器),如果找到你家,就是通过你的家庭住址(指针)寻找,而你家里的摆设面积之类的就是内存的内容(指针指向的内容). 指针变量:存 ...

  7. mysql学习(1)----------基础语法

    进入mysql mysql -u用户名 -p密码 初始用户为root   初始密码为空   status; 查看当前用户,以及数据库的字符集和其他参数的设置 set db  characterset= ...

  8. for语句和if语句画正方形菱形

    public static void main(String[] args) { int n =8; // 空心正方形 for(int i=0;i<=n;i++){ if(i==0||i==n) ...

  9. 8条关于Web前端性能的优化建议

    一般网站优化都是优化后台,如接口的响应时间.SQL优化.后台代码性能优化.服务器优化等.高并发情况下,对前端web优化也是非常重要的. 下面说说几种常见的优化措施. 1.HTML CSS JS位置 一 ...

  10. BUUCTF 梅花香自苦寒来

    梅花香自苦寒来 打开图片可以看到,在jpg后面有大量的数据,将它保存出来,可以看出是十六进制,将它转为ascii,写脚本 with open('hex.txt','r') as h: h=h.read ...