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. 阿里云基于OSS的云上统一数据保护方案2.0技术解析

    近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源. 阿里云基于 ...

  2. 【Vim编辑器】基本命令

    前言 工作中免不了会使用到vim编辑文档,总会觉得不好上手,遂从网上找到一篇说明文档整理如下,共勉. 原文地址: https://www.cnblogs.com/shiyanlou/archive/2 ...

  3. sql 2008查看进程情况和对应语句,检查死锁进程

    ---------------------------------进程情况1----------------------- --得到SPID if object_id('tempdb..#info') ...

  4. 【Linux】设置开机自启

    忘记转发的哪里的. 方法 1这种方法会利用 /etc/ 中的 rc.local 文件来在启动时执行脚本与命令.我们在文件中加上一行来执行脚本,这样每次启动系统时,都会执行该脚本. 不过我们首先需要为 ...

  5. hdu 5517 Triple

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5517 ------------------------------------------------ ...

  6. feignClient传参(参数为对象类型)的一个坑

    客户端 @RequestMapping(value = "/friendCircleComment/comment",method = RequestMethod.POST) R ...

  7. 迪杰斯特拉算法(Dijkstra)

    模板一: 时间复杂度O(n2) int dijkstra(int s,int m) //s为起点,m为终点 { memset(dist,,sizeof(dist)); //初始化,dist数组用来储存 ...

  8. python 自动把mysql备份文件发送邮箱

    import os import time import sched import smtplib from email.mime.text import MIMEText from email.he ...

  9. LR 场景设置

    LR 场景设置group:多个脚本按照独立设置模式跑,各个脚本可以单独设置虚拟用户.运行时间scenario:多个脚本之间按照相同模式跑,将总的虚拟用户数按照一定比例分配给各个脚本 schedule ...

  10. Spring Boot开启的2种方式

    Spring Boot依赖 使用Spring Boot很简单,先添加基础依赖包,有以下两种方式 1. 继承spring-boot-starter-parent项目 <parent> < ...