您的位置:首页 > 移动开发 > 微信开发

[OpenResty动态] 201705微信群

2017-05-15 15:08 501 查看
17年5月 OpenResty 一些动态,主要来自微信群,方面大家检索和查找。

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/#ngxtimerevery

ngx.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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息