当前位置: 首页 > news >正文

Nginx交叉编译实战:从Ubuntu20.04到ARM64 Linux的完整移植记录

Nginx交叉编译实战:从Ubuntu20.04到ARM64 Linux的完整移植记录

在嵌入式开发和边缘计算场景中,将高性能Web服务器Nginx移植到ARM64架构的需求日益增长。无论是物联网网关、智能摄像头还是工业控制设备,都需要轻量级但功能完整的Web服务能力。本文将手把手带你完成从x86 Ubuntu环境到ARM64开发板的完整交叉编译过程,涵盖工具链配置、依赖库处理、模块定制等关键环节。

1. 环境准备与工具链配置

1.1 基础环境搭建

推荐使用Ubuntu 20.04 LTS作为编译主机,其软件仓库对交叉编译工具支持较为完善。首先更新系统并安装基础工具:

sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential git wget tar

1.2 交叉编译器选择

针对ARM64架构,常用的工具链有:

工具链名称维护方特点
gcc-aarch64-linux-gnuUbuntu官方安装简单,版本较旧
Linaro GCCLinaro组织针对ARM优化,性能更好
ARM官方工具链ARM公司最新特性支持最完整

以安装Ubuntu官方工具链为例:

sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

验证安装:

aarch64-linux-gnu-gcc -v

提示:如果目标板使用特定内核版本,建议选择与之匹配的工具链版本以避免兼容性问题。

2. 源码获取与预处理

2.1 下载核心组件

创建统一的工作目录并下载所需源码:

mkdir ~/nginx_cross && cd ~/nginx_cross wget http://nginx.org/download/nginx-1.25.3.tar.gz git clone https://github.com/arut/nginx-rtmp-module.git wget https://www.openssl.org/source/openssl-3.1.4.tar.gz wget https://sourceforge.net/projects/pcre/files/pcre2/10.42/pcre2-10.42.tar.gz wget https://zlib.net/zlib-1.3.tar.gz

2.2 源码解压与目录结构

解压所有源码包并建立清晰的目录结构:

tar -xzf nginx-1.25.3.tar.gz tar -xzf openssl-3.1.4.tar.gz tar -xzf pcre2-10.42.tar.gz tar -xzf zlib-1.3.tar.gz mkdir -p nginx-1.25.3/install

3. 交叉编译配置

3.1 修改Nginx编译脚本

进入Nginx源码目录,需要修改两处关键配置:

  1. 注释掉auto/cc/name文件中导致编译中断的检查:
sed -i '21s/exit 1/#exit 1/' auto/cc/name
  1. 调整auto/types/sizeof中的类型检测:
sed -i '15s/ngx_size=.*/ngx_size=4/' auto/types/sizeof sed -i '36s/$CC/gcc/' auto/types/sizeof sed -i '43s/ngx_size=$NGX_AUTOTEST/ngx_size=4/' auto/types/sizeof

3.2 配置编译参数

执行configure脚本时需特别注意路径参数:

cd nginx-1.25.3 ./configure \ --prefix=$(pwd)/install \ --with-cc=aarch64-linux-gnu-gcc \ --with-cc-opt="-Wno-error -Wno-deprecated-declarations" \ --with-cpp=aarch64-linux-gnu-g++ \ --with-http_ssl_module \ --with-http_mp4_module \ --with-http_v2_module \ --without-http_upstream_zone_module \ --with-openssl=../openssl-3.1.4 \ --with-openssl-opt="--cross-compile-prefix=aarch64-linux-gnu- linux-aarch64" \ --with-pcre=../pcre2-10.42 \ --with-zlib=../zlib-1.3 \ --add-module=../nginx-rtmp-module

关键参数说明:

  • --with-cc:指定交叉编译器
  • --with-openssl:OpenSSL源码路径
  • --add-module:添加RTMP流媒体模块

4. 编译与安装

4.1 解决依赖编译

首先需要交叉编译各个依赖库:

# 编译PCRE2 cd ../pcre2-10.42 ./configure --host=aarch64-linux-gnu --prefix=$(pwd)/install make && make install # 编译OpenSSL cd ../openssl-3.1.4 ./Configure linux-aarch64 --cross-compile-prefix=aarch64-linux-gnu- make

4.2 编译Nginx主体

返回Nginx目录执行编译:

cd ../nginx-1.25.3 make -j$(nproc) make install

验证生成的二进制文件:

file install/sbin/nginx # 应显示:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked...

5. 目标板部署与验证

5.1 文件系统准备

将编译好的Nginx文件打包传输到开发板:

tar -czf nginx_arm64.tar.gz install/ scp nginx_arm64.tar.gz user@target_board:/tmp

