前言
目前 ARM 架构 机型在宝塔面板安装 Nginx 防火墙和网站监控报表,会出现冲突,不能正常使用;
出现的错误代码包括但不限于以下两种:unknown directive "lua_shared_dict"PANIC: unprotected error in call to Lua API (bad light userdata pointer)
其主要原因是因为宝塔面板在安装 Nginx 时,判断机器架构为 ARM 就会直接忽略编译和加载 LuaJIT 选项;
解决方法就是重新为 Nginx 编译加载 LuaJIT 选项,而 ARM 架构 需要 LuaJIT 版本在 2.1 以上才能编译成功;
本方法在甲骨文 ARM 架构 下测试,其它服务商的 ARM 架构 应该同样适用,Nginx版本测试过 1.18 和1.20;
另外在宝塔面板首次安装 Nginx 时务必使用编译安装,极速安装可能会出现错误;
- 测试时间:2021-11-06
- 测试环境:Ubuntu 20.04
- 宝塔版本:7.7.0
- 插件版本:Nginx 防火墙 8.9.2 / 网站监控报表 6.2
- 温馨提醒:其它系统及版本未进行测试,请自行验证,请勿在生产环境下尝试;
创建脚本
在 /www/server/panel/install 目录下分别新建名为 nginx_prepare.sh 和nginx_configure.pl两个文件;
并在两个文件中分别填写如下代码:
nginx_prepare.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
wget -c -O LuaJIT-2.1.zip https://github.com/LuaJIT/LuaJIT/archive/refs/heads/v2.1.zip -T 10
unzip LuaJIT-2.1.zip
if [ -e LuaJIT-2.1 ]; then
cd LuaJIT-2.1
make linux
make install
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1/
ln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/local/lib64/libluajit-5.1.so.2
if [ `grep -c /usr/local/lib /etc/ld.so.conf` -eq 0 ]; then
echo "/usr/local/lib" >> /etc/ld.so.conf
fi
ldconfig
cd ..
fi
rm -rf LuaJIT-2.1*
nginx_configure.pl
--add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module
然后将这两个文件设置权限为600,并将所有者设置为root;
编译安装
在 SSH 终端 输入以下代码(清理脚本换行符,避免编译安装失败):
sed -i 's/\r//g' /www/server/panel/install/nginx_prepare.sh
在 SSH 终端 输入以下代码开始更新 Nginx 并按脚本加载 LuaJIT 选项:
cd /www/server/panel/install && bash install_soft.sh 0 update nginx 1.18
代码中的 Nginx 版本号需要改为你机器已经安装的 Nginx 版本 1.18.1 即为 1.18;
然后等待更新完成即可;
安装插件
注意:需要首先安装 网站监控报表 等待安装完成后再安装 Nginx 防火墙;
原因是 Nginx 防火墙 需要使用 lua-cjson 但在 ARM 下更新 Nginx 时直接编译 lua-cjson 会失败,具体原因没有深究;
而安装 网站监控报表 时会默认使用 luarocks 来安装 lua-cjson 这就直接解决了此问题;
当然你也可以先安装 luarocks 在使用 luarocks install lua-cjson 命令来安装 lua-cjson;
由于博主两个插件都要使用,所以就没单独测试了,需要的可以自行测试;