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

35 | OpenResty:更灵活的Web服务器

ssl阶段
init阶段
闭源、商业产品的“OpenResty+”
开源、免费的“OpenResty”
可以操作Nginx内部的进程、多路复用、阶段式处理
嵌入了Lua语言
特殊阶段
灵活、易于扩展和维护
使用Lua脚本
优化库和接口
支持JIT技术
高效的Lua虚拟机
应用程序级别的多路复用
基于Lua内建的协程
代码热加载特性
用于调用底层接口
嵌入到其他应用程序里运行
分支
ngx_lua模块
一站式的Web开发平台
利用Nginx模块化、可扩展的特性
基于Nginx
需要重启才能生效
静态配置文件
处理能力高
资源占用少
阶段式处理
LuaJIT
同步非阻塞编程范式
Lua
OpenResty
缺点
高性能的Web服务器
OpenResty

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

在上一讲里,我们看到了高性能的 Web 服务器 Nginx,它资源占用少,处理能力高,是搭建网站的首选。
虽然 Nginx 成为了 Web 服务器领域无可争议的“王者”,但它也并不是没有缺点的,毕竟它已经 15 岁了。
“一个人很难超越时代,而时代却可以轻易超越所有人”,Nginx 当初设计时针对的应用场景已经发生了变化,它的一些缺点也就暴露出来了。
Nginx 的服务管理思路延续了当时的流行做法,使用磁盘上的静态配置文件,所以每次修改后必须重启才能生效。
这在业务频繁变动的时候是非常致命的(例如流行的微服务架构),特别是对于拥有成千上万台服务器的网站来说,仅仅增加或者删除一行配置就要分发、重启所有的机器,对运维是一个非常大的挑战,要耗费很多的时间和精力,成本很高,很不灵活,难以“随需应变”。
那么,有没有这样的一个 Web 服务器,它有 Nginx 的优点却没有 Nginx 的缺点,既轻量级、高性能,又灵活、可动态配置呢?
这就是我今天要说的 OpenResty,它是一个“更好更灵活的 Nginx”。

OpenResty 是什么?

其实你对 OpenResty 并不陌生,这个专栏的实验环境就是用 OpenResty 搭建的,这么多节课程下来,你应该或多或少对它有了一些印象吧。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

OpenResty: 利用Lua语言实现灵活的Web服务器 OpenResty是基于Nginx的增强模块,利用了Lua语言的灵活性,实现了动态配置和高性能的Web应用开发。关键模块ngx_lua引入了Lua脚本语言,实现了同步非阻塞编程范式,使得Web应用能够实时更新配置和业务逻辑,极大地提高了灵活性和效率。OpenResty的“流水线”由Lua脚本组成,可以从磁盘、Redis、MySQL加载,编写、调试的过程非常方便快捷。OpenResty的阶段更注重对HTTP请求响应报文的加工和处理,具有rewrite、access、content、filter等标准的HTTP处理阶段,可以嵌入Lua代码执行重定向跳转、访问控制、产生响应、负载均衡、过滤报文等功能。OpenResty还有特殊阶段“init”和“ssl”,前者在服务器初始化时运行,后者可以在TLS握手时动态加载证书。相比Nginx,OpenResty不依赖静态配置文件,支持代码热加载,使用协程,不需要异步回调函数,非常灵活,配合外部数据库能够实现各种动态配置。总之,OpenResty是一个高性能的Web开发平台,具有灵活性、高效率和动态配置的特点,为Web服务器的选择提供了更多可能性。

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

