简介:本资源面向需要在Windows 10环境下自行编译Nginx的开发者与运维人员,尤其适合希望集成http-flv模块、实现HTTP-FLV直播推流的技术人员。资源以Nginx 1.20.2源码为核心,同时打包了http-flv模块源码以及OpenSSL、PCRE、Zlib等依赖库源码,并附带ActivePerl、msys2、sed等编译工具,省去逐一下载与版本匹配的麻烦。压缩包共28个文件,约102.07MB,包含pl脚本、conf配置、html页面、license许可、exe可执行文件及vim、utf编码映射等类型,覆盖编译、配置与运行所需的主要环节。目前已有541人学习下载,说明该方案在Windows编译Nginx场景中具备一定参考价值。读者可据此搭建完整的编译环境,理解模块集成与依赖处理流程,减少环境配置中的常见阻碍。
1. Windows 上编译 Nginx 到底需要哪些工具:从一个 .rar 工具包说起
很多人第一次在 Windows 上折腾 Nginx 编译,都是被一个.rar工具包领进门的。下载下来解压一看,里面躺着 MSYS2、Perl、Strawberry、nasm、pcre、zlib、openssl 一堆东西,名字都认识,但谁先装、谁配环境变量、谁和谁版本要对上,全靠猜。结果就是configure报错、make报错、链接阶段找不到-lssl,来回折腾一整天。这篇笔记就围绕「Windows 编译 Nginx 必要工具」这件事,把工具链的组成、每个工具为什么必须存在、怎么一步步把源码编成可用的nginx.exe讲清楚。适合两类人:一是想自己改 Nginx 模块、加第三方补丁的开发者;二是需要特定版本、特定编译参数,官方 exe 满足不了需求的运维。读完你能独立搭出一套可复现的编译环境,也知道哪些坑是版本和路径带来的玄学问题。
2. 工具链拆解:每个工具在编译流程里干什么
Windows 原生没有 Nginx 官方支持的编译环境,Nginx 的构建系统是 Autoconf 风格的configure+make,这套东西天生属于 Unix。所以核心思路是:在 Windows 上模拟出一个足够像 Unix 的 shell 和工具集,让configure脚本能跑,让make能调编译器,最后产出 PE 格式的nginx.exe。
2.1 MSYS2 与 MinGW-w64:编译环境的地基
MSYS2 提供 POSIX 兼容层和包管理器pacman,MinGW-w64 提供真正的 Windows 原生编译器gcc。两者配合,configure脚本里的uname、sed、awk、rm才能正常工作,同时编译产物是原生 Windows 程序,不依赖 MSYS 运行时。
安装 MSYS2 后,务必用MinGW 64-bit那个快捷方式进入终端,而不是 MSYS 终端。区别在于前者uname -s返回MINGW64_NT-10.0,后者返回MSYS_NT-10.0,Nginx 的auto/os/win32判断依赖这个字符串。
# 在 MSYS2 MinGW64 终端里更新基础包 pacman -Syu # 安装编译必需的核心工具 pacman -S --needed base-devel mingw-w64-x86_64-toolchain # 单独确认 gcc、make、pkg-config 都在 which gcc make pkg-configbase-devel里包含make、diffutils、grep、sed等,mingw-w64-x86_64-toolchain是编译器全家桶。which的输出应该都指向/mingw64/bin/下,如果指向/usr/bin/,说明你进错了终端。
2.2 Perl 与 nasm:configure 脚本和汇编优化
Nginx 的configure是 Perl 脚本,没有 Perl 直接报perl: command not found。MSYS2 里可以直接装perl,但更稳的做法是用 Strawberry Perl 或 MSYS2 自带的mingw-w64-x86_64-perl,避免路径里出现空格。
nasm 是汇编器,OpenSSL 编译时大量使用汇编优化,缺了它 OpenSSL 会退化成纯 C 实现,性能下降明显,而且某些版本直接编译失败。
# MSYS2 里安装 perl 和 nasm pacman -S --needed mingw-w64-x86_64-perl nasm # 验证 perl -v nasm -vperl -v要能看到版本号,nasm -v同理。如果perl指向的是 Windows 系统里某个旧版本,用pacman装的会覆盖路径优先级,确认which perl在/mingw64/bin/perl。
2.3 PCRE、zlib、OpenSSL:三个必须预编译的依赖库
Nginx 的 rewrite 模块依赖 PCRE,gzip 模块依赖 zlib,HTTPS 依赖 OpenSSL。这三个库在 Windows 上不能像 Linux 那样直接apt install,需要先编译成静态库,再在configure时用--with-*指过去。
常见做法是分别下载源码,各自configure && make && make install到统一前缀,比如/mingw64或自定义的C:/nginx-deps。以 OpenSSL 为例:
# 假设源码在 /c/src/openssl-3.x cd /c/src/openssl-3.x ./Configure mingw64 no-shared --prefix=/c/nginx-deps/openssl make -j4 make installno-shared生成静态库,避免运行时 DLL 找不到;--prefix指定安装路径,后面 Nginx 配置时直接引用。PCRE 和 zlib 类似,但 PCRE 要注意用 PCRE2 还是 PCRE1,Nginx 新版本对 PCRE2 支持更好,老版本可能只认 PCRE1。
提示:三个库的位数必须和编译器一致,64 位 MinGW 就编 64 位库,混用 32 位会在链接阶段报
file format not recognized。
3. 从源码到 nginx.exe:完整编译步骤与参数
工具齐了,接下来是实际编译。整个过程分四步:准备源码目录、跑configure、make、验证产物。每一步都有容易翻车的地方,尤其是路径和参数。
3.1 下载源码与目录结构约定
Nginx 源码从官网下载.tar.gz,解压到 MSYS2 能访问的路径。建议放在C:/src/nginx-x.x.x,避免中文和空格。依赖库也统一放在C:/nginx-deps下,形成固定结构,方便脚本复用。
# 目录约定示例 /c/src/nginx-1.24.0 # Nginx 源码 /c/nginx-deps/pcre # PCRE 安装前缀 /c/nginx-deps/zlib # zlib 安装前缀 /c/nginx-deps/openssl # OpenSSL 安装前缀路径用正斜杠,MSYS2 里C:/等价于/c/。不要用反斜杠,configure脚本对反斜杠处理不一致,容易把参数截断。
3.2 configure 参数逐个说明
进入 Nginx 源码目录,执行configure。下面是一组经过验证的参数,每个都解释清楚。
cd /c/src/nginx-1.24.0 ./configure \ --prefix=/c/nginx \ --with-cc=gcc \ --with-cpp=gcc \ --with-cc-opt="-I/c/nginx-deps/pcre/include -I/c/nginx-deps/zlib/include -I/c/nginx-deps/openssl/include" \ --with-ld-opt="-L/c/nginx-deps/pcre/lib -L/c/nginx-deps/zlib/lib -L/c/nginx-deps/openssl/lib -lpcre -lz -lssl -lcrypto" \ --with-pcre \ --with-zlib=/c/nginx-deps/zlib \ --with-openssl=/c/nginx-deps/openssl \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_stub_status_module--prefix是安装路径,最终make install会把文件放过去。--with-cc-opt和--with-ld-opt分别给编译器和链接器传头文件、库文件路径。--with-pcre不带路径时 Nginx 会尝试自己编译 PCRE,但 Windows 上经常失败,建议显式指定。--with-openssl同理,指向预编译好的 OpenSSL 前缀。
如果报checking for PCRE library ... not found,先确认-I和-L路径下确实有pcre.h和libpcre.a。如果报undefined reference to 'SSL_CTX_new',说明-lssl -lcrypto顺序或路径不对,链接器对库顺序敏感,被依赖的库放后面。
3.3 make 与 make install 的注意事项
configure成功后生成Makefile,直接make。Windows 上并行编译有时会出问题,建议先单线程跑一遍,确认无误再用-j。
make # 成功后再 make installmake过程中如果报nasm: command not found,回到 2.2 确认 nasm 装好。如果报cannot find -lpublic这类,通常是某个依赖库没编好或路径写错,检查C:/nginx-deps下对应库的lib目录。
make install后,/c/nginx下会出现conf、html、logs、sbin等目录,sbin/nginx.exe就是最终产物。用./sbin/nginx -V查看编译参数,确认 SSL、gzip 等模块都编进去了。
4. 避坑与排查:Windows 编译 Nginx 最常见的 5 个翻车点
这一章全是血泪经验,每条都按「现象 → 原因 → 解决」写,遇到问题直接对号入座。
4.1 现象:configure 报C compiler gcc is not found
原因:MSYS2 终端进错,或者gcc不在 PATH。MSYS 终端里没有 MinGW 的 gcc,只有 MSYS 自己的工具。
解决:关掉当前终端,用开始菜单里的MSYS2 MinGW 64-bit重新打开,which gcc确认在/mingw64/bin/gcc。如果还不行,pacman -S mingw-w64-x86_64-gcc重装。
4.2 现象:链接阶段报undefined reference to 'pcre_compile'
原因:--with-ld-opt里-lpcre没加,或者 PCRE 库路径不对,或者 PCRE 编成了动态库但没放对位置。
解决:确认C:/nginx-deps/pcre/lib下有libpcre.a或libpcre.dll.a。如果是动态库,把bin目录加到 PATH,或者干脆重新用--disable-shared编静态库。链接参数里-lpcre必须出现在使用它的目标文件之后。
4.3 现象:make 到一半报nasm: not found或 OpenSSL 编译中断
原因:nasm 没装,或者 OpenSSL 的Configure没指定mingw64目标,导致汇编文件生成失败。
解决:pacman -S nasm装好,nasm -v验证。OpenSSL 重新./Configure mingw64 no-shared,不要用默认的linux-x86_64,目标平台错了汇编语法不兼容。
4.4 现象:编译成功但运行nginx.exe报缺少libssl-3-x64.dll
原因:OpenSSL 编成了动态库,nginx.exe依赖 DLL,但 DLL 不在同目录或 PATH 里。
解决:要么把 OpenSSL 的bin目录加到系统 PATH,要么重新用no-shared编静态库再链接。生产环境建议静态链接,少一个依赖少一个故障点。
4.5 现象:make install后nginx -V显示没有--with-http_ssl_module
原因:configure时参数没写对,或者configure缓存了上一次的结果。
解决:删掉源码目录下的objs文件夹和Makefile,重新跑configure,确认输出里+ http_ssl_module带加号。nginx -V的输出是编译时固化的,改参数必须重新编译。
5. 进阶:用脚本固化工具链与验证编译产物
手工敲一遍能跑通,但换台机器又要重来。我一般会把整个流程写成一个build.sh,放在 MSYS2 里执行,把路径、版本、参数全部变量化。这样下次升级 Nginx 版本,只改变量就行。
#!/usr/bin/env bash set -euo pipefail NGINX_VER="1.24.0" DEPS="/c/nginx-deps" SRC="/c/src" # 检查工具 for cmd in gcc make perl nasm; do command -v "$cmd" >/dev/null || { echo "缺少 $cmd"; exit 1; } done # 编译 Nginx cd "$SRC/nginx-$NGINX_VER" ./configure \ --prefix=/c/nginx \ --with-cc-opt="-I$DEPS/pcre/include -I$DEPS/zlib/include -I$DEPS/openssl/include" \ --with-ld-opt="-L$DEPS/pcre/lib -L$DEPS/zlib/lib -L$DEPS/openssl/lib -lpcre -lz -lssl -lcrypto" \ --with-http_ssl_module \ --with-http_gzip_static_module make -j4 make install # 验证 /c/nginx/sbin/nginx -Vset -euo pipefail让脚本遇到错误立即退出,避免带着错误继续跑。command -v检查工具是否存在,比直接调用后看报错更早发现问题。make -j4并行编译,机器核多可以调大。
验证环节除了nginx -V,还可以实际启动一下,用curl测 HTTPS 和 gzip。
# 启动 Nginx /c/nginx/sbin/nginx # 测试 HTTPS(如果配了证书) curl -k https://127.0.0.1 # 测试 gzip curl -H "Accept-Encoding: gzip" -I http://127.0.0.1 # 停止 /c/nginx/sbin/nginx -s stopcurl -I看响应头里有没有Content-Encoding: gzip,有就说明 gzip 模块工作正常。HTTPS 返回 200 或 301 都算 SSL 模块加载成功。
一个我踩过的坑:MSYS2 的pacman -Syu更新后,有时gcc版本跳变导致之前编好的依赖库 ABI 不兼容,链接报一堆undefined reference。后来我习惯把依赖库和 Nginx 放在同一次会话里编,或者用pacman锁定版本。编译这种事,环境一致性比什么都重要,别在编译中途更新工具链。希望帮到你。
本文还有配套的精品资源,点击获取