资讯动态

保姆级教程:在Ubuntu 16.04上为ARM板子交叉编译Nginx 1.20.0(Linaro工具链+zlib+openssl+pcre)

发布时间:2026/9/9 19:53:28 来源:尧图企业网站定制
ARM嵌入式开发实战Ubuntu 16.04环境下的Nginx 1.20.0深度交叉编译指南当我们需要在资源受限的ARM嵌入式设备上部署高性能Web服务时Nginx往往是首选解决方案。不同于x86平台的直接编译针对ARM架构的交叉编译过程充满陷阱——从工具链选择到依赖库编译每个环节都可能成为阻碍。本文将基于Ubuntu 16.04系统使用Linaro工具链完整演示Nginx 1.20.0及其核心依赖zlib/openssl/pcre的交叉编译全流程特别针对RK3399、树莓派4B等主流ARM开发板进行优化。1. 环境准备与工具链配置1.1 系统基础环境检查在Ubuntu 16.04系统上执行以下命令确保基础编译环境就绪sudo apt-get update sudo apt-get install -y build-essential libtool automake \ git curl wget unzip patch验证系统架构与内核版本uname -m # 应显示x86_64 cat /etc/lsb-release # 确认系统版本注意Ubuntu 16.04默认使用较旧的glibc 2.23这要求我们选择的工具链版本不能过高否则会产生兼容性问题。建议选用gcc 4.9~5.4版本的Linaro工具链。1.2 Linaro工具链安装与验证下载并解压Linaro 4.9.4工具链适用于大多数ARMv7设备wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz sudo tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz -C /usr/local/配置环境变量建议写入~/.bashrcexport PATH/usr/local/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin:$PATH export CCarm-linux-gnueabihf-gcc export CXXarm-linux-gnueabihf-g验证工具链有效性arm-linux-gnueabihf-gcc -v # 应显示gcc version 4.9.4 file $(which arm-linux-gnueabihf-gcc) # 应显示ELF 64-bit LSB executable2. 依赖库的交叉编译实战2.1 zlib-1.3.1的交叉编译下载并解压zlib源码wget https://zlib.net/zlib-1.3.1.tar.gz tar -xzvf zlib-1.3.1.tar.gz cd zlib-1.3.1配置编译参数关键点CHOSTarm-linux-gnueabihf ./configure --prefix$(pwd)/install \ --static编译与安装make -j$(nproc) make install验证生成的库文件架构file install/lib/libz.a # 应显示ARM架构的静态库2.2 OpenSSL-1.1.1t的特殊处理OpenSSL的交叉编译最为复杂需要特别注意目标平台指定wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz tar -xzvf openssl-1.1.1t.tar.gz cd openssl-1.1.1t关键配置命令./Configure linux-armv4 no-asm shared \ --prefix$(pwd)/.openssl \ --cross-compile-prefixarm-linux-gnueabihf-重要提示必须使用linux-armv4明确指定目标平台避免自动检测错误。no-asm参数禁用汇编优化可避免指令集兼容性问题。编译与验证make depend make -j$(nproc) make install检查生成文件file .openssl/lib/libssl.so.1.1 # 应显示ARM共享库2.3 PCRE-8.45的优化编译PCRE库影响Nginx的正则表达式性能建议开启JIT支持wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz tar -xzvf pcre-8.45.tar.gz cd pcre-8.45配置参数./configure --hostarm-linux-gnueabihf \ --prefix$(pwd)/install \ --enable-jit \ --enable-utf8 \ --enable-unicode-properties \ CCarm-linux-gnueabihf-gcc编译与安装make -j$(nproc) make install3. Nginx 1.20.0的核心编译流程3.1 源码准备与基础配置下载Nginx源码并进入目录wget https://nginx.org/download/nginx-1.20.0.tar.gz tar -xzvf nginx-1.20.0.tar.gz cd nginx-1.20.0生成关键配置命令根据实际路径调整./configure \ --prefix$(pwd)/install \ --with-ccarm-linux-gnueabihf-gcc \ --with-cpparm-linux-gnueabihf-g \ --with-zlib../zlib-1.3.1 \ --with-pcre../pcre-8.45 \ --with-openssl../openssl-1.1.1t \ --with-openssl-optno-asm linux-armv4 \ --with-http_ssl_module \ --with-http_v2_module \ --with-threads \ --with-file-aio \ --with-ld-opt-static -pthread \ --without-http_upstream_zone_module3.2 关键源码修改指南编译前必须修改以下文件objs/ngx_auto_config.h添加#ifndef NGX_HAVE_SYSVSHM #define NGX_HAVE_SYSVSHM 1 #endifauto/cc/conf修改编译器名称case $NGX_CC_NAME in gcc) 改为 arm-linux-gnueabihf-gccobjs/Makefile需要删除所有-m64标志确保链接参数包含-pthread3.3 编译与安装执行编译命令make -j$(nproc) make install验证生成的可执行文件file install/sbin/nginx # 应显示ARM可执行文件4. 部署与疑难排错4.1 目标板部署检查将编译好的Nginx目录拷贝到ARM设备后需要检查# 在ARM设备上执行 ldd ./sbin/nginx # 检查动态库依赖 ./sbin/nginx -t # 测试配置常见问题解决方案错误现象可能原因解决方案找不到libssl.so路径错误设置LD_LIBRARY_PATH非法指令CPU架构不匹配重新配置openssl平台参数pthread函数未定义链接参数缺失添加-pthread编译选项4.2 性能优化建议在ARM设备上的nginx.conf建议调整worker_processes auto; # 根据CPU核心数设置 events { worker_connections 1024; use epoll; # 高性能事件模型 } http { sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; # 启用压缩减轻CPU负担 gzip_comp_level 4; }对于RK3399等Cortex-A72设备可额外添加内核参数echo net.core.somaxconn32768 /etc/sysctl.conf echo net.ipv4.tcp_max_syn_backlog16384 /etc/sysctl.conf sysctl -p

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价