由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 |