浏览器


# 浏览器基础知识

# Nginx

市面主流浏览器:Nginx AND Apache (占 90 % 份额)

(1)Nginx 是轻量级(CPU/内存占用都很小)的Web服务器
(2)Nginx 并未使用“多线程”,而是使用了进程池+单线程的工作模式
(3)进程池:Nginx在启动的时候会预先创建好固定数量的worker进程,在之后的运行过程中不会再fork出新进程,并且能够自动把进程绑定到独立的CPU上,完全消除了进程创建和进程切换的成本,充分利用多核CPU的计算能力
(4)单线程的好处:“开发简单,没有互斥锁的成本,减少了系统消耗。”
(5)小前提:Web服务器是I/O密集型而不是CPU密集型==>所以要优化I/O!
(6)单线程处理能力超过多线程的原因:“I/O多路复用!”
(7)I/O多路复用:“epoll”
detail:把HTTP请求处理打成碎片,都“复用”到一个单线程里,不按照先来后到的顺序处理,而是只当连接上真正可读,可写的时候才处理,如果发生阻塞就换出去,处理其他请求。
image epoll还有一个特点:大量的连接管理工作都是在操作系统内核里做的,这就减轻了应用程序的负担,所以 Nginx 可以为每个连接只分配很小的内存维护状态,即使有几万、几十万的并发连接也只会消耗几百 M 内存,而其他的 Web 服务器这个时候早就“Memory not enough”了。

others:Nginx 使用了“职责链”模式,多个模块分工合作,自由组合,以流水线的方式处理 HTTP 请求。

Nginx的"gzip on"指令很智能,只会压缩文本数据,不会压缩图片,音频,视频。

# OpenResty

"一个人很难超越时代,而时代却可以轻易超越所有人。"

(1)Nginx的年纪太大了,Nginx的服务管理思路沿用了过去的流行做法:”使用磁盘上的静态配置文件,所以每次修改后必须重启才能生效。“缺乏灵活性。
(2)OpenResty 基于Nginx,打包了很多有用的模块和库,是一个高性能的Web开发平台。
(3)OpenResty的工作语言是Lua,它小巧灵活,执行效率高,支持“代码热加载”;
(4)“代码热加载”特性,不需要重启进程,就能够从磁盘、Redis 或者任何其他地方加载数据,随时替换内存里的代码片段。这就带来了“动态配置”,让 OpenResty 能够永不停机,在微秒、毫秒级别实现配置和业务逻辑的实时更新,比起 Nginx 秒级的重启是一个极大的进步。
(5)OpenResty的核心编程范式是“同步非阻塞”,使用协程,不需要异步回调函数;
(6)OpenResty 也使用“阶段式处理”的工作模式,但因为在阶段里执行的都是 Lua 代码,所以非常灵活,配合 Redis 等外部数据库能够实现各种动态配置。