在开发板上解压并部署:

tar -xzf /tmp/nginx_arm64.tar.gz -C /usr/local/ ln -s /usr/local/install/sbin/nginx /usr/sbin/nginx mkdir -p /etc/nginx cp -r /usr/local/install/conf/* /etc/nginx/

5.2 服务测试

启动Nginx并验证:

nginx -t # 测试配置 nginx # 启动服务 curl http://localhost # 验证响应

对于RTMP模块的额外测试:

ffmpeg -re -i test.mp4 -c copy -f flv rtmp://localhost/live/stream

6. 常见问题排查

6.1 动态链接库缺失

若运行时出现库缺失错误,可通过以下方式解决:

# 在开发板上查找缺失的库 ldd /usr/sbin/nginx # 从工具链中复制所需库 cp /path/to/toolchain/aarch64-linux-gnu/libc/lib/* /usr/lib/

6.2 内核特性不兼容

如果遇到shmem等系统调用问题,可尝试:

  1. 修改内核配置重新编译
  2. 在nginx配置中禁用相关特性:
events { use epoll; accept_mutex off; }

6.3 性能调优建议

针对ARM64架构的优化配置:

worker_processes auto; events { worker_connections 1024; multi_accept on; } http { sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; gzip_types text/plain application/json; }

移植过程中最耗时的往往是依赖库的交叉编译环节。建议先单独验证每个依赖库的交叉编译结果,最后再整合到Nginx的主编译过程中。对于生产环境,可以考虑使用Buildroot或Yocto构建完整的定制化文件系统。

http://www.jsqmd.com/news/522304/

相关文章:

  • 别再手动调焦了!UE5 Sequencer里用Crane Rig+Look-At Tracking,5分钟搞定环绕目标拍摄
  • 从零开始:在Ubuntu22.04上用Anaconda创建Python3.8虚拟环境并安装Pytorch1.12
  • Python实战:用朴素贝叶斯分类器预测西瓜好坏(附完整代码)
  • 墨语灵犀深度评测:33语种互译精度 vs 传统引擎,Hunyuan-MT美学翻译实测
  • vLLM-v0.11.0新手避坑指南:从镜像选择到服务验证全流程
  • 不用GPT-4也能玩转RAG:手把手教你用LightRAG+Ollama搭建本地知识库
  • Python heapq实战:如何用__lt__方法实现自定义优先级队列(附完整代码)
  • TensorBoard可视化实战:从安装到解读F1曲线,新手必看指南
  • Windows Server上OpenVPN 2.4.8双因子认证实战:账号密码+证书,附一键脚本
  • 2026年3月山东电线电缆厂家最新推荐:电力电缆、控制电缆、阻燃耐火电缆、低烟无卤电缆、光伏电缆、特种线缆厂家选择指南 - 海棠依旧大
  • WebStorm 2019激活码失效?最新2023年合法激活方法全攻略
  • 【ESP32-S3】7.3 I2S实战——从SD卡读取并实时播放WAV音频
  • RK3588平台RGB Sensor调试全攻略:从硬件检查到ISP调参的避坑指南
  • 解决Android 13存储权限问题:READ_MEDIA_IMAGES等新权限的完整配置流程
  • 排水管选购必看:2026年实力厂家口碑分析,排水管实力厂家精选优质品牌助力工程采购 - 品牌推荐师
  • EVA-01部署教程:本地化安装,保障设计院数据安全与隐私
  • 从谐波分析看SVPWM优势:我的三相逆变器仿真THD为什么能低至0.35%?
  • MicroSD卡SPI模式实战:从引脚定义到PCB布局的完整设计指南
  • 基于PLC的智能抢答器系统设计与实现
  • 分析2026年江苏专业的泡沫雕塑制作队伍,哪家值得合作 - 工业品牌热点
  • 大模型显存优化实战:从Qwen2.5-7B-Instruct看KV Cache、梯度检查点与量化技术
  • 语音芯片WTW-28P在智能家居中的按键控制应用电路设计
  • 聊聊2026年上海泡沫雕塑设计公司选哪家好,给你实用建议 - 工业推荐榜
  • 2026年制造精良、售后好的开箱机厂家推荐,专业厂家排名揭晓 - 工业品牌热点
  • 解锁论文写作新境界:书匠策AI的数据分析魔法
  • 3.23
  • 手把手教你用Visual Studio搭建RFID门禁系统(含低频卡读写实战)
  • ESP8266 Web OTA升级库:响应式固件空中更新实战
  • 保姆级教程:用Kimi K2-0905+Claude Code搭建自动化前端工作流(含React案例)
  • 2026年开箱机品牌供应商费用多少,哪家更划算 - 工业推荐榜