在nginx中安装并调试OpenResty

#安装OpenResty相关模块

OpenResty是基于Lua即时编译器(LuaJIT)对Nginx进行扩展的模块——最核心的就是lua-nginx-module这个模块。其他的都是OpenResty基于lua开发的相关模块,当然也可以基于lua开发自己的第三方模块。

所以要想使用OpenResty首先必须安装lua-nginx-module

  1. 下载并安装LuaJIT。可以使用源码方式安装,这个可以参考官方文档非常详细。这里为了方便直接用apt安装了

    1
    sudo apt install luajit libluajit-5.1-dev
  2. 下载ngx_devel_kit模块

    1
    2
    3
    4
    5
    6
    # 在nginx目录下创建一个modules目录
    mkdir modules
    # 从github克隆模块代码
    git clone https://github.com/vision5/ngx_devel_kit/ modules/ngx_devel_kit
    # 切换到v0.3.1版本
    git checkout tags/v0.3.1 -b v0.3.1
  3. 下载lua-nginx-module模块

    1
    2
    git clone https://github.com/openresty/lua-nginx-module modules/ngx_http_lua_module
    git checkout tags/v0.10.20 -b v0.10.20

    如果是使用alibaba/tengine,这个模块已经被包含在tengine的modules/ngx_http_lua_module目录下了。

    另外注意lua-nginx-module与nginx的兼容性,nginx1.6.0之前的版本是不支持的。

#编译nginx源码

  1. 如果需要对nginx进行debug的话,需要修改 /auto/cc/conf 文件,将ngx_compile_opt="-c"修改为 ngx_compile_opt="-c -g"

    -g用来生成调试信息:详见gcc文档

  2. 设置luajit的头文件和静态库的路径,ubuntu下可以用dpkg看看libluajit被安装到哪个目录了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    $ dpkg -L libluajit-5.1-dev
    /.
    /usr
    /usr/include
    /usr/include/luajit-2.1
    /usr/include/luajit-2.1/lauxlib.h
    /usr/include/luajit-2.1/lua.h
    /usr/include/luajit-2.1/lua.hpp
    /usr/include/luajit-2.1/luaconf.h
    /usr/include/luajit-2.1/luajit.h
    /usr/include/luajit-2.1/lualib.h
    /usr/lib
    /usr/lib/x86_64-linux-gnu
    /usr/lib/x86_64-linux-gnu/libluajit-5.1.a
    /usr/lib/x86_64-linux-gnu/pkgconfig
    /usr/lib/x86_64-linux-gnu/pkgconfig/luajit.pc
    /usr/share
    /usr/share/doc
    /usr/share/doc/libluajit-5.1-dev
    /usr/share/doc/libluajit-5.1-dev/copyright
    /usr/lib/x86_64-linux-gnu/libluajit-5.1.so
    /usr/share/doc/libluajit-5.1-dev/changelog.Debian.gz

    然后设置两个环境变量

    1
    2
    export LUAJIT_LIB=/usr/lib/x86_64-linux-gnu/
    export LUAJIT_INC=/usr/include/luajit-2.1/
  3. 执行auto/configure

    1
    2
    3
    4
    auto/configure --prefix=nginx \
    --with-ld-opt="-Wl,-rpath,/usr/lib/x86_64-linux-gnu/" \
    --add-module=./modules/ngx_devel_kit \
    --add-module=./modules/ngx_http_lua_module
  4. 执行make install

    编译过程可能会比较慢,可以执行make -j2 && make install调大编译任务的个数

#调试OpenResty中的lua代码

这里以一个第三方的lua模板引擎为例——lua-resty-template

#安装lua模块

1
2
3
4
# 在nginx下创建一个放lua脚本的目录
mkdir lua-lib
# 下载lua-resty-template模块
git clone https://github.com/bungle/lua-resty-template lua-lib/lua-resty-template

nginx.conf中对lua模块进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http {
# ...
# 设置lua模块的路径
lua_package_path "lua-lib/lua-resty-template/lib/?.lua;;";

server {
listen 80;
server_name localhost;

set $template_root html/templates;
location /templates/ {
root html;
content_by_lua '
local template = require "resty.template"
template.render("view.html", { message = "Hello, World!" })
';
}
}
}

html/templates目录下添加模板文件

1
2
3
4
5
6
<!DOCTYPE html>
<html>
<body>
<h1>{{message}}</h1>
</body>
</html>

访问localhost/templates/view.html,能看到下面的结果

lua template

Read More:

https://github.com/lua/lua

https://www.lua.org/pil/23.html

http://lua-users.org/wiki/DebuggingLuaCode

http://notebook.kulchenko.com/zerobrane/debugging-openresty-nginx-lua-scripts-with-zerobrane-studio

https://github.com/LewisJEllis/awesome-lua

本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

转载时请注明原文链接:https://blog.hufeifei.cn/2021/10/C-C++/nginx-open-resty/

鼓励一下
支付宝微信