一、OpenResty 的安装
# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/
# update the yum index:
sudo yum check-update
然后你可以安装一个包,比如openresty,像这样:
sudo yum install openresty
如果要安装resty命令行实用程序,请安装openresty-resty如下所示的软件包:
sudo yum install openresty-resty
二、resty写第一个 OpenResty 程序
$ resty -e "ngx.say('hello world')"
hello world
三、更正式的 hello world
需要三步才能完成:
a、创建工作目录;
b、修改 NGINX 的配置文件,把 Lua 代码嵌入其中;
c、启动 OpenResty 服务。
创建工作目录:
mkdir geektime
cd geektime
mkdir logs conf
下面是一个最简化的 nginx.conf,在根目录下新增 OpenResty 的content_by_lua指令,里面嵌入了ngx.say的代码:
$ cat conf/nginx.conf
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
server {
listen 8090;
location / {
content_by_lua 'ngx.say("hello, world")';
}
}
}
确认是否已经把openresty加入到PATH环境中;然后,启动 OpenResty 服务就可以了:
openresty -p `pwd` -c conf/nginx.conf
没有报错的话,OpenResty 的服务就已经成功启动了。可以打开浏览器,或者使用 curl 命令,来查看结果的返回:
# curl -i 127.0.0.1:8090
HTTP/1.1 200 OK
Server: openresty/1.19.9.1
Date: Mon, 27 Sep 2021 08:42:05 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
hello, world
如何把 Lua 代码从 nginx.conf 里面抽取出来,保持代码的可读性和可维护性呢?
在 geektime 的工作目录下,创建一个名为 lua 的目录,专门用来存放代码:
$ mkdir lua
$ cat lua/hello.lua
ngx.say("hello, world")
然后修改 nginx.conf 的配置,把 content_by_lua 改为 content_by_lua_file:
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
server {
listen 8090;
location / {
content_by_lua_file lua/hello.lua;
}
}
}
最后,重启 OpenResty 的服务就可以了:
$ sudo kill -HUP `cat logs/nginx.pid`
四、问题及答案
1、content_by_lua_file lua/hello.lua; 里面写的是相对路径,那么 OpenResty 是如何找到这个 Lua 文件的?
如果原本给出的是相对路径,那么 OpenResty 在启动时,会把 OpenResty 启动的命令行参数中的 -p PATH 作为前缀,将相对路径拼接为绝对路径。这样,自然就可以顺利找到 Lua 文件。
2、Lua 代码内容的变更,需要重启 OpenResty 服务才会生效,这样显然不方便调试,那么有没有什么即时生效的方法呢?
Lua 代码在第一个请求时会被加载,并默认缓存起来。所以在每次修改 Lua 源文件后,都必须重新加载 OpenResty 才会生效。其实,在 nginx.conf 中关闭 lua_code_cache 就能避免重新加载,这一点可以测试。不过,特别需要注意的是,这种方法只能临时用于开发和调试,如果是线上部署,一定要记得打开缓存,否则会非常影响性能。
3、如何把 lua 代码所在的文件夹,加入到 OpenResty 的查找路径中呢?
OpenResty 提供了 lua_package_path 指令,可以设置 Lua 模块的查找路径。针对上面的例子,可以把 lua_package_path 设置为 prefix 就是启动参数中的 -p PATH;
/lua/?.lua 表示 lua 目录下所有以 .lua 作为后缀的文件;
最后的两个分号,则代表内置的代码搜索路径。