OpenResty从入门到实战
温铭
OpenResty软件基金会主席,《OpenResty 最佳实践》作者
立即订阅
4333 人已学习
课程目录
已完结 52 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | OpenResty,为你打开高性能开发的大门
免费
入门篇 (14讲)
01 | 初探OpenResty的三大特性
02 | 如何写出你的“hello world”?
03 | 揪出隐藏在背后的那些子项目
04 | 如何管理第三方包?从包管理工具luarocks和opm说起
05 | [视频]opm项目导读
06 | OpenResty 中用到的 NGINX 知识
07 | 带你快速上手 Lua
08 | LuaJIT分支和标准Lua有什么不同?
09 | 为什么 lua-resty-core 性能更高一些?
10 | JIT编译器的死穴:为什么要避免使用 NYI ?
11 | 剖析Lua唯一的数据结构table和metatable特性
12 | 高手秘诀:识别Lua的独有概念和坑
13 | [视频]实战:基于FFI实现的lua-resty-lrucache
14 | 答疑(一):Lua 规则和 NGINX 配置文件产生冲突怎么办?
API篇 (11讲)
15 | OpenResty 和别的开发平台有什么不同?
16 | 秒杀大多数开发问题的两个利器:文档和测试案例
17 | 为什么能成为更好的Web服务器?动态处理请求和响应是关键
18 | worker间的通信法宝:最重要的数据结构之shared dict
19 | OpenResty 的核心和精髓:cosocket
20 | 超越 Web 服务器:特权进程和定时任务
21 | 带你玩转时间、正则表达式等常用API
22 | [视频]从一个安全漏洞说起,探寻API性能和安全的平衡
23 | [视频]导读lua-resty-requests:优秀的lua-resty-*是如何编写的?
24 | 实战:处理四层流量,实现Memcached Server
25 | 答疑(二):特权进程的权限到底是什么?
测试篇 (5讲)
26 | 代码贡献者的拦路虎:test::nginx 简介
27 | test::nginx 包罗万象的测试方法
28 | test::nginx 还可以这样用?
29 | 最容易失准的性能测试?你需要压测工具界的“悍马”wrk
30 | 答疑(三)如何搭建测试的网络结构?
性能优化篇 (16讲)
31 | 性能下降10倍的真凶:阻塞函数
32 | 让人又恨又爱的字符串操作
33 | 性能提升10倍的秘诀:必须用好 table
34 | 特别放送:OpenResty编码指南
35 | [视频]实际项目中的性能优化:ingress-nginx中的几个PR解读
36 | 盘点OpenResty的各种调试手段
37 | systemtap-toolkit和stapxx:如何用数据搞定“疑难杂症”?
38 | [视频]巧用wrk和火焰图,科学定位性能瓶颈
39 | 高性能的关键:shared dict 缓存和 lru 缓存
40 | 缓存与风暴并存,谁说缓存风暴不可避免?
41 | lua-resty-* 封装,让你远离多级缓存之痛
42 | 如何应对突发流量:漏桶和令牌桶的概念
43 | 灵活实现动态限流限速,其实没有那么难
44 | OpenResty 的杀手锏:动态
45 | 不得不提的能力外延:OpenResty常用的第三方库
46 | 答疑(四):共享字典的缓存是必须的吗?
API网关篇 (4讲)
47 | 微服务API网关搭建三步曲(一)
48 | 微服务API网关搭建三步曲(二)
49 | 微服务API网关搭建三步曲(三)
50 | 答疑(五):如何在工作中引入 OpenResty?
结束语 (1讲)
结束语 | 行百里者半九十
OpenResty从入门到实战
登录|注册

06 | OpenResty 中用到的 NGINX 知识

