在Nginx中添加Lua模块遇阻:access_by_lua_file指令报错求助
解决Nginx中
access_by_lua_file指令未知的问题 首先明确:添加include语句无法解决这个问题,因为access_by_lua_file是lua-nginx-module提供的专属指令,你的RPM版Nginx并没有加载这个模块,所以才会报「unknown directive」错误。下面结合你的环境(无外网、已有OpenResty)给出几个可行的解决方案:
方案一:直接使用已安装的OpenResty(最推荐)
你服务器上已经存在/opt/openresty/路径的OpenResty,而OpenResty本身就集成了lua-nginx-module(这也是OpenResty的核心特性之一),完全不用额外折腾模块编译:
- 先确认OpenResty的Nginx执行路径:
/opt/openresty/nginx/sbin/nginx - 将你当前的Nginx配置(包含
access_by_lua_file的server块)复制到OpenResty的配置目录,一般是/opt/openresty/nginx/conf/(可以覆盖原nginx.conf,或者在conf.d下新建配置文件) - 测试配置是否合法:
/opt/openresty/nginx/sbin/nginx -t - 如果测试通过,启动或重载OpenResty:
/opt/openresty/nginx/sbin/nginx -s reload
这个方案的优势是零编译、无依赖问题,直接利用现成的集成环境,最适合你的无外网场景。
方案二:给RPM版Nginx动态加载lua-nginx-module(仅当Nginx支持动态模块时)
首先检查你的RPM版Nginx是否支持动态模块:
nginx -V
查看输出中是否包含--with-compat和--add-dynamic-module这类参数,如果有,说明支持动态加载模块,步骤如下:
- 离线准备编译资源:
- 下载与你当前Nginx版本(1.12)完全一致的源码包(可以从RedHat官方镜像站离线获取对应版本的src.rpm,解压后得到源码)
- 确保你已经解压了
lua-nginx-module-0.10.13到/etc/nginx/modules/目录
- 编译动态模块:
进入Nginx源码目录,执行:
编译完成后,会在源码目录的./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-compat --add-dynamic-module=/etc/nginx/modules/lua-nginx-module-0.10.13 make modulesobjs文件夹下生成ngx_http_lua_module.so文件 - 加载模块:
将ngx_http_lua_module.so复制到Nginx的模块目录(一般是/usr/lib64/nginx/modules/),然后在/etc/nginx/nginx.conf的最顶部添加:load_module modules/ngx_http_lua_module.so; - 验证并重启:
nginx -t && systemctl restart nginx
方案三:离线编译集成lua-nginx-module的自定义Nginx
如果你的RPM版Nginx不支持动态模块,只能选择重新编译Nginx并集成lua-nginx-module:
- 离线安装依赖:
从RedHat镜像站下载并安装以下依赖包(全部离线RPM):pcre-devel、zlib-devel、openssl-devel(Nginx基础编译依赖)lua-devel(系统自带Lua 5.1.4的开发包,编译模块需要)
执行安装:
rpm -ivh pcre-devel*.rpm zlib-devel*.rpm openssl-devel*.rpm lua-devel*.rpm - 编译Nginx:
进入Nginx 1.12源码目录,执行configure命令(路径根据你的实际情况调整):
然后编译安装:./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --add-module=/etc/nginx/modules/lua-nginx-module-0.10.13 --with-lua=/usrmake && make install - 替换配置并启动:
备份原RPM版Nginx的配置,将你的自定义配置复制到新编译的Nginx配置目录,测试并启动即可。
关键说明
- 为什么
include没用?include只是用来加载额外的配置文件片段,比如include conf.d/*.conf;,它不能加载Nginx模块,模块必须通过编译时集成或动态加载才能被Nginx识别,进而支持对应的指令。 - 优先选择方案一,因为OpenResty已经帮你做好了所有Lua模块的集成,完全避开了无外网下的依赖下载问题。
内容的提问来源于stack exchange,提问作者ScipioAfricanus
相关产品推荐
相关产品推荐

