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. 媲美5G的Wifi网速、“备战”资产一键领……揭秘双11小二背后的保障力量

    如今,双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此. 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“ ...

  2. JS中数据结构之散列表

    散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用.散列使用的数据 结构叫做散列表.在散列表上插入.删除和取用数据都非常快. 下面的散列表是基于数组进行设计的,数组的长度是预先设定的,如有 ...

  3. 【Vue】新版vue解决跨域问题

    vue.config.js module.exports = { devServer: { proxy: { "/api": { target: "http://192. ...

  4. 10.18.1 linux文本编辑器vim

    vi和vim的区别 编辑一个文本时,vi不会显示颜色,而vim会显示颜色,vi 有点类似windows记事本,简单,那么就是vim复杂编辑器,功能复杂,高亮,自动缩进(写shell/python脚本用 ...

  5. socket | netcat 模拟

    #!/opt/local/bin/python2.7 #coding=utf-8 ''' 取代netcat 两台主机中其中一台控制另一台 得到北控方的shell ''' import sys impo ...

  6. socket | tcp客户端 tcp服务器 udp客户端 udp 服务器 创建方法

    tcp服务器 #coding=utf-8 ''' 这里是tcp服务器端,要先启动 ''' import socket import threading bind_ip = "0.0.0.0& ...

  7. 20175203 2018-2019-2 实验一《Java开发环境的熟悉》实验报告

    20175203 2018-2019-2 实验一<Java开发环境的熟悉> 实验内容及步骤 使用JDK编译.运行简单的Java程序 此代码较为基础,主要是为了让我们熟悉JDK编程环境及如何 ...

  8. 用maven搭建多模块项目

    首先,前面几次学习已经学会了安装maven,如何创建maven项目等,最近的学习,终于有点进展了,搭建一下企业级多模块项目. 好了,废话不多说,具体如下: 首先新建一个maven项目,pom.xml的 ...

  9. Nginx (限速)限制并发、限制访问速率、限制流量

    Nginx 限制并发访问速率流量,配置还是简单的,看下Nginx文档根据文中这三个模块对照看一下就可以,Nginx限速使用的是漏桶算法(感兴趣可以看下文末的参考资料),需要注意的是:当需要进行限速操作 ...

  10. gradle 国内加速,修改镜像源

    为什么慢 由于默认情况下执行 gradle 各种命令是去国外的 gradle 官方镜像源获取需要安装的具体软件信息,所以在不使用代理.不翻墙的情况下,从国内访问国外服务器的速度相对比较慢 如何修改镜像 ...