Dear All:
在之前和同事的一些讨论和工作需要中,我们想要运行一些 lua定时脚本,但是为了安全性,希望这些脚本不暴露为接口(当然用一些验证方法也可以提升安全性,但是为了更加简便和快捷)。因此我想到在 openresty
中加一个 client 的部分。之前也有学习过使用perl模拟的client,但是更想能实现如下一些功能:
1. 能够访问如 shared_dict 等一些服务器本身的数据
2. 类似于resty-client,能够直接./resty-client 'CODE' 执行自己的代码,或者文件
因为上面的一些理由,我尝试fork出一个
具有 openresty-client 功能的分支。大概逻辑为:
1.因为不需要接受很多的请求,因此只在其中一个 worker 上建立了所需的 socket(之前尝试过使用named pipe,但是在双向通信和那个文件的关闭上感觉不太好用),放入到 nginx 的 event 事件中监听;
2.基于 init_worker 中的 lmcf 创建自己的 vm。供之后执行 lua 代码使用。其中为了方便 client 的作用,现在是没有用到缓存代码的逻辑的;
3.相应客户端请求,并使用 ngx_http_lua_create_fake_connection 和 ngx_http_lua_create_fake_request 创建出本次执行所需的 connection 和 request,使用 ngx_http_lua_run_thread 执行代码;
4.在执行完毕 lua 代码后,在 connection 的 send_chain 方法中将内容返回给客户端;
我计划还有一些设想:
1.可以配置的客户端 socket 地址和端口;
2.将错误信息能够返回给客户端;
3.将这个 client 做成一个 nginx 的module, 便于安装,且防止对 ngx_lua_module 过多伤害;
大家对这种 client 有没有什么想法或其他意见?