默认的nginx已经包含了很多通用的模块,详见:http://nginx.org/en/docs/ 但是如果需要增加一些第三方的模块的话(比如淘宝的HTTP请求合并模块:) 则需要下载nginx的源码并加入新的模块源代码一同重新编译。 下面为编译具体步骤
- visual studio 2013/2015/2017 生成工具(命令行工具)
- 下载MSYS,地址:https://sourceforge.net/projects/mingw/files/Installer/ 下载mingw-get-setup.exe
- 辅助工具,安装perl,ActivePerl和Strawberry Perl都可以
- nginx(1.13.8)
- 依赖的模块 (pcre-8.37,zlib-1.2.8,openssl-1.0.1s)
除 OpenSSL 外,其他版本自由选择(最好无限接近上述版本)
手工编译的主要原因应该是,官方编译缺少模块,故自己手动编译。
下载mingw-get-setup.exe直接执行直接下一步即可,安装完成之后找到文件bin/mingw-get.exe打开,用这个来安装msys点击左侧的Basic Setup右侧选择mingw32-base和msys.base只有点击菜单isntallation-》Apply Changes 开始下载,完成之后点击左侧All Packages-》MSYS-》MSY Base System检查右侧菜单的选中组件中是否有msys-make、msys-tar因为这两个组件会在接下来用到。
首先安装Mercurial并在环境变量中添加C:\Program Files\Mercurial\目录,因为我们需要在命令行中使用hg命令来获取nginx的源码。
nginx
lib
---openssl-1.0.1s.tar.gz
---pcre-8.37.tar.gz
---zlib-1.2.8.tar.gz
---nginx-http-concat
在nginx目录中新建build文件夹做为我们编译目录,并在build中新增lib存放依赖包解压目录。
nginx
---build
------lib
打开MSYS安装目录下的msys.bat命令行工具,cd到nginx/build/lib目录下执行:
tar -xzf ../../lib/openssl-1.0.1s.tar.gz
tar -xzf ../../lib/pcre-8.37.tar.gz
tar -xf ../../lib/zlib-1.2.8.tar.gz
zlib下载了后好像不是gzip格式的所以不能用-z参数,combo模块因为是源码直接拷贝到nginx/build/lib下即可 目前目录呈现这样子:
nginx
---build
------lib
---------openssl-1.0.1s
---------pcre-8.37
---------zlib-1.2.8
---------nginx-http-concat
如果打包的系统是x64的话需要在生成Makefile之前把openssl模块的配置修改为x64的,到nginx/build/lib/openssl-1.0.1s目录下,找到INSTALL.W64文件,用编辑器打开,找到类似如下文字:
To build for Win64/x64:
> perl Configure VC-WIN64A
> ms\do_win64a
> nmake -f ms\ntdll.mak
> cd out32dll
> ..\ms\test
在cmd命令行中cd到目录下分别执行前两句:
perl Configure VC-WIN64A
ms\do_win64a
执行成功即可。
启动msys.bat并cd到nginx源码目录下执行:
auto/configure --with-cc=cl --builddir=build --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 \
--with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=build/lib/pcre-8.37 \
--with-zlib=build/lib/zlib-1.2.8 --with-openssl=build/lib/openssl-1.0.1s \
--with-select_module --with-http_ssl_module --with-ipv6 \
--with-http_sub_module \
--add-module=build/lib/nginx-http-concat
执行完毕之后在build目录下会生成一堆文件,其中Makefile就是我们生成的编译批处理文件了。
在vs命令行工具中执行命令:
nmake -f build/Makefile
但是这次我们不能用msys.bat来执行了,因为编译过程中代码会引用到很多系统自带库如果不在一个命名空间是无法引用的。 我们用visual studio 的命令行工具来执行(快捷方式在windows全部程序visual studio目录中)。 开始执行等待大概几分钟,如果没有意外就成功了,我在编译时最后提示找不到引用sed我看了一下是mingw中的引用文件,但是不用管他我们在build下的nginx.exe已经编译成功了。
./nginx.exe -v
- OpenSSL 一定要完全对上版本,否则会失败
- visual studio 工具,命令行下载。
- 不要急。。不要急。。只要版本对还是可以编译成功的。。