Openresty还是挺香的, 但是当需要使用Nginx的module时有点抓瞎了: 使用apt安装的 ngx-module-* 往往和Openresty的版本声明不太一样, 相应的*.so文件也基本上不能用的了. 所以就需要自己编译module了.
如果是自己从零开始编译安装Openresty和ngx-module-*的话, 按照官方教程进行即可. 但是我的Openresty是使用官方的PPA源安装的, 因此编译的时候就需要与官方编译参数一致了, 不然的话编译完之后的.so在加载时就会报这个一个错误:
nginx is not binary compatible ...
正确的编译步骤如下所示:
-
下载Openresty的源码和要安装的模块的源码(例如ngx_http_geoip2_module)
- 进入到Openresty源码中的bundle/nginx-VERSION/目录下
- 导出必要的环境变量:
export LUAJIT_LIB="/usr/local/openresty/luajit/lib/" #这里是系统中已安装的Openresty/luajit的目录
export LUAJIT_INC="../LuaJIT-VERSION/src/" #VERSION是指下载的Openresty源码中的LuaJIT的版本号
# 或者在/usr/local/openresty/luajit/include/下面也有必要的头文件
# 在编译1.25.3.2版本时, 源代码目录下的LuaJIT-2.1-20231117.1/src里面没有luajit.h会导致编译失败
# 更换到usr/local里面的include就可以了.
- 获取Openresty的编译参数:
COMPILEOPTIONS=$(openresty -V 2>&1|grep -i "arguments"|cut -d ":" -f2-)
- 在当前目录下编译模块:
eval ./configure $COMPILEOPTIONS --add-dynamic-module=path/to/ngx_http_geoip2_module
make modules
- 将编译之后的模块复制到Openresty相应的目录下, 重新加载Openresty即可
- 如执行
configure
时失败, 则在objs/autoconf.err里有存储错误日志.
参考: Building dynamic modules for openresty - OpenResty Forum