在 macOS Apple M 系列芯片上可成功编译 Nginx,但需统一使用 arm64 架构工具链、通过 Homebrew 安装 openssl@3/pcre2/zlib 并显式指定路径,选用 ARM64 兼容的第三方模块(如 lua-nginx-module v0.10.25+),最后验证二进制架构及运行正常。

在 macOS 系统搭载 Apple M 系列芯片(如 M1、M2、M3)的设备上编译 Nginx 本身是完全可行的,但需注意架构适配、依赖库路径、以及部分第三方模块的兼容性问题。默认情况下,macOS 的 Homebrew 和大多数开源工具已原生支持 ARM64 架构,但若混用 Intel(x86_64)工具链或旧版脚本,容易触发架构不匹配错误(如 bad CPU type in executable 或 lipo: can't open input file)。
确认系统架构与工具链统一为 arm64
编译前务必确保 shell、编译器、pkg-config 和依赖库均运行在 arm64 模式下:
- 执行
uname -m应输出arm64;若显示x86_64,说明当前终端正通过 Rosetta 运行,需在“终端”App 设置中取消勾选「使用 Rosetta 打开」 - 检查
gcc或clang路径:运行which clang,应指向/usr/bin/clang(系统原生)而非 Homebrew 安装的 x86 版本;Homebrew 推荐使用 arm64 原生安装(即通过 Apple Silicon 版 Terminal 安装的 Homebrew,默认路径为/opt/homebrew) - 验证 pkg-config:运行
pkg-config --variable=host triplet libssl,输出应含aarch64或至少不含i386/x86_64
正确配置 OpenSSL 与 PCRE(关键依赖)
Nginx 编译常依赖 OpenSSL(TLS)、PCRE(正则)和 zlib。M 系列芯片上推荐优先使用 Homebrew 提供的 arm64 原生版本:
- 安装依赖:
brew install openssl@3 pcre2 zlib(避免使用已弃用的pcre,改用pcre2更稳定) - 配置时显式指定路径,例如:
./configure \ --with-openssl=/opt/homebrew/opt/openssl@3 \ --with-pcre=/opt/homebrew/opt/pcre2 \ --with-zlib=/opt/homebrew/opt/zlib \ --prefix=/usr/local/nginx - 若提示
OpenSSL version too old,确认未意外链接到系统自带的旧版 OpenSSL(位于/usr/bin/openssl),可通过openssl version和which openssl核对版本与路径
处理第三方模块的兼容性问题
部分 Nginx 第三方模块(如 nginx-rtmp-module、lua-nginx-module)早期未适配 ARM64,需注意:
- 优先选用已声明支持 Apple Silicon 的模块分支或新版 tag(例如 lua-nginx-module v0.10.25+ 已完善 M 系列支持)
- 若模块内含 C 扩展(如调用 x86 汇编优化代码),编译会失败;此时可尝试添加
--without-cpu-opt配置参数禁用 CPU 特性检测 - 对于依赖 LuaJIT 的模块,务必使用 openresty/luajit2 的 ARM64 兼容版本(非官方 LuaJIT 2.0.x 不支持 M 系列),并确保
LUAJIT_LIB和LUAJIT_INC环境变量指向正确路径
编译后验证与运行
成功 make && sudo make install 后,还需验证二进制文件架构及基础功能:
- 检查 nginx 二进制:
file /usr/local/nginx/sbin/nginx应显示Mach-O 64-bit executable arm64 - 运行
/usr/local/nginx/sbin/nginx -t测试配置;若报错dlopen() failed ... no suitable image found,多因某依赖库仍为 x86_64,可用otool -L /usr/local/nginx/sbin/nginx查看所有动态链接库路径与架构 - 启动后访问
http://localhost:8080,确认默认欢迎页正常加载,无崩溃或 TLS 握手失败

















