Nginx技巧之Windows下编译

时间:2024-05-22 19:22:39

本文主要论述的是如何在Windows下进行Nginx源码编译,尤其是一些埋坑点;自己已经踩过的坑,能救一个是一个。

1. 概述

众所周知,Nginx在Windows下的表现远落后于Linux;但奈何公司属于传统业务公司,体量小,加之实施人员水平堪忧,所以系统部署的服务器95%都是Windows Server操作系统,而且在web应用性能整体要求不高的情况下,把nginx作为一个反向和少量请求逻辑处理的应用还是很方便的。而最近在作的性能调优终于将目光转移到Nginx上了,本文就是在这样的背景下产生的。

2. 准备

  1. Visual Studio 2015 【下载地址
  2. MSYS 【下载地址
    1. 上面的下载链接进去之后,直接下载那个mingw-get-setup.exe程序即可。
  3. ActivePerl 【下载地址
  4. Mercurial安装包【下载地址
    1. 这是除Git,SVN之外的另外一款源码管理器。
    2. 其实这个安装包可以不下载,你可以选择直接从Nginx源码下载zip压缩包。
  5. Nginx依赖模块
    1. pcre 【下载地址】,笔者使用的是pcre-8.33.tar.gz
    2. zlib 【下载地址】,笔者使用的是pcre-8.33.tar.gz
    3. OpenSSL 【下载地址】 ,笔者使用的是 openssl-1.0.1u.tar.gz

上面的相关安装包下载完毕之后,按照以下规则进行存放

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的默认安装是不会勾选这些依赖的,所以千万记得将这些依赖勾选上。
Nginx技巧之Windows下编译

如果你不幸手速快过脑,那么请参阅下面这个链接 补救措施 ; 既然笔者能给出这个链接,说明也是手速快过脑的成员之一了。

3.2 安装MSYS
  1. 直接双击上面下载的mingw-get-setup.exe直接执行直接下一步即可。
  2. 安装完成之后找到文件bin/mingw-get.exe打开【上面推荐的Everything此时就派上用场了】
  3. 点击左侧的Basic Setup,右侧选择mingw32-base-binmsys-base-binNginx技巧之Windows下编译
  4. 点击菜单Insntallation-》Apply Changes 开始下载 Nginx技巧之Windows下编译
  5. 等待安装完成即可。
3.3 安装Perl
  1. 这一步就非常简单了,双击上面已经下载好的ActivePerl-5.24.3.2404-MSWin32-x64-404865.exe安装包,依然一路默认下去即可。
  2. 安装完毕之后, 在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. 补充

  1. 之前几次安装,换了多台机器,却依然是出现这样或那样的问题,最后一气之下整了一台全新的虚拟机从零开始装。
  2. 以上下载链接,在这篇博客发表时均是可用的。
  3. 写这种操作性博客,可比原理性博客轻松多了。
  4. 编译openssl时的前置操作
    Nginx技巧之Windows下编译
  5. visual studio 的命令行工具
    Nginx技巧之Windows下编译

7. Links

  1. windows编译nginx
  2. Office Site
  3. nginx concat模块配置 页面返回400 bad request