从Hello World初识OpenResty
1 | resty -e "ngx.say('hello world')" |
简介
OpenResty是一个兼具开发效率和性能的服务端开发平台,它的核心是基于Nginx的一个C模块(lua-nginx-module),该模块将LuaJIT嵌入到Nginx服务器中,并对外提供一套完整的Lua API,透明地支持非阻塞I/O,提供了轻量级线程、定时器等高级抽象。同时,围绕这个模块,OpenResty构建了一套完备的测试框架、调试技术以及由Lua实现的周边功能库。
安装
跟着官方文档走就行,说的很清楚,我使用的系统版本是Ubuntu 18.04。
如果已经开启运行了Nginx,需要先关闭停止Nginx服务
1 | sudo systemctl disable nginx |
1 | import our GPG key: |
安装完毕后,可以通过which查看OpenResty的CLI: resty的位置:
1 | which resty |
Hello World
像简介上面的写法,便是resty最简单输出Hello World的代码。
内嵌代码
首先创建工作目录
1 | mkdir restywork |
在conf目录下新建一个简化的nginx.conf,在其中添加OpenRestry的content_by_lua指令,嵌入ngx.say
代码,内容如下:
1 | cat conf/nginx.conf |
此时启动openresty服务:
1 | openresty -p `pwd` -c conf/nginx.conf |
没有报错就代表启动成功。
使用curl或者浏览器访问即可:
1 | curl -i 127.0.0.1:8080 |
引入Lua脚本
在restywork中创建一个目录单独存放Lua代码:
1 | mkdir lua_script |
现在可以去修改nginx.conf的配置,将content_by_lua_block
修改为content_by_lua_file
:
1 | cat conf/nginx.conf |
然后通过reload更新:
1 | openresty -p `pwd` -c conf/nginx.conf -s reload |
再次使用curl或者浏览器访问:
1 | curl -i 127.0.0.1:8080 |
关于缓存
Lua代码的变更,需要reload才能生效,所以在调试的时候,最好关闭 lua_code_cache
这个选项。
1 | lua_code_cache off; |
关闭lua_code_cache
之后,OpenResty会给每个请求创建新的Lua VM。由于没有Lua module的缓存,新的VM会去加载刚最新的Lua文件。这样,你修改完代码后,不用reload Nginx就可以生效了。在生产环境下记得打开这个选项。
当然,由于每个请求运行在独立的Lua VM里,lua_code_cache off
会带来以下几个问题:
- 每个请求都会有独立的module,独立的lrucache,独立的timer,独立的线程池。
- 跟请求无关的模块,由于不会被新的请求加载,并不会主动更新。比如
init_by_lua_file
引用的文件就不会被更新。 *_by_lua_block
里面的代码,由于不在Lua文件里面,设置lua_code_cache
对其没有意义。
如果调试的目标涉及以上内容,仍需设置lua_code_cache on
,通过reload来更新代码。
在nginx.conf中添加lua_code_cache off
:
1 | cat conf/nginx.conf |
通过reload更新
1 | openresty -p `pwd` -c conf/nginx.conf -s reload |
接下来修改hello.lua中的内容,并使用curl进行访问:
1 | cat lua_script/hello.lua |
关闭服务
以上就是使用OpenResty完成Hello World的过程,现在可以关闭服务了
1 | openresty -s quit -p `pwd` -c conf/nginx.conf |