本文主要论述的是如何在Windows下进行Nginx源码编译,尤其是一些埋坑点;自己已经踩过的坑,能救一个是一个。
1. 概述
众所周知,Nginx在Windows下的表现远落后于Linux;但奈何公司属于传统业务公司,体量小,加之实施人员水平堪忧,所以系统部署的服务器95%都是Windows Server操作系统,而且在web应用性能整体要求不高的情况下,把nginx作为一个反向和少量请求逻辑处理的应用还是很方便的。而最近在作的性能调优终于将目光转移到Nginx上了,本文就是在这样的背景下产生的。
2. 准备
- Visual Studio 2015 【下载地址】
- 网上有说2013也是可以的,但如果你之前没有安装过VS,那么还是推荐使用VS2015。
- 错误解决 - 安装包损坏或丢失
- MSYS 【下载地址】
- 上面的下载链接进去之后,直接下载那个mingw-get-setup.exe程序即可。
- ActivePerl 【下载地址】
- Mercurial安装包【下载地址】
- 这是除Git,SVN之外的另外一款源码管理器。
- 其实这个安装包可以不下载,你可以选择直接从Nginx源码下载zip压缩包。
- Nginx依赖模块
上面的相关安装包下载完毕之后,按照以下规则进行存放
nginxBuild 【根目录】
installer 【本次所需要的安装包】
ActivePerl-5.24.3.2404-MSWin32-x64-404865.exe
cn_visual_studio_enterprise_2015_with_update_3_x86_x64_dvd_8923298.iso
mingw-get-setup.exe
tortoisehg-4.7.1-x64.msi -- 这就是那个Mercurial安装包,可以不下载
Everything-1.3.3.657b.x64.zip -- 建议安装,用于安装过程中确认某些文件的存在位置
Git-2.18.0-64-bit.exe -- 笔者习惯使用它提供的工具集
lib 【本次编译Nginx所依赖的】
nginx-http-concat.zip -- 本次我们要集成的 concat 组件
openssl-1.0.1u.tar.gz -- 需要注意的是openssl如果版本太高的话编译会报错,所以下载openssl的需要注意在官方地址的old目录中找到对应的版本
pcre-8.33.tar.gz
zlib-1.2.11.tar.gz
src 【Nginx源码,版本为1.15.4】
nginx-87d2ea860f38.zip
3. 操作
3.1 安装VS
MS的东西是出了名的无脑(换个词就是轻松),但是这里面有一个坑点就是这里我们不能一路“下一步”,因为我们安装VS的主要目的是使用其中包含的某些C++工具和依赖包,而VS2015的默认安装是不会勾选这些依赖的,所以千万记得将这些依赖勾选上。
如果你不幸手速快过脑,那么请参阅下面这个链接 补救措施 ; 既然笔者能给出这个链接,说明也是手速快过脑的成员之一了。
3.2 安装MSYS
- 直接双击上面下载的
mingw-get-setup.exe
直接执行直接下一步即可。 - 安装完成之后找到文件
bin/mingw-get.exe
打开【上面推荐的Everything此时就派上用场了】 - 点击左侧的Basic Setup,右侧选择
mingw32-base-bin
和msys-base-bin
; - 点击菜单Insntallation-》Apply Changes 开始下载
- 等待安装完成即可。
3.3 安装Perl
- 这一步就非常简单了,双击上面已经下载好的
ActivePerl-5.24.3.2404-MSWin32-x64-404865.exe
安装包,依然一路默认下去即可。 - 安装完毕之后, 在CMD下使用
perl -v
测试perl是否安装成功。
4. 编译
必要的应用程序已经安装完毕,接下来就开始编译过程。
# powershell下;
# 新建build文件夹做为我们编译目录,
# 并在build中新增lib存放依赖包解压目录
cd F:\_software\nginxBuild
mkdir src/build/lib
cd src\build\lib
# git下
# 解压各个依赖,以及附加组件
# 执行以下命令之后, 目录结构应如下:
# nginxBuild/src
# ---build
# ------lib
# ---------openssl-1.0.1u
# ---------pcre-8.33
# ---------zlib-1.2.11
# ---------nginx-http-concat
cd /f/_software/nginxBuild/src/build/lib/
tar -xzf ../../../lib/openssl-1.0.1u.tar.gz
tar -xzf ../../../lib/pcre-8.33.tar.gz
tar -xf ../../../lib/zlib-1.2.11.tar.gz
unzip ../../../lib/nginx-http-concat.zip
# 又一坑点,所以我特意在这里就指出来。
# 对于解压完毕的nginx-http-concat组件,切记修改其 ngx_http_concat_module.c 文件,将其中第14行的 application/x-javascript 更改为application/javascript。
# 因为Nginx在新版本中,使用了标准的 MIME-Type:application/javascript。
# 这个问题相当坑,笔者一度怀疑自己的编译出了问题。
# powershell下;
# 以下目的是 在生成Makefile之前把openssl模块的配置修改为x64的
# 更多细节参见下方的截图
cd F:\_software\nginxBuild\src\build\lib\openssl-1.0.1u
perl Configure VC-WIN64A
ms\do_win64a
# 启动msys.bat并cd到nginx源码目录下
cd C:\MinGW\msys\1.0
start msys.bat
# 以下操作在 msys.bat 下 【MinGW不支持鼠标复制和粘贴,注意活用左上角】
# 注意最后的那行 -add-module 正是指示本次要附加的组件
cd F:/_software/nginxBuild/src
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.33 \
--with-zlib=build/lib/zlib-1.2.11 \
--with-openssl=build/lib/openssl-1.0.1u \
--with-select_module \
--with-http_ssl_module \
--with-http_sub_module \
--add-module=build/lib/nginx-http-concat \
--add-module=build/lib/http_trim_filter
# 以上操作将在build目录下会生成一堆文件,其中Makefile就是我们生成的编译批处理文件了。
# 以下操作,在编译过程中代码会引用到很多系统自带库,所以我们需要用visual studio 的命令行工具来执行;
# visual studio 的命令行工具的打开方式参见下方的贴图
cd F:/_software/nginxBuild/src
set path=%path%;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
nmake -f build/Makefile
上面的步骤如果不出意外的话,等待个几分钟就可以看到编译完成的提示;在编译时最后提示找不到引用sed,但是不用管它,我们在build下的nginx.exe已经编译成功了。
5. 测试
接下来让我们来测试编译成果
cd F:/_software/nginxBuild/src/
mv build/nginx.exe ./
# 启动所需要的目录文件
mkdir logs,temp
touch logs/error.log
nginx.exe
curl 127.0.0.1
6. 补充
- 之前几次安装,换了多台机器,却依然是出现这样或那样的问题,最后一气之下整了一台全新的虚拟机从零开始装。
- 以上下载链接,在这篇博客发表时均是可用的。
- 写这种操作性博客,可比原理性博客轻松多了。
- 编译openssl时的前置操作
- visual studio 的命令行工具