全部留言(23)

  • 最新
  • 精选
  • 老师好,多路复用理解起来有点困难,主语是什么呢? 多路 复用分别怎么理解呢?

    作者回复: 英文是I/O multiplexing,就是指多个I/O请求“复用”到一个进程或线程里处理,而不是开多个进程、线程处理。 可以看示意图再体会一下。

    2019-08-16
    25
  • 闫飞
    看起来OpenResty的核心武器是协程模型和Lua语言嵌入融合,合理照顾到了开发效率和程序执行效率之间的平衡。

    作者回复: 对。

    2019-08-19
    13
  • 阿锋
    域名一般都是带www,也可以不带www,这两者有什么区别?www的作用是什么?

    作者回复: www是“主机名”,也就是表示这台主机用于提供万维网服务。 但现在大部分互联网上的主机都是http服务器,所以www现在只是一个“历史习惯”了,比如极客时间的网站“time.geekbang.org”,虽然不是www,但也是http服务。 不带www是域名的一种简化,通常会使用重定向跳转到其他的域名。

    2019-08-17
    12
  • -W.LI-
    老师好! 同步阻塞:代码同步顺序执行,等待阻塞操作完成继续往下走。 同步非阻塞:代码顺序执行,遇见阻塞操作时,CPU执行世间会让出去,得到结果时通过callBack继续回到之前阻塞的地方。 大概是这样么? 然后就是同步阻塞的话,在阻塞的时候会占用CPU执行时间么? 同步非阻塞的话,遇到阻塞操作,主线程直接让出CPU执行时间,上下文会切换么?上下文切换开销会很大吧,如果只是让出怎么实现阻塞数据没就绪时不被分配cpu,如果一直没回调这个线程会死锁么? 代码中请求,redis,数据库这些操作是同步阻塞,还是同步非阻塞?

    作者回复: 1.基本正确,但同步阻塞的时候是这个线程被阻塞了,操作系统会把这个线程切换出去干别的,不会耗cpu,相当于这个线程没有充分利用cpu给它的资源。 2.同步非阻塞,是线程自己主动切换cpu给其他任务,但并没有让出cpu给其他线程或进程,因为在用户态,所以成本低,底层是epoll和Nginx的事件机制。 3.有超时机制,超时就会任务执行失败,不会死锁。 4.OpenResty的代码都是同步非阻塞的。

    2019-08-16
    11
  • 业余草
    老师不写OpenResty专栏亏才了

    作者回复: 可以看实体书《OpenResty完全开发指南》。

    2019-08-23
    6
  • djfhchdh
    2、“阶段式处理”,我的理解这个与“流水线”很像,许多的业务流程模型其实都可以抽象为流水线,通过配置化的方法,可以定制化地把各个模块组成业务流水线

    作者回复: good

    2019-08-16
    4
  • Aemon
    nginx reload不影响应用吧?秒级是认真的吗?

    作者回复: 我曾经见过一个Nginx实例重启,要加载几百几千个配置文件,那速度……

    2021-03-10
    3
  • 同步非阻塞,是线程自己主动切换cpu给其他任务,但并没有让出cpu给其他线程或进程,因为在用户态,所以成本低,底层是epoll和Nginx的事件机制。 老师,这块没太明白,同步和非阻塞原本是矛盾的,一个大动作由多个小动作组成,如果其中一个小动作是一个慢动作,而且是同步模式,下面的动作必然会被阻塞住吧? 你上面解释说“线程自己主动切换CPU给其他任务”, 1:那线程什么时候主动切换CPU给其他任务? 2:这里的其他任务指什么? 3:线程主动切换CPU给其他任务后处于什么状态?为什么? 5:还有我的假设中慢动作后面的动作不是被阻塞了吗? 6:还是说维度与层次不同,同步非阻塞的主体是线程,而不是线程中的一系列动作?

    作者回复: 1.协程只是同步非阻塞的一种实现方式,两者不完全等同。 2.OpenResty里的线程其实是协程,内部有调度器,当有阻塞的时候就切换到其他的协程(任务)去执行。 3.协程主动yield后就出于暂停状态,可以随时切换回来继续执行,所以它自己是阻塞的,但整个程序不会因为一个协程而被阻塞。 4.可以参考其他语言里的协程概念来理解。记住协程是用户态的线程,而在操作系统来看实际上只要一个线程,所以如果有大量的磁盘io那么必然会阻塞。

    2020-04-05
    3
  • lesserror
    老师,既然OpenResty这么厉害,为什么现在大部分公司还是用的Nginx啊?我公司都有Lua程序员,但是Web服务器还是用的Nginx。是不是学习和运维成本都挺高的啊?

    作者回复: OpenResty出来的比较晚,而且在最近几年才开始商业化推广,自然要比Nginx的市场份额要少一些,相关的资料也少,不过最近OpenResty的市场占有率已经开始快速增长了。 OpenResty其实就是Nginx加上一些非常有用的开发组件,本质上还是Nginx,但开发起来更方便。但因为它多了Lua等其他东西,功能已经不再是单纯的web server,所以用起来要复杂一点。如果是单纯搭建网站,没有二次开发的需求,自然很多人会出于简单的目的选择Nginx,但我觉得选择OpenResty会更好,更有潜力。

    2019-12-27
    3
  • 许童童
    老师你好,可以说一下OpenResty 和 nginx njs 有什么区别吗?

    作者回复: OpenResty现在已经是一个成熟的Web开发生态体系了,已经有很多商业公司基于OpenResty开发各种业务应用,底层的LuaJIT性能很高,保证了它的运行效率。 njs现在还是处于起步阶段,功能比较弱,Nginx对它的定位是“可编程配置语言”,关注点还是在辅助Nginx,而不是用来开发复杂的业务逻辑。 还有很重要的一点是OpenResty里的LuaJIT支持FFI,可以直接调用C接口,扩展性极高,而njs这方面的能力为零,只能限制在vm里。

    2019-08-16
    3
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部