前言:
官方给出的编译步骤是:
但按照推荐的步骤进行并不是很顺利,而且还有很多陷阱。 这里记录一下,同时总结出一个完全可靠的解决过程。
准备:
1、windows下C语言编译器
windows下的c语言编译器可以通过安装vs来获得,安装完成后会在对应的bin目录下(刚安装完vs后)。
2.Linux模拟工作环境MSYS
msys是一个模拟环境,里面包含了90多个通用的linux命令,让我们可以在windows系统上运行linux命令,可以理解为linux环境下各种工具的跨平台windows版本集合。 这就是为什么我们可以使用windows平台上的configure工具。
下载路径:
注意:这里只需要MSYS,因为最终编译时使用的是nmake而不是linux makewin源码编译,所以不需要安装mingw,使用起来太复杂。
3.项目配置脚本工具Perl
建议使用5.30以上版本。 我发现28版本在使用openssl时配置好像有问题。
下载路径:
ps: ActivePerl 和 Strawberry Perl 都可以
4.使用Mercurial获取Nginx源码
这是代码管理仓库的配套工具,相当于使用git工具从github下载代码。
下载路径:
不建议使用这个工具下载Nginx源码,因为虽然国外网络不通,但总会出现各种问题,所以可以直接从官网下载代码进行编译。
红框里的是源代码win源码编译,哪一个是Windows编译的release版本,我们要自己编译,所以他的release版本不适用。
有时在向外界发布源代码时,会出现“权重不够,两件事”的问题。 建议多下载几个进行一次编译,或者找源码下载。
5、准备Nginx的依赖库
Nginx的各个主要功能弱依赖一些第三方库:zlib、openssl、pcre。 其中openssl推荐使用1.0.x版本。 我在编译1.1.x的时候遇到了一些奇怪的问题,最后没有研究为什么(毕竟只是为了可用性)。
zlib下载路径:
PCR下载路径:
openssl下载路径:
ps:下载完源码后,你不需要自己编译那些项目,只需要解压它们,Nginx稍后会把它们一起编译(这个很方便)。
解压下载的包,然后在源码路径下创建objs/lib/目录,并解压到其中:
6.Nginx源码需要调整
找到 /nginx/src/http/ngx_http_header_filter_module.c 文件,找到以下变量的声明:
static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;
变成
static u_char ngx_http_server_string[] = "Server: " CRLF;
static u_char ngx_http_server_full_string[] = "Server: " CRLF;
static u_char ngx_http_server_build_string[] = "Server: " CRLF;
64 位编译更改(被 32 位编译忽略)
打开 nginxautolibopensslmakefile.msvc 文件。
找到“VC-WIN32”并替换为“VC-WIN64A”;
“如果存在 msdo_ms.bat”替换为“如果存在 msdo_win64a.bat”;
“msdo_ms”被替换为“msdo_win64a”。
7. 项目配置Configure
完成上述步骤后,就可以进行编译工程的配置了。 通用模板如下:
auto/configure --with-cc=cl --builddir=objs --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
--http-scgi-temp-path=temp/scgi_temp
--http-uwsgi-temp-path=temp/uwsgi_temp
--with-cc-opt=-DFD_SETSIZE=1024
--with-pcre=objs/lib/pcre
--with-zlib=objs/lib/zlib
--with-openssl=objs/lib/openssl
--with-select_module --with-http_ssl_module
注意:需要在源代码路径中指定-with-zlib、-with-openssl、-with-pcre这三个配置的值。
这里也采用了官方文档推荐的目录结构,即在Nginx源码根目录下创建objs文件夹,然后将这三个依赖库放在objs/lib/路径下。
执行上述命令后,将生成Makefile。
编译和部署:
1. 编译
编译时需要注意的是,nmake依赖于windows开发环境变量,所以不能使用普通的cmd命令行来运行nmake,而是使用vs提供的包含开发环境的命令行。
打开后,切换到Nginx源码根路径,执行:
nmake -f objs/Makefile
然后等待编译成功。
2. 部署
a) 将objsnginx.exe复制到上级目录
b) 创建文件夹logs、temp、html
3.删除多余文件
nginx目录下,如图所示,其余的都可以删除