温铭 2019-06-07
你好,我是温铭。
通过前面几篇文章的介绍,相信你对 OpenResty 的轮廓已经有了一个大概的认知。下面几节课里,我会带你熟悉下 OpenResty 的两个基石:NGINX 和 LuaJIT。万丈高楼平地起,掌握些这些基础的知识,才能更好地去学习 OpenResty。
今天我先来讲 NGINX。这里我只会介绍下,OpenResty 中可能会用到的一些 NGINX 基础知识,这些仅仅是 NGINX 很小的一个子集。如果你需要系统和深入学习 NGINX,可以参考陶辉老师的《NGINX 核心知识 100 讲》,这也是极客时间上评价非常高的一门课程。
说到配置,其实,在 OpenResty 的开发中,我们需要注意下面几点:
要尽可能少地配置 nginx.conf;
避免使用 if、set 、rewrite 等多个指令的配合;
能通过 Lua 代码解决的,就别用 NGINX 的配置、变量和模块来解决。
这样可以最大限度地提高可读性、可维护性和可扩展性。
下面这段 NGINX 配置,就是一个典型的反例,可以说是把配置项当成了代码来使用:
location ~ ^/mobile/(web/app.htm) {
set $type $1;
set $orig_args $args;
if ( $http_user_Agent ~ "(iPhone|iPad|Android)" ) {
rewrite ^/mobile/(.*) http://touch.foo.com/mobile/$1 last;
}
proxy_pass http://foo.com/$type?$orig_args;
}
这是我们在使用 OpenResty 进行开发时需要避免的。

NGINX 配置

