透视 HTTP 协议
罗剑锋(Chrono)
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
63943 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
开篇词 (1讲)
透视 HTTP 协议
15
15
1.0x
00:00/00:00
登录|注册

34 | Nginx:高性能的Web服务器

阶段式处理
filter模块
handler模块
职责链模式
epoll特点
I/O密集型
epoll
多线程 vs 单线程
master进程
进程池
工作模式
轻量级服务器
发音
版本
功能
Nginx
Apache
课下作业
小结
多阶段处理
I/O多路复用
进程池
Nginx概述
Web服务器选择
互联网发展
Nginx: 高性能的Web服务器

该思维导图由 AI 生成,仅供参考

经过前面几大模块的学习,你已经完全掌握了 HTTP 的所有知识,那么接下来请收拾一下行囊,整理一下装备,跟我一起去探索 HTTP 之外的广阔天地。
现在的互联网非常发达,用户越来越多,网速越来越快,HTTPS 的安全加密、HTTP/2 的多路复用等特性都对 Web 服务器提出了非常高的要求。一个好的 Web 服务器必须要具备稳定、快速、易扩展、易维护等特性,才能够让网站“立于不败之地”。
那么,在搭建网站的时候,应该选择什么样的服务器软件呢?
在开头的几讲里我也提到过,Web 服务器就那么几款,目前市面上主流的只有两个:Apache 和 Nginx,两者合计占据了近 90% 的市场份额。
今天我要说的就是其中的 Nginx,它是 Web 服务器的“后起之秀”,虽然比 Apache 小了 10 岁,但增长速度十分迅猛,已经达到了与 Apache“平起平坐”的地位,而在“Top Million”网站中更是超过了 Apache,拥有超过 50% 的用户(参考数据)。
在这里必须要说一下 Nginx 的正确发音,它应该读成“Engine X”,但我个人感觉“X”念起来太“拗口”,还是比较倾向于读做“Engine ks”,这也与 UNIX、Linux 的发音一致。
作为一个 Web 服务器,Nginx 的功能非常完善,完美支持 HTTP/1、HTTPS 和 HTTP/2,而且还在不断进步。当前的主线版本已经发展到了 1.17,正在进行 HTTP/3 的研发,或许一年之后就能在 Nginx 上跑 HTTP/3 了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Nginx是一款高性能的Web服务器,以其稳定、快速、易扩展、易维护等特性在互联网上占据重要地位。其独特的工作模式包括进程池和I/O多路复用,充分利用多核CPU的计算能力,实现高效的请求处理,超越其他多线程的服务器。Nginx的发展也在不断进步,目前已经支持HTTP/1、HTTPS和HTTP/2,并正在进行HTTP/3的研发。Nginx的HTTP处理分解成多个功能模块,实现了高度的灵活性和扩展性。其“职责链”模式设计和组织,以流水线的方式处理HTTP请求。总体而言,Nginx作为一款“后起之秀”的Web服务器,在高性能、稳定性和扩展性方面展现出了明显优势,对于搭建网站和提供服务具有重要意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《透视 HTTP 协议》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • 许童童
    你是怎么理解进程、线程上下文切换时的成本的,为什么 Nginx 要尽量避免? 当从一个任务切换到另一个任务,当前任务的上下文,如堆栈,指令指针等都要保存起来,以便下次任务时恢复,然后再把另一个任务的堆栈加载进来,如果有大量的上下文切换,就会影响性能。 试着自己描述一下 Nginx 用进程、epoll、模块流水线处理 HTTP 请求的过程。 Nginx 启动进程,一个master,多个worker,创建epoll,监听端口,多路复用来管理http请求,http请求到达worker内部,通过模块流水线处理,最后返回http响应。

    作者回复: √

    2019-08-14
    2
    38
  • 夏目
    好像高性能的服务都是这样玩的,nginx这个架构类似于netty中的多线程reactor模式,redis则是单线程reactor

    作者回复: nginx也是单线程的,和redis一样自己封装了epoll。单线程的好处是没有race condition,处理简单。 nginx比redis高明的一点是多进程,提高了稳定性和并发能力。

    2019-12-10
    14
  • geraltlaush
    一个线程的时间片没用完就系统调用被系统调度切换出去,浪费了剩余的时间片,nginx通过epoll和注册回调,和非阻塞io自己在用户态主动切换上下文,充分利用了系统分配给进程或者线程的时间片,所以对系统资源利用很充分

    作者回复: great。

    2019-08-14
    2
    12
  • lesserror
    老师,以下问题,麻烦回答一下,谢谢: 1. 把进程“绑定”到独立的 CPU 上。意思是一个CPU专门负责管理进程嘛? 2. 不过 master 进程完全是 Nginx 自行用 C 语言实现的,这就摆脱了外部的依赖,简化了 Nginx 的部署和配置。这句话没理解。

    作者回复: 1.unix/linux有个特别的功能,可以让进程“绑定”在一个cpu上运行,不会被操作系统调度到其他cpu上跑,这样就减少了切换的成本,提高运行效率。不是管理进程的意思。配置指令是“worker_cpu_affinity”。 2.在unix上有很多服务管理程序,比如systemd、supervisor,可以实现进程监控、自动重启等。而Nginx的master进程实现了同样的功能,就不需要这样的外部程序来管理进程,保持服务的稳定性。

    2019-12-26
    9
  • 徐海浪
    多线程就好比一条流水线有多个机械手,把一件事情中途交给其他线程处理,要交接处理中间状态信息。 单进程就好比一条流水线只有一个机械手,切换时间片时暂停状态就可以,不用交接信息,减少无用功,所以效率高。

    作者回复: great

    2019-08-15
    8
  • fakership
    老师,有个问题咨询下 虽然nginx是使用了epoll做了io的多路复用,但对于队头阻塞的话感觉并没有帮助啊,因为还是要等io事件回调后发送http响应报文,所以还是阻塞了下一个请求。

    作者回复: 是的,但这完全是两个不相关的事情。 队头阻塞是http/1固有的问题,无论是什么web服务器都无法解决,是对单个客户端而言的。 而Nginx的epoll则是解决了多客户端并发请求的问题,避免一个客户端阻塞其他客户端的处理,可以支持海量客户端访问服务器。

    2020-08-16
    7
  • -W.LI-
    老师好!我打算学习nginx,有适合初学者的书推荐么?Java工程师,c全忘了。 线程切换开销:线程切换需要进行系统调用。需要从用户态->内核态->用户态。上下文切换,需要保存寄存器中的信息,以便于完成系统调用后还原现场。会多跑很多指令,出入栈会比寄存器慢很多。相对来说开销就很大了。 nginx和redis一样采用单线程模型。是因为cpu计算不可能是它们瓶颈(所以有些耗cpu资源高的计算不适合放在nginx上做会导致响应时间变长)?进程池+单线程是指,每个worker进程都是单线程是么?

    作者回复: 1.Nginx的内容很多,看你想学哪方面了。如果是单纯的运维操作网上的资料有很多,如果是想学Nginx开发和源码就看《Nginx完全开发指南》吧。 2.说的很对,看Nginx源码可以学到很多高性能编程的技巧。 3.Nginx里也可以使用多线程,但需要“魔改”。

    2019-08-14
    5
  • Aaron
    对『进程池 + 单线程』的模式还是不太透彻。 我理解,『单线程』指的是所有 HTTP 请求放在同一个线程里通过『I/O 多路复用』的技术处理,实际就是高度集中(无阻塞)地占用了 CPU(核心)地运算能力。 那么,既然请求是单线程的,那进程池地作用又是什么呢?如果是多进程的,不就又回到进程间上下文切换的消耗问题了吗? 另,Nginx 通过 cpu affinity 将进程绑定到 CPU,假设是单 CPU,将三个 worker 进程绑定到同一个物理 CPU 地意义又在哪呢? 个人认为效率最高的方式,是按照 CPU 的核心数量创建一个『线程池』,将所有请求分配到『线程池』内不同的线程,这样在『I/O 多路复用』的加持下能跑满 CPU 的性能。

    作者回复: 1.单线程理解的很对。进程池里的每个进程都是独立的,崩溃不会影响整体服务,如果是多线程,那么线程崩溃进程也就完蛋了。 2.多进程分散运行在多个cpu上,彼此不干扰,就不会出现进程上下文切换。 3.cpu affinity 是可选的,对于单cpu就没有开启的必要,反而会增加进程切换的成本。 4.刚才说,单进程多线程的缺点就是不够稳定,一个线程出问题,整个进程都受影响。

    2020-06-01
    3
    4
  • 脱缰的野马__
    老师你好,tomcat不主流吗?

    作者回复: tomcat应该算是java容器吧,主要是实现业务,不是专门的web服务器。

    2021-03-20
    3
  • J.Smile
    说一下http2和nginx的多路复用区别和联系: http2的多路复用:多个请求复用同一个连接并行传输数据,且每个请求抽象为流传输的对象为帧序列。 nginx的IO多路复用:将多个线程的请求打散,汇入同一个线程中传输,epoll监听到事件通道可读或者可写的时候取出或者写入数据,所以nginx的IO多路复用是基于linux内核epoll实现的一种事件监听机制,是NIO非阻塞IO。

    作者回复: 说的很好。

    2020-01-20
    3
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部