Jusene's Blog

初识 OpenResty

字数统计: 1.2k阅读时长: 4 min
2019/05/26 Share

由agentzh创立开源项目openresty成功把lua语言嵌入了nginx,用lua作为“胶水语言”粘合语言“粘合nginx的各个模块和底层接口,以脚本的方式直接实现复杂的HTTP/TCP/UDP业务逻辑,降低了web server–特别是高性能web server的开发门槛。

Openresty组成

Openresty的核心组成部分有四个:

  • Nginx 高性能的web服务器
  • LuaJIT 高效的Lua语言解释器/编译器
  • ngx_lua(http_lua) 处理http协议,让Lua程序嵌入在nginx里运行
  • stream_lua 与ngx_lua类似,但处理的是tcp/udp协议

Nginx常用组件

  • ngx_iconv 转换不同的字符集编码
  • ngx_encrypted 使用AES-256算法执行简单的加密运算
  • ngx_echo 提供一系列“echo”风格的指令和变量
  • ngx_set_misc 增强的“set_xxx”指令,用来操作变量
  • ngx_headers_more 更方便地处理http请求头和响应头的指令
  • ngx_memc 支持各种memcached操作
  • ngx_redis2 支持各种redis操作
  • ngx_dizzle 支持各种mysql操作
  • ngx_postgres 支持各种postgresql操作

Lua常用组件
openresty里的lua组件通常以lua源码的方式提供(.lua),但个别组件为追求效率以c语言实现,是动态链接库的形式(.so)

  • lua_core openresty的核心功能库
  • lua_cjson 处理json格式的数据,速度很快(使用c语言实现)
  • lua_string hex/md5/sha1/sha256等字符串功能
  • lua_upload 流式处理http的上行数据
  • lua_healthcheck 后端集群健康检查
  • lua_limit_traffic 定制流量控制策略
  • lua_lock 基于共享内存的非阻塞锁
  • lua_lrucache 高效LRU缓存的功能
  • lua_dns 高效、非阻塞的dns解析功能
  • lua_websocket 高效、非阻塞的websocket功能
  • lua_redis redis客户端,用起来比ngx_redis2更灵活
  • lua_memcached memcached客户端,用起来ngx_memc更灵活
  • lua_mysql mysql客户端,用起来比ngx_dizzle更灵活

辅助工具

  • opm 类似rpm、npm的管理工具,用来安装各种功能组件
  • resty-cli 以命令行的形式直接执行openresty/lua程序
  • restydoc 类似man的参考手册,非常详细

安装openresty

1
yum install -y gcc openssl-devel pcre-devel perl perl-Digest-MD5
2
3
./configure --prefix=/usr/local/openresty --with-http_v2_module --with-http_realip_module --with-http_ssl_module --with-http_stub_status_module --user=openresty
4
5
gmake && gmake install

/usr/local/openresty

  • bin 存放可执行文件
  • luajit luajit运行库
  • lualib lua组件
  • nginx nginx核心运行平台
  • pod 参考手册(restydoc)使用的数据
  • site 包管理工具(opm)使用的数据

组件管理工具

openresty维护一个官方组件库(opm.openresty.org),opm就是库的客户端,可以把组件库里的组件下载到本地。

opm:

  • search 以关键字检索相关的组件
  • get 安装功能组件(注意不是install)
  • info 显示已安装组件的详细信息
  • list 列出所有本地已经安装的组件
  • upgrade 更新某个已安装组件
  • update 更新所有已安装组件
  • remove 移除某个已安装组件

opm默认的操作目录”/usr/local/openresty/site”,但是我们也可以在命令前使用参数”–install-dir=PATH”安装到其他目录,或者使用参数”–cwd”安装到当前目录的”./resty_modules”目录下

命令行工具

OpenResty 在bin目录下提供一个命令行工具resty,可以把它作为Lua语言的解释器(但运行在OpenResty)代替标准的lua,写出类似perl, python那样的脚本。

resty的工作原理是启动一个“无服务”的nginx实例,禁用daemon等大多数指令,也没有配置监听端口,只是在worker进程里用定时器让lua代码在nginx里执行。

1
./resty -e "print('hello openresty')"
1
#!/usr/local/openresty/bin/resty
2
print('hello openresty')
1
#!/usr/local/openresty/bin/resty
2
3
local n = #arg
4
print("args count = ", n)
5
6
for i = 0,n do
7
    print("arg ", i, ": ", arg[i])
8
end

resty工具还有很多选项用于配置行为:

  • -c:指定最大并发连接数(默认值64)
  • -I:指定Lua库的搜索路径
  • -l:指定加载某个Lua库
  • –http-conf:定制在http域里的指令
  • –main-include:定制在main域里的指令
  • –shdict:定制使用的共享内存
  • –resolve-ipv6:允许解析ipv6的地址

参考文档

openresty附带完整的用户参考手册restydoc:

  • OpenResty各个组件的介绍和用法
  • OpenResty指令和功能接口的用法
  • Nginx介绍、用法、基本工作原理
  • Lua/LuaJIT语法要素

restydoc的用法,其中“-s”参数用来指定搜索手册的小节名:

1
restydoc nginx       nginx的说明
2
restydoc luajit      luajit的说明
3
restydoc opm         包管理工具opm的说明
4
5
restydoc -s proxy_pass  反向代理指令proxy_pass的说明
6
restydoc -s ngx.say  功能接口ngx.say的说明

使用opm安装的组件:

1
restydoc -r /usr/local/openresty/site -s lua-resty-http
CATALOG
  1. 1. Openresty组成
  2. 2. 安装openresty
  3. 3. 组件管理工具
  4. 4. 命令行工具
  5. 5. 参考文档