我们首先来看下 NGINX 的配置文件。NGINX 通过配置文件来控制自身行为,它的配置可以看作是一个简单的 DSL。NGINX 在进程启动的时候读取配置,并加载到内存中。如果修改了配置文件,需要你重启或者重载 NGINX,再次读取后才能生效。只有 NGINX 的商业版本,才会在运行时, 以 API 的形式提供部分动态的能力。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《OpenResty从入门到实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • TomShine
    OpenResty 的作者NGINX 教程可以在这个连接 https://openresty.net.cn/agentzh-nginx-guide.html 进行学习

    作者回复: 👍

    2019-06-10
    6
  • 天天~
    njs 的意义感觉在部署的时候大幅度简化运维的步骤。njs 或者没有 luajit 的性能,但对比之下,比 lua 的生态环境好太多太多了,js 的生态和入门的容易。

    作者回复: 没错,除了 njs,还有 PHP 嵌入 nginx 的尝试,这些语言的普及度和生态比 Lua 好很多。OpenResty 要加油

    2019-06-07
    1
    3
  • 回家
    温铭老师,你好。看了这篇文章之后,有下面这些疑问,希望老师答疑解惑下。
    1.nginx和openresty有什么版本对应关系?记得前两个版本号是相同的。
    2.为什么openresty的版本越来越小?是为了表达有些功能不支持了吗?
    3.openresty可执行文件是nginx可执行文件的软链接,本能的以为openresty的热升级就是nginx的热升级,openresty的热升级和nginx的热升级不一样吗?
    4.nginx热升级步骤没有涉及到外部程序,这里说的热升级中依赖的外部程序是指什么呢?
    5.init_by_lua预先加载模块,在请求的其他阶段就可以直接使用这个模块,这个模块此时相当于是全局变量?还有一个问题是,如果在一个请求的多个阶段重复加载某一模块,这个模块会重复加载,还是只加载一次?
    6.nginx修改配置文件,需要重新加载;nginx又支持热部署,请问这里的本末倒置怎么个说法?:)

    作者回复: 1. OpenResty 的版本号是跟着它所使用的 Nginx 来确定的,比如 OpenResty 的 1.15.8.1,使用的 Nginx 版本号就是 1.15.8,最后的 1 是 OpenResty 自己的小版本号;
    2. OpenResty 的版本号是往上增加的,不太清楚越来越小是怎么看出来的呢?
    3. 热升级步骤和 nginx 一致;
    4. 这里的外部程序是指:你需要一个 nginx 之外的进程给 nginx 本身发送信号量,nginx 才能升级;而 OpenResty 有了特权进程之后,可以自己给master 进程发送信号量;
    5. 相当于其他 worker 进程都已经加载过这个模块,不用重复加载;一个模块只会被加载一次,不管有多少请求来访问,和阶段无关;
    6. 二进制热升级是很少用到的功能,但 nginx 支持了热部署;修改配置文件是常用的功能,但却需要 reload 才能生效。没有把常用的功能做到极致,所以我觉得有些本末倒置。

    2019-06-08
    2
  • 徐永健
    ngx改配置不需要重启啊。。

    作者回复: 需要 reload

    2019-06-07
    2
  • emen
    温铭老师,您好。学习了这篇文章之后,对body_filter_by_lua存在疑问请老师解惑。拟想根据文中案例对返回报文进行加密,但发现body_filter_by_lua存在执行多次的情况,遇到此情况应如何处理?

    作者回复: body_filter_by_lua 执行多次是正常的,因为响应体可能是 chunked 返回的。所以,如果你要对响应体整体加密的话,就要改为一次性返回,而不是 chunked 模式。

    2019-06-27
    1
  • John
    我正在做一个二次验证的风控,请教一个问题,op如何将一整个request序列化存储起来,并且在风控条件达到后,如滑动验证通过,再将其反序列化发送到上游服务?

    作者回复: 感觉这个不用序列化存储,你可以在 access 阶段调用风控服务的 API 接口,把 request 内容传过去,等风控返回后,根据结果在决定是发送到上游,还是拒绝。
    你可以看下本章节 OpenResty 11 个 `*_by_lua` 指令的图片。

    2019-06-07
    1
  • nicknick
    是信号(signal)不是信号量(semaphore)
    2019-11-29
  • 卡卡
    可能想吸引更多开发者,如果推广的好,node.js估计没戏了!
    2019-11-07
  • 普罗米修斯
    老师,openresty可以只升级nginx吗,可以不升级openresty吧……如果有,请指点下,生产环境有漏洞需要我修复下,谢谢了🙏

    作者回复: 最好不要怎么做,这样无法和开源的主线保持一致,而且不能保证所有功能是正常的。最好的方法是给官方提交 PR,合并到主线去。

    2019-07-01
  • Kinga
    二进制热升级和配置文件reload更新,都需要给master发信号,不理解本末倒置的说法。作者是希望nginx能够自动检查到配置文件有变更,然后自动重新加载吗?

    作者回复: 我的意思是配置文件的修改是一个更频繁的操作,而二进制热升级并不频繁。应该优先实现前者的热更新。

    2019-06-22
  • 宝仔
    apache和nginx都是多进程吧!只是apache有预先开启多少个进程或者动态fork进程

    作者回复: 是的,多谢指正

    2019-06-16
  • nanyun
    你好,一直在关注resty,想问一下nginx后面出的unit,和它对比有哪些优劣点。

    作者回复: OpenResty 可以无痛的替换 nginx,同时提供了 Lua API 来做动态的控制,这个是它最大的优势。nginx unit 是为了微服务出的产品,两个感觉不在一个层面上。

    2019-06-16
  • 付正立
    问个低级的问题:热升级的时候,已经建立的连接是继续保持吗?是不是因此才保留旧进程?

    作者回复: 保留旧的 master 进程是为了方便回滚。旧的 worker 进程是不保留的。

    2019-06-13
  • life_牛
    我服务是https的,做反向代理的话,需要在nginx的https模块吧?如果不在nginx 里面配置https证书如何用https的请求访问服务?

    作者回复: 你想实现类似 cloudflare 的 Keyless 功能?不在 Nginx 中配置的话,就要增加代码逻辑,并在远端服务器配置,不然 https 握手就失败了。

    2019-06-10
  • 回家
    关于看出openresty 版本越来越小
    文中有这样一段话:
    比如 NGINX 在 2018 年 3 月份发布的 1.13.10 版本中,增加了对 gRPC 的支持,但 OpenResty 在 2019 年 4 月份时的最新版本是 1.13.6.2,由此可以推断 OpenResty 还不支持 gRPC。

    我把1.13.10看成了是openresty的版本了😂
    不好意思,麻烦老师了~
    2019-06-09
  • 叫我图图就可以了
    好像有点小错误,apache才是那个多进程的。

    作者回复: 多谢指正

    2019-06-09
  • mrmsl
    Nginx NJS 几乎就要变得跟 OpenResty 几乎一样啦!

    作者回复: 至少方向是对的

    2019-06-08
  • 小羊
    OpenResty 的作者多年前写过一个 NGINX 教程。这个链接 里面的目录都打不开

    作者回复: 果然,看来是官网链接出问题了。你可以谷歌搜索标题找下其他地方的资源。

    2019-06-07
  • 石仔
    js有大批的语法熟悉用户,只要能力够能就能大量实践

    作者回复: 百花齐放

    2019-06-07
收起评论
19
返回
顶部