透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

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

Chrono 2019-08-14
经过前面几大模块的学习,你已经完全掌握了 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(11)

  • 许童童
    你是怎么理解进程、线程上下文切换时的成本的,为什么 Nginx 要尽量避免?
    当从一个任务切换到另一个任务,当前任务的上下文,如堆栈,指令指针等都要保存起来,以便下次任务时恢复,然后再把另一个任务的堆栈加载进来,如果有大量的上下文切换,就会影响性能。

    试着自己描述一下 Nginx 用进程、epoll、模块流水线处理 HTTP 请求的过程。
    Nginx 启动进程,一个master,多个worker,创建epoll,监听端口,多路复用来管理http请求,http请求到达worker内部,通过模块流水线处理,最后返回http响应。

    作者回复: √

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

    作者回复: great。

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

    作者回复: great

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

    作者回复:
    1.Nginx的内容很多,看你想学哪方面了。如果是单纯的运维操作网上的资料有很多,如果是想学Nginx开发和源码就看《Nginx完全开发指南》吧。

    2.说的很对,看Nginx源码可以学到很多高性能编程的技巧。

    3.Nginx里也可以使用多线程,但需要“魔改”。

    2019-08-14
    1
  • Leon📷
    切换cpu需要保存线程的上下文,然后再切回去,这是开销

    作者回复: √

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

    作者回复: nginx也是单线程的,和redis一样自己封装了epoll。单线程的好处是没有race condition,处理简单。

    nginx比redis高明的一点是多进程,提高了稳定性和并发能力。

    2019-12-10
  • 蓝配鸡
    买书为敬。

    作者回复: 感谢支持,有问题也可以在GitHub上提issue。

    2019-10-30
  • 👻 小二
    线程是用来解决IO阻塞时CPU浪费的问题, 如果没有IO阻塞的问题, 单线程最能发挥CPU的能力,多线程反而要花时间切换。
    由于CPU一般有多核, 所以不考虑阻塞的话, 几个核就 几个线程, 将是最佳选择。

    作者回复: 对,所以Nginx采用的是多进程+单线程的模式。

    2019-08-23
  • Been
    感觉和 node 类似

    作者回复: 其实底层都是epoll。

    2019-08-15
  • 阿锋
    缓存服务器,是属于正向代理还是反向代理,还是根据情况而定。

    作者回复: 正向代理和反向代理是根据它所在的位置来定义的,靠近客户端就是正向,靠近服务器就是反向。

    代理与缓存是不相关的,代理可以没有缓存功能。

    2019-08-14
  • 趙衍
    老师请问一下Nginx相比于其他的服务器,比如Tomcat,具体有哪些优势呢?

    作者回复: 高并发高性能、低资源消耗、稳定,配置方便,功能丰富。

    2019-08-14
收起评论
11
返回
顶部