OpenResty从入门到实战
温铭
OpenResty软件基金会主席,《OpenResty 最佳实践》作者
立即订阅
4332 人已学习
课程目录
已完结 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从入门到实战
登录|注册

36 | 盘点OpenResty的各种调试手段

温铭 2019-08-16
你好,我是温铭。
在 OpenResty 的交流群里面,经常会有开发者提出这样的疑问:OpenResty 里面怎么调试呢?据我所知,OpenResty 中有一些支持断点调试的工具,包括 VSCode 中的插件,但至今使用并不广泛。包括作者 agentzh 以及我认识的几个贡献者在内,大家都是使用最简单的 ngx.logngx.say 来做调试。
显然,这对于大部分的新手来说并不友好。难道说众多 OpenResty 的核心维护者们,在遇到疑难杂症的时候,手里就只有打印日志这个原始的方法了吗?
当然不是,在 OpenResty 的世界中,SystemTap 和火焰图,才是处理棘手问题和性能问题的标准利器。如果你在邮件列表或者 issue 里面有这方面的提问,项目的维护者肯定会让你上传火焰图,要求用图说话而不是文字描述。
接下来的两节课,我就和你聊聊调试,以及 OpenResty 专门为调试而创造的工具集。今天我们先来看下,有哪些调试程序的方法。

断点和打印日志

在我工作的很长一段时间里面,我都是依赖编辑器的高级调试功能来跟踪程序的,这个看上去也是理所当然的。对于能在测试环境中重现的问题,不管有多复杂,我都有信心可以找到问题的根源,这是因为,这个 bug 可以被不停地重复制造出来。只要通过设置断点和增加日志,问题的根源就会慢慢浮出水面,你所需要的,只是耐心罢了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《OpenResty从入门到实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(7)

  • 许童童
    不要给我说什么动态调试,火焰图!老夫用console高度代码就是一把梭!
    2019-08-16
    2
    3
  • krugle
    coroutine 0:
    [C]: in function 'send'
    ...ocal/webserver/openresty-1.15.8.1/lualib/resty/redis.lua:255: in function 'get'
    /data/script/dynamicssl.lua:125: in function 'getCertRedis'
    /data/script/dynamicssl.lua:258: in function 'main'
    /data/script/dynamicssl.lua:286: in main chunk, context: ssl_certificate_by_lua*, client: 183.17.230.47, server: 0.0.0.0:443
    2019/08/16 18:02:02 [crit] 21643#0: *47373 SSL_do_handshake() failed (SSL: error:1408A179:SSL routines:ssl3_get_client_hello:cert cb error) while SSL handshaking, client: 183.17.230.47, server: 0.0.0.0:443
    2019/08/16 18:02:02 [error] 21643#0: *47376 [lua] dynamicssl.lua:261: main(): youyouwx.club,set cert by redis, context: ssl_certificate_by_lua*, client: 183.17.230.47, server: 0.0.0.0:443
    2019/08/16 18:02:02 [error] 21644#0: *47379 attempt to send data on a closed socket: u:0000000000000000, c:0000000000000000, ft:0 eof:0, context: ssl_certificate_by_lua*, client: 183.17.230.47, server: 0.0.0.0:443
    2019/08/16 18:02:02 [error] 21644#0: *47379 [lua] dynamicssl.lua:261: main(): youyouwx.club,set cert by redis, context: ssl_certificate_by_lua*, client: 183.17.230.47, server: 0.0.0.0:443
    这个是什么问题,看了好多文章也找不到啊

    作者回复: 从错误信息里面只能看到是 ssl 握手失败了。具体的还需要描述下这个错误是如何产生的。

    2019-08-16
    1
    1
  • 阳光梦
    个人觉得,1,日志调试; 2,二分法日志调试;3,火焰图; 4,gdb。够了
    2019-08-16
    1
  • 阳光梦
    老师说了这么多,哪个去重点啊?

    作者回复: 这个看情况了,一般是日志和火焰图

    2019-08-16
    1
  • helloworld
    老师,最近写项目遇到了一个奇怪的问题,ngx.location.capture 请求其他的内部location的时候,会跳过该location的access阶段,反复测试发现rewrite阶段代码执行了,content阶段代码也执行了,就是access阶段代码不执行,这个是什么原因呢?
    2019-08-17
  • krugle
    求助,我们有几千个域名绑定,导致nginx每个进程800m,现在使用openresty动态加载 刚弄完还没上线 这个有没有什么坑,就是每次获取servername 然后清除之前的证书 在重新设置证书,请教下有没有什么坑,会不会有并发问题

    作者回复: lrucache+共享字典两层缓存,不用把所有证书都加载在内存中

    2019-08-16
    2
  • 程斌
    好范。
    2019-08-16
收起评论
7
返回
顶部