[OpenResty动态] 201705微信群
2017-05-15 15:08
501 查看
17年5月 OpenResty 一些动态,主要来自微信群,方面大家检索和查找。
当然,通过这个特权 agent 进程也可以操纵整个操作系统了,其实,比如自动运行 ebpf 程序或 systemtap 动态追踪工具。OpenResty 真可以成为一个超级控制平台了。
如果有朋友想尝鲜此新功能(以及其他的新功能),请下载这里的 OpenResty 预览版:https://openresty.org/download/openresty-1.11.2.4rc0.1.tar.gz
PCRE JIT 栈大小的 Lua API 最近刚合并了:https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/re.md#opt PCRE 默认的 JIT 栈只有 32KB,确实小了点。该功能已包含在最近发的 OR 预览版中。欢迎尝鲜。我们的 fanlang 编译器编译 edgelang 编译器所生成的 Lua 程序,就让 PCRE JIT 栈溢出了。
yield 了的 Lua 协程会在下一个 nginx 事件处理周期里接着继续运行。这两个相邻的事件周期之间的超时设置为 0,所以并不会引入额外的 I/O 延时。据此可以实现基于自愿弃权的 CPU 时间片管理。
利用该特性,可以避免密集计算的 Lua 代码阻塞 nginx 事件循环过长时间。即重计算的 Lua 代码可以在中间的几段位置上主动弃权,从而确保当前 OS 线程可以及时处理新的 I/O 事件,避免其他并发请求的 I/O 操作超时或延时过长。相比多线程和抢占式调度的方式,这种自愿弃权要安全和简单得多
今天同时在 OpenResty 中给 nginx 核心打了一个小补丁,修了一个由来已久的问题,即当 master_process 配置为 off 时,nginx 是不会优雅退出的,而是直接暴力退出当前进程。这个问题一直影响到我们的 resty 命令行工具的行为,现在终于会自动等待用户创建的所有轻线程和定时器都结束后,才退出了。
worker 之间的数据交换,目前官方只提供了 shdict 共享内存的方案,配合共享内存队列 + ngx.sleep() 轮询可以满足一大类需求. 更高效的控制流的跨 worker 同步,有赖于 cosocket 的 listen() 和 accept() API。届时 worker 之间可以高效地通过 unix domain socket 同步控制流和数据流。我们近期会添加这个功能
lua-resty-string aes 使用哪种padding模式
默认使用padding模式和 openssl 一样 PKCS7
Python 版本的一个例子
OpenResty 新特性
enable_privileged_agent
院生同学最近给 OpenResty 贡献了 ngx.process 模块,可以开启一个特殊的特权 nginx agent 进程,类似 worker 进程,但不监听虚拟主机的那些端口,同时也继承和 nginx master 进程一样的系统帐号。文档在这里:https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/process.md#enable_privileged_agent 通过该特权 agent 进程,可以实现对 nginx 服务的自我控制,比如发信号啥的。当然,通过这个特权 agent 进程也可以操纵整个操作系统了,其实,比如自动运行 ebpf 程序或 systemtap 动态追踪工具。OpenResty 真可以成为一个超级控制平台了。
resty 命令行工具
刚刚给我们的 resty 命令行工具添加了 –gdb 和 –rr 这两个新的命令行选项,可以分别通过 gdb 和 rr record 来运行底层的 nginx 进程。结合原来就有的 –valgrind 选项,可以方便我们直接通过 resty 工具来调试底层的 openresty/nginx/luajit 问题。官方文档在这里:https://github.com/openresty/resty-cli#readme实时捕获 nginx 错误日志消息的 Lua API
这两天合并了院生同学贡献给 OpenResty 的实时捕获 nginx 错误日志消息的 Lua API:https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/errlog.md#get_logs 同时支持在 Lua 里面动态设置过滤 log level:https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/errlog.md#set_filter_level 捕获直接发生在内存中,不涉及任何文件操作。错误日志也成为可以直接操纵的内存数据了。方便做 OpenResty 内部的实时错误日志采集和在线反馈了。如果有朋友想尝鲜此新功能(以及其他的新功能),请下载这里的 OpenResty 预览版:https://openresty.org/download/openresty-1.11.2.4rc0.1.tar.gz
调整 PCRE JIT 栈大小的 LuaAPI
Andreas Lubbe 同学给 OpenResty 贡献的设置PCRE JIT 栈大小的 Lua API 最近刚合并了:https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/re.md#opt PCRE 默认的 JIT 栈只有 32KB,确实小了点。该功能已包含在最近发的 OR 预览版中。欢迎尝鲜。我们的 fanlang 编译器编译 edgelang 编译器所生成的 Lua 程序,就让 PCRE JIT 栈溢出了。
ngx.timer.every()
今天合并了德江贡献的 ngx.timer.every() 这个 Lua API 函数。现在可以在 OpenResty 里面方便地创建周期触发的定时器了,这比通过原来的 ngx.timer.at() 手动来创建这种定时器要更方便,也更健壮。对应的文档在这里:https://github.com/openresty/lua-nginx-module/#ngxtimereveryngx.sleep(0)
今天合并了大同贡献的补丁,现在 OpenResty 中的 ngx.sleep(0) 调用会主动放弃当前的 CPU 执行权,而把执行权交还给 nginx 事件循环和其他并发请求。当前yield 了的 Lua 协程会在下一个 nginx 事件处理周期里接着继续运行。这两个相邻的事件周期之间的超时设置为 0,所以并不会引入额外的 I/O 延时。据此可以实现基于自愿弃权的 CPU 时间片管理。
利用该特性,可以避免密集计算的 Lua 代码阻塞 nginx 事件循环过长时间。即重计算的 Lua 代码可以在中间的几段位置上主动弃权,从而确保当前 OS 线程可以及时处理新的 I/O 事件,避免其他并发请求的 I/O 操作超时或延时过长。相比多线程和抢占式调度的方式,这种自愿弃权要安全和简单得多
其他
今天我顺手给 OpenResty 添加了一个新的 Lua API 函数,可以主动触发当前的 nginx 进程优雅退出。放在了 ngx.process 模块里面,作为 signal_graceful_exit:https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/process.md#signal_graceful_exit 实现上非常简单高效,只是设置了一个叫做 ngx_quit 的 C 全局变量,并不涉及任何 UNIX 信号操作或 IPC。resty 命令行工具已经用上这个特性了。今天同时在 OpenResty 中给 nginx 核心打了一个小补丁,修了一个由来已久的问题,即当 master_process 配置为 off 时,nginx 是不会优雅退出的,而是直接暴力退出当前进程。这个问题一直影响到我们的 resty 命令行工具的行为,现在终于会自动等待用户创建的所有轻线程和定时器都结束后,才退出了。
交流
请教一下,work之间怎么通信呢?worker 之间的数据交换,目前官方只提供了 shdict 共享内存的方案,配合共享内存队列 + ngx.sleep() 轮询可以满足一大类需求. 更高效的控制流的跨 worker 同步,有赖于 cosocket 的 listen() 和 accept() API。届时 worker 之间可以高效地通过 unix domain socket 同步控制流和数据流。我们近期会添加这个功能
lua-resty-string aes 使用哪种padding模式
默认使用padding模式和 openssl 一样 PKCS7
Python 版本的一个例子
#coding:utf-8 #pycrypto (2.6.1) from Crypto.Cipher import AES def aes_128_cbc_encrypt(key, iv, msg): # 对应到 lua-resty-string aes PKCS#7 模式 BS = AES.block_size pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) cipher = AES.new(key, AES.MODE_CBC, iv) return cipher.encrypt(pad(msg)) def aes_128_cbc_decrypt(key, iv, msg): # 对应到 lua-resty-string aes PKCS#7 模式 unpad = lambda s : s[0:-ord(s[-1])] cipher = AES.new(key, AES.MODE_CBC, iv) msgwithpadding = cipher.decrypt(msg) return unpad(msgwithpadding)
相关文章推荐
- openresty(完整版)Lua拦截请求与响应信息日志收集及基于cjson和redis动态路径以及Prometheus监控
- 在CentOS 6.9 x86_64的OpenResty 1.13.6.1上使用基于Redis实现动态路由示例
- openresty 动态摘除流量
- openresty(完整版)Lua拦截请求与响应信息日志收集及基于cjson和redis动态路径以及Prometheus监控(转)
- 利用openresty动态设置host
- openresty动态扩容支持持久化(完整版)
- 用openresty实现动态upstream
- Openresty 动态2017.8
- openresty--基于redis实现一个动态路由
- 在treeview中动态加载xml文件(csdn整理)
- 用javascript动态调整iframe高度
- Delphi实现下载进程的动态显示
- js--- 动态加载checkbox的onclick事件
- 随滚动条位置动态加载页面图片
- verilog的1602动态显示
- Java动态代理学习2——静态代理和动态代理
- 由K倍动态减法联想到的一类博弈问题 HDOJ 2580
- 动态内存分配
- easyui 动态修改窗口title
- Repeater动态增加行,PostBack保留数据