简介:这份资源面向需要在 Windows 平台自行编译 Nginx 的开发者与运维人员,尤其适合希望集成 http-flv 模块、实现 HTTP 直播流分发的技术场景。包内提供 Nginx 1.20.2 源码及 http-flv 模块源码,并配套 OpenSSL、PCRE、Zlib 等依赖库源码,同时收录 ActivePerl、msys2、sed 等编译工具,帮助读者在 Win10 与 VS2017 环境下搭建完整的编译链路,省去逐项搜集依赖的繁琐过程。资源共 28 个文件,以 vim 配置、license 授权说明、pl 脚本、conf 配置、readme 说明、html 页面及 exe 可执行文件等为主,压缩包约 102.07MB,目录结构清晰,便于按模块定位源码与工具。目前已有 541 人学习下载,适合具备一定 C 语言与 Windows 构建基础、需要快速复现 Nginx 编译流程并集成第三方模块的读者参考使用。
1. Windows 上把 Nginx 源码编译成 exe:这套工具包到底省了哪些事
很多人第一次在 Windows 上折腾 Nginx 编译,都是被同一个场景逼出来的:官方只给 Linux 包,Windows 版要么是别人编好的旧版本,要么缺了某个第三方模块,想加个--with-http_ssl_module之外的东西,发现根本没法改。于是只能自己上,结果一上来就卡在环境上——没有 gcc、没有 make、没有 pcre、没有 zlib、没有 openssl,命令行敲下去全是「不是内部或外部命令」。这套「Windows编译Nginx必要工具.rar」解决的就是这个最脏最累的环节:它把在 Windows 上编译 Nginx 所需的编译器和依赖库打包在一起,让你不用一个个去官网翻下载页、不用纠结 MinGW 和 MSYS2 的版本搭配,直接进入「配置—编译—排错」的主流程。适合两类人:一是需要给 Nginx 加自定义模块、改源码行为的运维和后端;二是想搞清楚 Nginx 在 Windows 上到底怎么从源码变成可执行文件、不想只当个下载安装党的工程师。下面按我实际拆包复现的顺序讲,参数和坑都落到具体命令上。
2. 工具包里有什么:编译链、依赖库和目录结构怎么对应
2.1 编译 Nginx 在 Windows 上到底缺什么
Nginx 本身是 C 写的,源码编译离不开三样东西:C 编译器、构建工具、以及它依赖的几个库。在 Linux 上这些通常一个apt install build-essential就齐了,Windows 没有这套包管理默认环境,所以必须手动凑齐。核心依赖是四个:PCRE(正则表达式,Nginx 的 location 匹配、rewrite 都靠它)、zlib(gzip 压缩)、OpenSSL(HTTPS/TLS)、以及编译器本身。少任何一个,configure阶段就会直接报错退出,而且报错信息往往只告诉你「not found」,不告诉你该装哪个版本。
这套工具包的价值就在于它把这些东西的 Windows 可用版本预先配好了。常见做法是里面会包含 MinGW-w64 或 MSYS2 的编译器套件、对应版本的 pcre、zlib、openssl 源码或预编译库,以及一个能跑configure脚本的 shell 环境。你拿到手之后,第一件事不是急着编译,而是先确认目录结构,搞清楚哪个是编译器、哪个是依赖、哪个是 Nginx 源码本身。
2.2 目录结构核对与路径规划
解压之后,我一般会先列一遍顶层目录,确认工具链和依赖的位置。典型结构大致是这样,具体名字以你包内实际为准:
| 目录/文件 | 作用 | 编译时怎么用 |
|---|---|---|
mingw64/或msys2/ | 编译器与 shell 环境 | 提供 gcc、make、bash |
pcre-*/ | 正则库源码 | --with-pcre=路径 |
zlib-*/ | 压缩库源码 | --with-zlib=路径 |
openssl-*/ | TLS 库源码 | --with-openssl=路径 |
nginx-*/ | Nginx 源码 | 编译主体 |
路径规划有个血泪经验:整个工具包不要放在带空格或中文的路径下。C:\Program Files\这种带空格的路径,会让 configure 脚本里拼接的命令在传参时被截断,报出一堆莫名其妙的「No such file」。我一般直接丢到C:\nginxbuild\这种纯英文无空格的短路径下,后面所有命令都基于这个根目录。
确认结构之后,进入编译器提供的 shell。如果是 MSYS2/MinGW 套件,通常是运行它自带的mingw64.exe或msys2.exe,而不是直接用 Windows 的 cmd。这一点很关键,因为 configure 是 bash 脚本,cmd 跑不了。
# 进入工具链自带的 shell 后,先确认编译器可用 gcc --version make --version # 输出里能看到版本号,说明编译环境就绪这两条命令是编译前的体检。gcc --version有输出,说明 C 编译器在 PATH 里;make --version有输出,说明构建工具可用。如果提示 command not found,说明你进错了 shell,或者工具链的 bin 目录没加进 PATH,这时候别硬编,先把环境理顺。
2.3 依赖库版本与 Nginx 版本的匹配
依赖库不是越新越好。OpenSSL 尤其敏感,Nginx 某些版本对 OpenSSL 3.x 的支持是后来才补上的,如果你拿一个老版本 Nginx 源码配一个新版 OpenSSL,编译到一半会在 TLS 相关文件上报错。常见做法是:工具包里自带的依赖版本,就是和它配套 Nginx 版本验证过的组合,优先用包内的,不要自己去下最新版替换。
PCRE 也有类似问题。PCRE1 和 PCRE2 的 API 不一样,Nginx 老版本认 PCRE1,新版本逐步转向 PCRE2。如果你--with-pcre=指到了不匹配的大版本,configure 能过,但 make 阶段会报函数找不到。判断方法很简单:看工具包里 pcre 目录名带不带2,再对照 Nginx 源码auto/lib/pcre/下的探测逻辑,别凭感觉换。
3. 从 configure 到 make:一条能跑通的编译命令链
3.1 configure 参数逐个拆解
环境确认完,进入 Nginx 源码目录,开始 configure。这是整个编译里参数最密集的一步,每个--with-和--without-都直接影响最终 exe 带不带某个功能。下面是一条我实际用过的、相对完整的命令:
# 在 Nginx 源码根目录下执行 ./configure \ --prefix=/nginx \ --with-cc=gcc \ --with-cpp=g++ \ --with-cc-opt="-DFD_SETSIZE=1024" \ --with-pcre=../pcre-8.45 \ --with-zlib=../zlib-1.2.13 \ --with-openssl=../openssl-1.1.1w \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_realip_module逐项说明:--prefix是安装路径,Windows 下建议用短路径,别用默认的/usr/local/nginx,否则 make install 时容易因为权限或路径映射失败。--with-cc和--with-cpp显式指定编译器,避免脚本探测到系统里别的编译器。--with-cc-opt里加-DFD_SETSIZE=1024是 Windows 下的常见补丁,Windows 默认的 fd 集合大小偏小,高并发连接时 select 会出问题,这个宏把它调大。
--with-pcre、--with-zlib、--with-openssl三个指向依赖源码目录,注意是相对当前 Nginx 源码目录的路径,写错一个就报 not found。后面几个--with-http_*是模块开关,http_ssl_module提供 HTTPS,gzip_static支持预压缩文件,stub_status给你一个状态页看连接数,realip用于反代场景取真实客户端 IP。不需要的模块可以不写,但 SSL 和 gzip 基本是刚需。
3.2 configure 报错怎么读
configure 失败时,输出最后几行是关键。最常见的三类:
第一类是checking for PCRE library ... not found,说明--with-pcre路径不对,或者那个目录里没有configure文件(PCRE 源码目录本身要能被 Nginx 的探测脚本识别)。解决就是核对路径,确保指向的是解压后的源码根目录,不是它的子目录。
第二类是C compiler gcc is not found,说明你不在正确的 shell 里,或者 gcc 不在 PATH。回到 2.2 的体检步骤。
第三类是 OpenSSL 相关的not found或版本报错。先确认路径,再确认版本匹配。如果 configure 过了但 make 阶段在 SSL 文件上报错,基本就是版本不兼容,换回工具包自带的 OpenSSL。
提示:configure 的输出会写进
objs/目录下的日志,报错时别只看屏幕,去objs/autoconf.err里翻完整信息,比屏幕上的片段清楚得多。
3.3 make 与 make install 的产物
configure 通过后,直接make。这一步耗时取决于机器,几分钟到十几分钟都正常。make 过程中如果报错,多半是依赖库版本问题或源码补丁缺失,错误行会指向具体文件,按文件去判断是哪个库的锅。
# 编译 make # 编译成功后安装到 prefix 指定目录 make installmake成功后会生成objs/nginx.exe,这是编译产物。make install会把它和配置、日志目录一起复制到--prefix指定的路径下。Windows 下make install有时会因为路径权限失败,如果只是想要 exe,其实objs/nginx.exe已经可以直接用了,把它拷出来配上 conf 目录就能跑。
验证编译结果:
# 查看版本和编译进去的模块 ./objs/nginx.exe -V-V会打印版本号和 configure 时的完整参数,你能看到自己加的模块有没有生效。这一步是编译成功的硬证据,比「没报错」可靠。
4. 编译踩坑排查:五个我真实翻过的车
4.1 现象:configure 报 PCRE not found,路径明明是对的
原因:Nginx 探测 PCRE 时,会去指定目录找configure或Makefile之类的标志文件,如果你指向的是 PCRE 的某个子目录,或者 PCRE 源码没解压完整,探测就失败。另一个隐蔽原因是路径里带了反斜杠\,bash 不认。
解决:用正斜杠/写路径,确认指向的是 PCRE 源码根目录,进去ls一下能看到configure文件。路径尽量用相对路径,减少出错。
4.2 现象:make 到一半报 OpenSSL 函数未定义
原因:OpenSSL 大版本不匹配。Nginx 源码里对 OpenSSL 的调用是按特定 API 写的,1.1.1 和 3.x 之间有不少函数签名变化,混用就报未定义。
解决:换回工具包自带的 OpenSSL 版本,别追新。如果非要换,先查 Nginx 版本对 OpenSSL 的支持范围,再决定。
4.3 现象:编译成功,但 nginx.exe 一启动就闪退
原因:Windows 下 Nginx 启动依赖 conf 目录和日志目录的相对位置,如果你把 exe 单独拷出来,没带 conf,它会找不到配置直接退出。另一个原因是端口被占用,80 端口常被 IIS 或别的服务占了。
解决:保持 exe 和 conf、logs 目录的相对结构,或者用-p指定前缀路径。端口占用就改 conf 里的 listen,或者先netstat -ano | findstr :80查出占用进程。
4.4 现象:make 报错找不到 make 命令
原因:你用的是 Windows 的 cmd 或 PowerShell,不是工具链自带的 bash 环境。configure 和 make 都是 Unix 工具链的东西,cmd 里没有。
解决:回到工具链提供的 shell(MSYS2/MinGW 终端)里执行,别在 cmd 里硬敲。
4.5 现象:编译出来的 exe 体积异常大或功能缺失
原因:configure 时模块开关没配对,或者依赖库被静态链接进去了。Nginx 默认会把依赖静态编进 exe,所以体积大是正常的,但如果某个模块你以为开了实际没开,-V一看参数就知道。
解决:编译完必跑nginx.exe -V,对照你 configure 时的参数逐项核对,别凭记忆。
5. 进阶:把编译产物做成可复用构建脚本
编译一次成功不代表下次还顺。依赖路径、参数、环境变量这些东西,隔两周再编一次,很容易忘掉某个细节又翻车。我的习惯是把整条链路写成一个 bash 脚本,放在工具包根目录,下次直接跑脚本,不靠记忆。
#!/bin/bash # build_nginx.sh - 放在工具包根目录执行 set -e # 任何一步失败立即停止,避免带错误继续 NGINX_SRC="nginx-1.24.0" PCRE_SRC="pcre-8.45" ZLIB_SRC="zlib-1.2.13" OPENSSL_SRC="openssl-1.1.1w" PREFIX="/nginx" cd "$NGINX_SRC" ./configure \ --prefix="$PREFIX" \ --with-cc=gcc \ --with-cpp=g++ \ --with-cc-opt="-DFD_SETSIZE=1024" \ --with-pcre="../$PCRE_SRC" \ --with-zlib="../$ZLIB_SRC" \ --with-openssl="../$OPENSSL_SRC" \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_stub_status_module make make install # 编译完立即验证 "$PREFIX/sbin/nginx.exe" -V脚本里set -e是关键,它让脚本在 configure 或 make 失败时立刻停下,不会带着半成品继续往下跑,省得你对着一个残缺的 exe 排查半天。变量抽出来是为了改版本时只动一处,不用在命令里到处找。
参数上有个可调点:--with-cc-opt里除了FD_SETSIZE,还可以加优化级别,比如-O2,但 Windows 下 MinGW 的优化有时会触发奇怪的编译错误,我一般保守不加,稳定优先。如果你要加第三方模块,用--add-module=../模块路径追加,模块源码要能被 Nginx 的构建系统识别,路径同样用相对路径。
验证方法除了-V,还可以实际起一个最小配置跑一下:
# 在 prefix 目录下 ./nginx.exe -t # 测试配置文件语法 ./nginx.exe # 启动 curl http://127.0.0.1 # 看是否返回默认页 ./nginx.exe -s stop # 停止-t是配置语法检查,改完 conf 先跑它,能挡掉大部分低级错误。curl返回默认欢迎页,说明编译产物功能完整。这套流程走通一次,后面换版本、加模块,都只是改脚本里的变量和参数,不用再从零摸环境。
从那以后我每次编译 Nginx,不管多急,都强制先跑一遍gcc --version和nginx.exe -V这两个体检,前者确认环境没漂,后者确认产物没缺模块。编译这东西,环境对了就顺,环境差一点就全是玄学报错,把体检做成习惯,比事后翻日志省事得多。希望帮到你。
本文还有配套的精品资源,点击获取