宝塔面板算是免费且好用的 LNMP 管理面板,为什么不是服务器管理面板?因为有 Cockpit 呀🤣
上个月不小心搞了一台 Oracle Cloud 的 Always Free 四核心的 ARM 架构服务器,为了能够用上宝塔,我把机器给重装为 CentOS Stream 8 (ARM) 系统。面板安装完成之后,就是非常常规的安装 Nginx、MySQL、PHP 等运行环境,之后会习惯性安装一下宝塔的一些特色插件,原本这些插件在 x86_64 架构下都没什么问题,但是到了 ARM 下总是有一些小问题,所以就有了这篇总结文章。
2021-12-31 更新:宝塔现已支持自定义模块了,ARM 的机器只要安装的时候使用编译安装,然后填写 LuaJIT 模块的编译信息进去即可。
宝塔有一个叫「网站监控报表」的插件,我觉得蛮好用的一个插件,所以会习惯性安装到服务器上,但是这个插件在默认情况下会导致 Nginx 出现 unknown directive "lua_shared_dict"
的异常。
根据这个异常信息可以推断应该是 Nginx 没有加载 LuaJIT 导致,进一步查看宝塔的 Nginx 编译脚本(位于 /www/server/panel/install/nginx.sh
),也确实发现对于 ARM 架构目前的做法是直接忽略编译和加载。
那既然官方的编译脚本直接忽略了对 LuaJIT 的支持,那就自己动手,丰衣足食。
进一步分析宝塔的编译脚本可以发现,有一处调用自定义脚本的地方。
这个功能应该是和面板上面的编译安装中出现的自定义模块有关,但是我在 7.6.0 下面测试并没有通过,估计是开发漏掉了。关于这个功能的缺失已经通过官方论坛提交给官方确认,但是并不妨碍我们使用这个功能来实现自动编译和加载 LuaJIT。
在 /www/server/panel/install
分别创建名字为 nginx_prepare.sh
和 nginx_configure.pl
的文件,然后将两个文件的权限设置为 600
并且将所有者设置为 root
。
将以下代码填入 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*
提醒:直接复制粘贴可能存在回车符,如果遇到编译失败请使用 sed -i 's/\r//g' /www/server/panel/install/nginx_prepare.sh
删除回车符。
--add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module
将上面文本填入nginx_configure.pl
这里的 LuaJIT 源码来自 GitHub,如果下载缓慢可以将其中的 github.com
修改为 hub.fastgit.org
,当然你也可以直接 git
官方的源码,只需要修改脚本的部分代码即可。
因为 LuaJIT 最新的版本是 2.1.0-beta3,所以我索性就直接使用 v2.1 分支最新的源码(反正没差🤣)
关于缺失的 jemalloc,经过测试需要 5.1.0 以上的版本才可以让 Nginx 1.20.x 正常编译,不过我这边遇到一个问题,加载 jemalloc 之后单个 Nginx 的进程内存占用高达 2G(虽然这台 ARM 有 32G 的内存),所以我就放弃这个模块,如果你需要用到,就将下面代码追加到 nginx_prepare.sh
文件中。
if [ ! -f '/usr/local/lib/libjemalloc.so' ]; then
wget -O jemalloc-5.2.1.tar.bz2 ${download_Url}/src/jemalloc-5.2.1.tar.bz2
tar -xvf jemalloc-5.2.1.tar.bz2
cd jemalloc-5.2.1
./configure
make && make install
ldconfig
cd ..
rm -rf jemalloc*
fi
--with-ld-opt=-ljemalloc
同时在nginx_configure.pl
追加一个空格后追加以上文本
最后在面板升级一下 Nginx,或者终端执行下面命令重新编译 Nginx,之后就可以愉快使用 LuaJIT 了。
cd /www/server/panel/install && bash install_soft.sh 0 update nginx 1.20
运行之前你需要稍作修改,将 1.20 修改成你需要升级或安装的版本,如果你需要升级则先看下自己的 Nginx 是什么版本,比如 1.18.1 则修改为 1.18,脚本运行完成后 Nginx 的版本也会升级到 1.18 的最新版本。另外,如果你的服务器未安装 Nginx,则需要将 update
修改为 install
。
Ubuntu 第一次安装 Nginx 务必使用编译安装(或使用上面的安装命令),极速安装不会调用自定义脚本!另外 lua-cjson 可能会编译失败,如果编译失败则建议使用 luarocks 解决。lua-cjson 也可以不安装,但是不安装会影响一些插件的使用,有条件则建议先安装一下「网站监控报表」的插件,该插件会在编译失败的情况下自动安装 luarocks 和 lua-cjson。
luarocks install lua-cjson
“让宝塔面板的 Nginx 在 ARM 下也能支持 LuaJIT”上的10条回复
用你的方法,在重啓Nginx時依然會出現「PANIC: unprotected error in call to Lua API (bad light userdata pointer)」
Ubuntu 需要另外定制脚本。具体可以查看一下官方论坛的帖子。https://www.bt.cn/bbs/thread-75379-1-1.html
感谢博主无私的分享,我也是有一台4核24g的arm机,在安装中遇到了些问题,能否联系下博主指导下呢?不白嫖有偿
可以微信联系我: sparkyidea 或者邮箱哦
如果是 Ubuntu 系统,需要另外定制脚本。具体可以查看一下官方论坛的帖子。https://www.bt.cn/bbs/thread-75379-1-1.html
[…] 让宝塔面板的 Nginx 在 ARM 下也能支持 LuaJIT – Xeath […]
感谢补充,如果遇到相同问题可以按照以上博主给出的方案进行解决。
大佬您好,按照您的步骤操作后,我 nginx -V 有看到新加入的两个扩展。但安装免费防火墙后,nginx仍然自动关闭,提示“nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /www/server/nginx/conf/nginx.conf test failed”,系统是centos8 stream nginx使用的是1.20版本。也在别处试过别的方法,均无效。这个问题困扰我好几天了,请问您是否可以提供有偿帮助,十分感谢。不胜感激!
这个错误是 nginx 的配置文件存在问题。
大佬,按照你的方法终于成功了。看到很多网站搬运,他们故意隐藏关键代码。是否可以转载本文,我会标明出处。
可以的,欢迎转载。