Windows10下编译Nginx源码

背景

因为之前使用的带有http-flv模块的Nginx版本是直接从网上下载别人编译好的,原因是一直编译不过去Windows版本的Nginx,所以使用人家编译好的,就懒得再研究,但是Nginx近期一直被项目扫描出有漏洞,不得不编译出一个新的出来,编译期间太多曲折,所以记录下,方便以后回顾。

环境准备

1、准备一台Windows10的电脑;
2、安装VS2017,记得选择安装社区版的vs_Community_2017.exe
3、安装ActivePerl,我这边使用的版本是ActivePerl-5.28.msi,这是为了编译OpenSSL准备的;
4、安装msys2,我这边使用的版本是msys2-x86_64-20211130.exe;
5、安装sed-4.2.1-setup.exe。
安装的过程就不多做讲解了,需要注意的是,安装完后,要确保安装目录都有加入到系统环境变量里面。

源码准备

1、下载nginx-1.20.2-code.tar.gz

注意:Nginx源码一定要到这个地址http://hg.nginx.org/nginx,不能到这个地址下载http://nginx.org/en/download.html,我就是因为从这里下载的源码没有WIN32的部分了,所以一直编译出问题。
我下载的是下图这个版本的,当前最新最稳定的版本,你们也可以根据需要下载其他版本。我们点击nginx-1.20.2-RELEASE进去下载。
在这里插入图片描述
在这里插入图片描述

2、下载nginx-http-flv-module-master.zip

我这边使用的是未央千城所维护的http-flv模块的源码,可以进入他的GitHub进行下载,直接下载zip即可。
在这里插入图片描述

3、下载openssl-1.1.1l.tar.gz

我选择的OpenSSL版本是openssl-1.1.1l,原因是,我在下载Nginx源码的时候,看到nginx-1.20.2之前基于Windows编译的有更新了OpenSSL版本,我看到里面的版本是openssl-1.1.1l,所以选择此版本(底下的pcre和zlib也同理)。但是网上也有人说openssl-1.1.1的版本会导致nginx编译不过,后面会有说如何解决。
在这里插入图片描述
在这里插入图片描述

4、下载pcre-8.44.zip

pcre我用的版本是pcre-8.44

5、下载zlib-1.2.11.tar.gz

zlib我用的版本是zlib-1.2.11

编译准备

解压nginx-1.20.2-code.tar.gz,并把文件夹重命名成nginx-1.20.2-code(强迫症行为)。
进入nginx-1.20.2-code目录,创建objs/lib,并把依赖的四个源码压缩包拷进去分别进行解压,如下图。
在这里插入图片描述

开始编译

1、Makefile生成

打开MSYS,进入到nginx-1.20.2源码目录。
在这里插入图片描述
在这里插入图片描述
执行configure进行Makefile文件的生成,可以使用如下命令:

auto/configure --with-cc=cl --with-debug --prefix= --conf-path=conf/nginx.conf --pid-path=logs/nginx.pid --http-log-path=logs/access.log --error-log-path=logs/error.log --sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp --http-proxy-temp-path=temp/proxy_temp --http-fastcgi-temp-path=temp/fastcgi_temp --http-scgi-temp-path=temp/scgi_temp --http-uwsgi-temp-path=temp/uwsgi_temp --with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=objs/lib/pcre-8.44 --with-zlib=objs/lib/zlib-1.2.11 --with-openssl=objs/lib/openssl-1.1.1l --with-openssl-opt=no-asm --with-http_ssl_module --with-http_sub_module --with-http_auth_request_module --add-module=objs/lib/nginx-http-flv-module-master

注意:我这边是有加入–with-http_auth_request_module,可以根据需要是否添加此模块;还有我这边的–prefix= 是没有带路径的,因为带了路径后面就得把conf、logs、temp等文件夹拷贝进去这个路径,不然会运行出错。

开始生成Makefile,需要等到一段时间,直到出现如下画面,证明已经成功,可以在源码目录和objs目录下看到有Makefile生成。
在这里插入图片描述

2、编译nginx源码

打开VS2017的命令行工具,进入到nginx源码目录,执行nmake:
在这里插入图片描述
在这里插入图片描述
这时候你就会遇到出错了。
1、如果遇到这样的报错:Can’t locate Win32/Console.pm in @INC,找到C:\Perl64\site\lib\ActivePerl目录下的Config.pm,打开文件,注释掉如下的代码后保存文件。
在这里插入图片描述
2、解决openssl部分编译不过的坑
打开D:\nginx\nginx-1.20.2-code\auto\lib\openssl目录下的makefile.msvc文件,修改如下部分:
在这里插入图片描述
3、修改Makefile
修改D:\nginx\nginx-1.20.2-code\objs\Makefile中的CFLAGS字段,去掉-W4 -WX的编译选项,添加-W3的编译选项

重新执行nmake编译
执行完上面的全部操作后,再回到VS2017命令行执行nmake就会开始编译,大概需要等十几分钟才会编译完成。编译成功的调试如下:
在这里插入图片描述
此时再回到objs目录下,会看到nginx.exe就是我们编译出来的。
在这里插入图片描述

编译完成后续

编译完成后,我们再去nginx官网下载一个Windows版本的nginx-1.20.2的程序。
在这里插入图片描述
解压下载下来的nginx-1.20.2.zip,把我们编译的nginx.exe替换进去,然后找到D:\nginx\nginx-1.20.2-code\objs\lib\nginx-http-flv-module-master\test下的nginx.conf替换到D:\nginx\nginx-1.20.2\conf目录下。打开cmd进行测试,执行nginx.exe -t 命令,出现如下调试证明编译出来的Windows版本的nginx可用。
在这里插入图片描述

部署

至此,我们就可以和FFmpeg进行一些rtmp推流和http-flv拉流的部署操作,我的其他博客有讲解这方面的内容,不再详解。

工具和源码下载

全套编译工具和源码:download
直接编译好可用的nginx:nginx-1.20.2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值