web服务器 OpenResty
人丑就要多健身,这样就能在别人说你丑时,你可以揍他。
Nginx的服务管理思路延续了当时的流行做法,使用磁盘上的静态配置文件,所以每次修改后必须重启才能生效。这是nginx的一个致命的缺点,
所以针对以上缺点,OpenResty 应运而生
OpenResty并不是一个全新的Web服务器,而是基于Nginx,它利用了Nginx模块化、可扩展的特性,开发了一系列的增强模块,并把它们打包整合,形成了一个“一站式”的Web开发平台;
高效的Lua
OpenResty能够高效运行的一大“秘技”是它的“同步非阻塞”编程范式,如果你要开发OpenResty应用就必须时刻铭记于心;
“同步非阻塞”本质上还是一种“多路复用”,我拿上一讲的Nginx epoll来对比解释一下。
epoll是操作系统级别的“多路复用”,运行在内核空间。而OpenResty的“同步非阻塞”则是基于Lua内建的“协程”,是应用程序级别的“多路复用”,运行在用户空间,所以它的资源消耗要更少。
OpenResty里每一段Lua程序都由协程来调度运行。和Linux的epoll一样,每当可能发生阻塞的时候“协程”就会立刻切换出去,执行其他的程序。这样单个处理流程是“阻塞”的,但整个OpenResty却是“非阻塞的”,多个程序都“复用”在一个Lua虚拟机里运行。
OpenResty里还有两个不同于Nginx的特殊阶段:
- 一个是“init阶段”,它又分成“master init”和“worker init”,在master进程和worker进程启动的时候运行。这个阶段还没有开始提供服务,所以慢一点也没关系,可以调用一些阻塞的接口初始化服务器,比如读取磁盘、MySQL,加载黑白名单或者数据模型,然后放进共享内存里供运行时使用。
- 一个是“ssl阶段”,这算得上是OpenResty的一大创举,可以在TLS握手时动态加载证书,或者发送“OCSP Stapling”。