nginx静态编译luajit (openresty)

本文介绍如何在OpenResty中实现LuaJIT的静态编译,避免跨平台部署时的依赖问题。提供了三种方法:使用OpenResty自带的静态编译方式、修改objs/Makefile文件及移除LuaJIT的so文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


最近折腾 openresty 的版本的升级, 由于加入了自定义的模块, 需要更改相关编译脚本。 

从官网下载了最新的 openresty-1.11.2.2  , 首先尝试了下原版的编译,很顺利,但是编译后的nginx 二进制是动态链接 libluajit-5.1.so.2的, 在跨机器部署时有点麻烦 和不便,最好能静态编译 luajit.a 到nginx 二进制中。

从网上看到了 以下几种方法(http://blog.csdn.net/liujiyong7/article/details/17530915 ),都比较繁琐, 自己摸索了一条方法,分享下。 
其实下面第三种方法手动去除 so文件,可以自动化,在luajit 的makefile文件中,去除掉生成so 文件的指令即可。 
在 luajit 的makefile文件中,注释掉 安装 so 动态库的指令即可,然后重新编译openresty 即可。 

install: $(INSTALL_DEP)
@echo "==== Installing LuaJIT $(VERSION) to $(PREFIX) ===="
$(MKDIR) $(INSTALL_DIRS)
cd src && $(INSTALL_X) $(FILE_T) $(INSTALL_T)
cd src && test -f $(FILE_A) && $(INSTALL_F) $(FILE_A) $(INSTALL_STATIC) || :
$(RM) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2)
# install so lib
#cd src && test -f $(FILE_SO) && \
#  $(INSTALL_X) $(FILE_SO) $(INSTALL_DYN) && \
#  $(LDCONFIG) $(INSTALL_LIB) && \
#  $(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT1) && \
#  $(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT2) || :
#

cd etc && $(INSTALL_F) $(FILE_MAN) $(INSTALL_MAN)
cd etc && $(SED_PC) $(FILE_PC) > $(FILE_PC).tmp && \
 $(INSTALL_F) $(FILE_PC).tmp $(INSTALL_PC) && \
 $(RM) $(FILE_PC).tmp
cd src && $(INSTALL_F) $(FILES_INC) $(INSTALL_INC)
cd src/jit && $(INSTALL_F) $(FILES_JITLIB) $(INSTALL_JITLIB)
#$(SYMLINK) $(INSTALL_TNAME) $(INSTALL_TSYM)
@echo "==== Successfully installed LuaJIT $(VERSION) to $(PREFIX) ===="





网络上的方法总结如下: 
1. 直接使用 openresty,并利用openresty提供的方式静态编译luajit

安装nginx nginx_lua_module luajit nginx_dev_kit步骤略

2. 在nginx  configure执行过后,修改生成的objs/Makefile文件
在第一个target  “objs/nginx: objs/src/core/nginx.o \”下面,添加luajit的静态文件
-Wl,-E -lpthread -lcrypt -L  /xxx/xxx/lua/libs -lluajit-5.1 -lm -ldl /xxx/xxx/pcre-8.02/.libs/libpcre.a -lssl -lcrypto -ldl -lz
改成
-Wl,-E -lpthread -lcrypt /xxx/xxx/libluajit-5.1.a -lm -ldl /xxx/xxx/pcre-8.02/.libs/libpcre.a -lssl -lcrypto -ldl -lz

改完后 再执行 make && make install 就行了
我们用ldd nginx命令可以看到,已经依赖luajit动态链接库了

3.  移除luajit的so文件,只保留.a文件,这样ld在连接时找不到so文件,就只好链接.a文件了 
改完后,重新编译nginx。


### 如何在 Nginx静态编译 Lua 模块 要在 Nginx静态编译 Lua 模块,通常需要通过 OpenResty 或手动配置 Nginx 的构建过程来完成。以下是详细的说明: #### 1. 准备工作 确保已安装必要的依赖项,包括 `pcre`、`zlib` 和 `openssl` 等基础库以及 LuaJIT 工具链。 ```bash sudo apt-get update && sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev git wget ``` #### 2. 下载并解压 Lua 模块 下载所需的 Lua 模块源码包,并将其放置在一个合适的位置以便后续使用。 ```bash wget https://github.com/openresty/lua-nginx-module/archive/v0.10.15.tar.gz tar xzf v0.10.15.tar.gz mv lua-nginx-module-0.10.15 lua-nginx-module ``` 此操作完成了 Lua 模块的获取和准备[^1]。 #### 3. 配置 Nginx 构建环境 假设已经下载了 Nginx 源码(例如 `/opt/nginx-1.12.2/`),可以通过以下命令进行配置: ```bash cd /opt/nginx-1.12.2/ ./configure \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_sub_module \ --with-http_gzip_static_module \ --with-pcre \ --with-ld-opt="-Wl,-rpath,/usr/local/LuaJIT/lib" \ --add-module=/opt/lua-nginx-module ``` 在此过程中: - 使用 `--add-module` 参数指定了 Lua 模块路径。 - 添加 `-Wl,-rpath,/usr/local/LuaJIT/lib` 来设置运行时动态链接器查找 LuaJIT 库的路径[^3]。 #### 4. 编译并安装 执行以下命令以完成编译和安装: ```bash make -j$(nproc) sudo make install ``` 这一步会将 Lua 模块与 Nginx 进行静态链接[^4]。 #### 5. 测试 Lua 功能 启动 Nginx 并测试 Lua 脚本的功能。可以在配置文件中加入如下内容: ```nginx http { server { location /lua-test { content_by_lua_block { ngx.say("Hello, world!") } } } } ``` 保存后重新加载 Nginx 配置: ```bash /usr/local/nginx/sbin/nginx -s reload ``` 访问 `http://<server-ip>/lua-test` 即可验证 Lua 是否正常工作。 --- ### 注意事项 - **Lua 版本一致性**:确保 LuaJIT 的版本与模块编译时所用的一致,否则可能导致无法找到指定的 Lua 模块[^4]。 - **Nginx 版本要求**:如果计划使用动态模块支持,则需确认 Nginx >= 1.9.11[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值