windows 编译nginx源码及模块
一、环境准备
- msys2 安装
- 安装包下载
官方下载地址https://www.msys2.org ,官网下载速度较慢,可以使用如下地址
清华的镜像地址:https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/
中国科学技术大学的镜像地址:https://mirrors.ustc.edu.cn/msys2/distrib/
我下载的版本是msys2-x86_64-20190524.exe,本教程使用本版本 - 安装配置
默认安装即可:选择对应的安装路径,下一步下一步即可 - 使用
安装后有如下三个快捷键
根据你要编译的机器对象【x86/x64】选择对应的快捷方式打开程序,或者选择MSYS2 MSYS让程序根据机器选择。
- 安装包下载
- ActivePerl 安装
- 安装包下载
官方下载地址https://www.activestate.com/products/perl/downloads/,根据需要下载你所需要的版本,本教程使用的是ActivePerl-5.26.1.2601-MSWin32-x64-404865 - 安装配置
默认安装即可,安装时注意勾选【注册到环境变量path】这一栏(默认开启)
- 安装包下载
- sed 安装
- 下载
官方下载地址http://gnuwin32.sourceforge.net/packages/sed.htm 个人根据情况下载setup安装包或者二进制压缩包,需要手动配置环境变量path到sed文件所在的bin文件夹 - 安装配置
配置环境变量后,打开命令框,输入 sed --version查看是否配置完成,如下图
此步骤可以不做,编译时报sed命令错误,但是不影响编译结果
- 下载
- vc++ 2019 开发工具【vs2019】安装
- 安装配置
微软官方下载Visual studio 2019安装包,安装时记得选择VC++相关安装选项 - 工具使用
安装完成后,在开始菜单,找到Visual studio 2019文件夹,里面内容如下:
根据编译平台的实际情况选择打开对应的X86/X64 native Tools Command Prompt 命令框
- 安装配置
- 下载pcre源码
- 下载
官方地址http://www.pcre.org/ 本教程使用pcre-8.44.zip
- 下载
- 下载zlib源码
- 下载
- 官方地址http://zlib.net 本教程使用zlib-1.2.11.tar
- 下载openssl源码
- 下载
官方地址[https://www.openssl.org/]
Github下载地址https://github.com/openssl/openssl
本教程使用openssl-OpenSSL_1_0_1u,此处建议使用本版本,根据网友所说其他版本会报错,当初本着尝试的精神,测试了很多版本后发现编译ssl时会编译报错,因此血泪的教训让我在此强调使用1_0_1u版本
- 下载
二、 nginx源码编译
- 源码下载
建议下载官方release版本,下载地址[http://hg.nginx.org/nginx/]http://hg.nginx.org/nginx/
本教程使用编写此文档时最新版本:1.17.9 - 编译准备
-
创建对应的文件夹
下载nginx源码后解压到某磁盘的根目录下:在源码文件夹内新增objs文件夹,如下图:
打开objs文件夹,在下面创建lib和modules 分布存放要编译的lib 组件源码及第三方module源码,以便于编译到nginx.exe内,结构如图:
整体结构图如下:
├── nginx //nginx源码根目录
│ ├──auto
│ ├──conf
│ ├──contrib
│ ├──misc
│ ├──objs //新建该文件夹
│ │ ├──lib //新建该文件夹
│ │ ├──modules //新建该文件夹
│ ├──src -
修改编译文件
a. 修改msvc文件
打开文件 \nginx\auto\cc\msvc
添加如下内如:
b. 修改makefile.msvc文件
打开文件 \nginx\auto\lib\openssl\makefile.msvc -
修改源码
打开源码 \nginx\src\http\ngx_http_header_filter_module.c
-
- make编译
- 创建makefile文件
<span style="color:#333333">auto/configure --with-cc<span style="color:#a71d5d">=</span>cl --builddir<span style="color:#a71d5d">=</span>objs --prefix<span style="color:#a71d5d">=</span> \
--conf-path<span style="color:#a71d5d">=</span>conf/nginx.conf --pid-path<span style="color:#a71d5d">=</span>logs/nginx.pid \
--http-log-path<span style="color:#a71d5d">=</span>logs/access.log --error-log-path<span style="color:#a71d5d">=</span>logs/error.log \
--sbin-path<span style="color:#a71d5d">=</span>nginx.exe --http-client-body-temp-path<span style="color:#a71d5d">=</span>temp/client_body_temp \
--http-proxy-temp-path<span style="color:#a71d5d">=</span>temp/proxy_temp \
--http-fastcgi-temp-path<span style="color:#a71d5d">=</span>temp/fastcgi_temp \
--http-scgi-temp-path<span style="color:#a71d5d">=</span>temp/scgi_temp \
--http-uwsgi-temp-path<span style="color:#a71d5d">=</span>temp/uwsgi_temp \
--with-cc-opt<span style="color:#a71d5d">=</span>-DFD_SETSIZE<span style="color:#a71d5d">=</span>1024 --with-pcre<span style="color:#a71d5d">=</span>objs/lib/pcre \
--with-zlib<span style="color:#a71d5d">=</span>objs/lib/zlib --with-openssl<span style="color:#a71d5d">=</span>objs/lib/openssl \
--with-select_module --with-http_ssl_module --with-ipv6 \
--with-http_stub_status_module \
--with-http_flv_module --with-http_mp4_module \ <span style="color:#969896">#编译带flv 和mp4支持功能</span>
--add-module<span style="color:#a71d5d">=</span>objs/modules/nginx-http-flv-module \ <span style="color:#969896">#编译第三方模块 flv</span>
--add-module<span style="color:#a71d5d">=</span>objs/modules/nginx-vod-module --with-file-aio --with-threads --with-cc-opt<span style="color:#a71d5d">=</span><span style="color:#183691">"-O3"</span>
<span style="color:#969896">## 编译第三方模块 vod </span>
</span>
注意:配置项目中对应文件的存储路径
根据目标机器打开对应的MSYS2,进入对应的nginx源码目录,输入要生成makefile文件语句,如下图:
<span style="color:#333333"> 2. make编译文件
</span>
打开vs2019对应的x64/x86 本地命令工具,cd 到nginx对应的源码目录,输入
<span style="color:#333333">nmake -f objs/Makefile
</span>
如下图所示:
三、 测试使用
objs目录下生成的nginx.exe就是自己编译的文件,从网址下载对应的nginx二进制包,替换其他的nginx.exe文件,配置对应的nginx.conf即可正常使用
四、 常用第三方库总结
- nginx-http-flv-module模块https://github.com/winshining/nginx-http-flv-module
改模块包含nginx-rtmp-module模块的全部内容 - nginx-vod-module 模块