Skip to content

Instantly share code, notes, and snippets.

@sursir
Last active January 10, 2018 12:48
Show Gist options
  • Select an option

  • Save sursir/b3b77d7a21755c5601fd1d7d7cf04b07 to your computer and use it in GitHub Desktop.

Select an option

Save sursir/b3b77d7a21755c5601fd1d7d7cf04b07 to your computer and use it in GitHub Desktop.
nginx build windows

Windows下手工编译Nginx

默认的nginx已经包含了很多通用的模块,详见:http://nginx.org/en/docs/ 但是如果需要增加一些第三方的模块的话(比如淘宝的HTTP请求合并模块:) 则需要下载nginx的源码并加入新的模块源代码一同重新编译。 下面为编译具体步骤

参考

Windows下编译Nginx超详细教程

需要准备的工具:

环境

源码

  • nginx(1.13.8)
  • 依赖的模块 (pcre-8.37,zlib-1.2.8,openssl-1.0.1s)
    • PCRE
    • zlib
    • OpenSSL(必须为指定版本,笔者写作时期当时要求必须为 openssl-1.0.1s,old 文件夹内)

OpenSSL 外,其他版本自由选择(最好无限接近上述版本)

其他模块

手工编译的主要原因应该是,官方编译缺少模块,故自己手动编译。

开始安装

安装MSYS

下载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因为这两个组件会在接下来用到。

下载nginx源码和依赖模块

首先安装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

配置nginx生成Makefile编译文件

64位系统配置

如果打包的系统是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.batcdnginx源码目录下执行:

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 工具,命令行下载。
  • 不要急。。不要急。。只要版本对还是可以编译成功的。。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment