读《深入理解nginx》&《nginx开发从入门到精通》后的几点解惑

[toc]

0.前言

从开始使用nginx到现在至少也有六年多的时间,一直停留在应用的层面上,这次抽了一个多星期的时间简单看了一下这两本书。本文不能说是对于nginx 的解析,在长期对nginx的模糊认识的情况下又有了更深的认识。包括对于master-worker的认识,对于nginx 使用epoll 事件模型的理解等。另外又看了一些应用层面的配置。
以下记录了几点简单的知识点,贴了一些链接都是在看书时产生的问题,搜索之后找到比较满意答案的链接。依旧是看得多记得少。长期更新。

1.Nginx应用层面问题

1.1 pid文件的作用

记录Master 进程id,通过cli 向master进程发送信号,操控运行中的nginx。

1.2 worker进程数的设置

worker的进程数设置为cpu核心数相等时,进程间切换的代价还是最小的。

https://www.centos.bz/2016/10/tweaking-nginx-conguration/

1.3 非守护进程运行

daemon on | off;

注意docker 下 daemon 需要设置为off.否则无法启动成功.详见

https://segmentfault.com/a/1190000009583997

1.4 带有@的location

不直接处理用户请求,用于处内部请求重定向
理解为其他location转发.

1.5 try_files的应用

不是一个问题,但是继续强调一下.
单页应用中(spa)路由跳转重定向到index.html

location / {
        try_files $uri $uri/ /index.html;
    } 

2.Nginx如何处理HTTP 请求

https://www.kancloud.cn/digest/understandingnginx/202586
https://www.cnblogs.com/jimodetiantang/p/8952141.html
https://blog.csdn.net/xiajun07061225/article/details/9260535

2.1 请求处理

https://tengine.taobao.org/book/chapter_02.html#id12

nginx使用一个多进程模型来对外提供服务,其中一个master进程,多个worker进程。master进程负责管理nginx本身和其他worker进程。

所有实际上的业务处理逻辑都在worker进程。worker进程中有一个函数,执行无限循环,不断处理收到的来自客户端的请求,并进行处理,直到整个nginx服务被停止。

worker进程中,ngx_worker_process_cycle()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:

  • 操作系统提供的机制(例如epoll, kqueue等)产生相关的事件。
  • 接收和处理这些事件,如是接受到数据,则产生更高层的request对象。
  • 处理request的header和body。
  • 产生响应,并发送回客户端。
  • 完成request的处理。
  • 重新初始化定时器及其他事件。

2.2 处理流程

  • 初始化HTTP Request(读取来自客户端的数据,生成HTTP Request对象,该对象含有该请求所有的信息)。
  • 处理请求头。
  • 处理请求体。
  • 如果有的话,调用与此请求(URL或者Location)关联的handler。
  • 依次调用各phase handler进行处理。

2.3 为何高效

https://blog.csdn.net/russell_tao/article/details/7160071

epoll模型
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);

  • 链表记录监听句柄,可以监听更多的文件句柄。
  • epoll_wait 近返回有事件发生的句柄,减少从系统态复制到用户态的数据。

为什么nginx可以采用异步非阻塞的方式来处理呢,或者异步非阻塞到底是怎么回事呢?我们先回到原点,看看一个请求的完整过程。首先,请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据。具体到系统底层,就是读写事件,而当读写事件没有准备好时,必然不可操作,如果不用非阻塞的方式来调用,那就得阻塞调用了,事件没有准备好,那就只能等了,等事件准备好了,你再继续吧。阻塞调用会进入内核等待,cpu就会让出去给别人用了,对单线程的worker来说,显然不合适,当网络事件越多时,大家都在等待呢,cpu空闲下来没人用,cpu利用率自然上不去了,更别谈高并发了。好吧,你说加进程数,这跟apache的线程模型有什么区别,注意,别增加无谓的上下文切换。所以,在nginx里面,最忌讳阻塞的系统调用了。不要阻塞,那就非阻塞喽。非阻塞就是,事件没有准备好,马上返回EAGAIN,告诉你,事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的。所以,才会有了异步非阻塞的事件处理机制,具体到系统调用就是像select/poll/epoll/kqueue这样的系统调用。它们提供了一种机制,让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制正好解决了我们上面的两个问题,拿epoll为例(在后面的例子中,我们多以epoll为例子,以代表这一类函数),当事件没准备好时,放到epoll里面,事件准备好了,我们就去读写,当读写返回EAGAIN时,我们将它再次加入到epoll里面。这样,只要有事件准备好了,我们就去处理它,只有当所有事件都没准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。更多的并发数,只是会占用更多的内存而已。 我之前有对连接数进行过测试,在24G内存的机器上,处理的并发请求数达到过200万。现在的网络服务器基本都采用这种方式,这也是nginx性能高效的主要原因。

定时器实现

https://russelltao.iteye.com/blog/1405352

  1. 将未完成的连接处理放入超时管理中,超时未完成剔除,避免无效连接占用资源。
  2. 超时对象的组织形式采用红黑树,提供较高性能的删除和插入操作.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容

  • Nginx才短短几年,就拿下了web服务器大笔江山,众所周知,Nginx在处理大并发静态请求方面,效率明显高于ht...
    松江野人阅读 1,070评论 0 2
  • 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的。那么nginx究竟是怎么样的呢?这一节我们先来...
    Alfie20阅读 1,619评论 2 4
  • 情商的核心内容可以用以下四句话描述: 知道别人的情绪,知道自己的情绪, 尊重别人的情绪,调控自己的情绪。 人的素质...
    每文_5197阅读 428评论 1 1
  • 午后 初秋清风拂过 摆弄着你的发鬓 竟然无端嫉妒起风来 我的角度 只能看见你侧脸 温馨的像湖畔的风景 会与这个世界...
    深蓝海阅读 201评论 0 4
  • 身边跟我年龄相仿的人大都结婚生子了。也有很多亲戚在催促我赶紧找个对我好的人嫁了,这样一辈子也就算成功一大半了。 可...
    沫言之阅读 422评论 0 0