可行方案是在x86_64主机上用匹配ABI的交叉编译工具链(ARM32用arm-linux-gnueabihf-,ARM64用aarch64-linux-gnu-)进行交叉编译,需独立编译zlib、PCRE、OpenSSL三大依赖库并静态指定路径,修改Nginx源码绕过主机检测,显式设置环境变量与configure参数后生成ARM可执行文件。

直接在ARM设备上编译Nginx通常不可行——资源受限、工具链不全、耗时过长。真正可行的方案,是在x86_64主机(如Ubuntu)上用交叉编译工具链生成ARM可执行文件。整个过程不是简单改个CC变量就能跑通,核心在于:**依赖库独立交叉编译 + Nginx源码适配修改 + configure参数精准控制**。
准备匹配的交叉编译工具链
工具链必须与目标ARM平台ABI严格一致:
- ARM32(如RK3399、RV1126、Hi3559)选
arm-linux-gnueabihf-系列(e.g.arm-linux-gnueabihf-gcc) - ARM64(如RK3566、Orin Nano)选
aarch64-linux-gnu-系列(e.g.aarch64-linux-gnu-gcc) - 推荐从Linaro官网下载稳定版,避免用系统包管理器安装的精简版(可能缺
ar、ranlib等) - 验证方式:
arm-linux-gnueabihf-gcc -v能正常输出,且ldd --version显示的libc版本尽量接近目标板(可用cat /etc/os-release查目标板系统)
三大依赖库必须单独交叉编译
Nginx configure脚本默认只查本地x86库路径,不会识别交叉环境。zlib、PCRE、OpenSSL必须提前编译好,并指定静态路径:
-
zlib:用
--host=arm-linux-gnueabihf --static --disable-shared配置,--prefix设为绝对路径(如/opt/arm-libs/zlib) -
PCRE:必须加
--host=arm-linux-gnueabihf,禁用共享库(--disable-shared),否则Nginx链接时会报 undefined reference -
OpenSSL:推荐用1.1.1系列(3.x在旧ARM上易失败),运行
./Configure linux-armv4 no-shared no-threads --prefix=/opt/arm-libs/openssl --cross-compile-prefix=arm-linux-gnueabihf- - 所有库编译完务必执行
make install,确保include/和lib/libz.a等文件真实存在
修改Nginx源码以绕过主机检测
Nginx原生configure是为本地编译设计的,会尝试编译并运行测试程序(ARM二进制在x86主机根本跑不了)。需手动屏蔽几处关键自检:
- 打开
auto/cc/conf,把第82行左右的gcc替换为你的交叉编译器名(如arm-linux-gnueabihf-gcc) - 打开
auto/types/sizeof,将ngx_size硬编码设为4(ARM32)或8(ARM64),并注释掉整段编译测试逻辑 - 打开
auto/feature,注释掉所有以ngx_feature_test开头的检测块(特别是sys_nerr、accept4、ipv6相关) - 打开
src/os/unix/ngx_errno.h,添加#ifndef NGX_SYS_NERR宏定义(值参考目标板/usr/include/asm-generic/errno.h)
执行configure并生成Makefile
环境变量和参数必须显式指定,不能依赖自动探测:
- 先设置环境:
export CC=arm-linux-gnueabihf-gcc、export AR=arm-linux-gnueabihf-ar、export RANLIB=arm-linux-gnueabihf-ranlib - 运行 configure(关键参数示例):
./configure \--prefix=/usr/local/nginx \--with-zlib=/opt/arm-libs/zlib \--with-pcre=/opt/arm-libs/pcre \--with-openssl=/opt/arm-libs/openssl \--with-http_ssl_module \--with-http_v2_module \--without-http_upstream_zone_module \--with-cc-opt="-D_GNU_SOURCE" \--with-ld-opt="-lpthread" - 成功后检查
objs/Makefile中的CC =行是否为你的交叉编译器,且INCLUDES包含三个库的include路径
完成上述四步后,执行 make 即可生成ARM架构的 nginx 二进制。用 file objs/nginx 可确认是 ELF 32-bit LSB executable, ARM 或 ELF 64-bit LSB shared object, ARM aarch64。部署时注意:目标板需有对应版本的 libc 和 libpthread,静态链接(加 --static 参数)可规避部分依赖问题,但会增大体积。


















