Windows编译nginx
windows下利用MSYS2和VS的nmake编译nginx源码
之前写小论文的时候已经在Linux上部署好了Nginx的环境,在Linux上的安装比较简单,可以有两种方式:
1. 添加yum源,然后yum install nginx (CentOS),ubuntu上 sudo apt-get install nginx
2. 下载好nginx的源码,
auto/configure
make
make install
这周开始准备大论文,尝试在Windows上通过源码编译nginx,不断试错,总算实现了在Windows上通过源码编译出了nginx.exe
网上找资料需要MinGW+MSYS,这两个我下载不下来,于是考虑了Cygwin,也试过了MSYS2,最终在我的电脑上得到了想要的结果。如果各位同学有同样的需求的话可以参考一下。
安装需要:openssl;pcre;zlib;这三个nginx依赖的库可自行网上下载,我最后用的是在GitHub上找的一篇参考文献中的,链接:https://github.com/tjliupeng/nginx-build-windows
Perl解释器,我用的是ActivePerl;
MYSY2,nginx是32位的,所以最好用32位的,我用的是清华大学镜像站下的20150916版本32位:https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/i686/
另外没有安装VS的可能需要安装一下VS,因为需要用到nmake
下面先列出编译过程,在最后总结可能的出错原因。
1.下载解压Nginx所依赖的库
Openssl:实现安全套接字ssl功能
Pcre:实现正则表达式解析
Zlib:实现gzip压缩解压缩功能
2. 安装Perl解释器,主要为了解析openssl中的脚本
3.下载好Nginx的源码包
在Nginx官网下载ngixn的源码包
http://hg.nginx.org/nginx 或者 http://nginx.org/en/download.html
然后,解压。
在源码根目录下新建一个objs目录,在objs目录下新建lib文件夹,将解压好的openssl、pcre、zlib拷贝到lib目录下
4.下载安装MSYS2(模拟unix环境)
生成Makefile之前先将源码的auto\cc目录的msvc文件做如下修改:
-
将83行的优化选项设置为-W3
-
将117和119行注释掉(因为我用的VS2019,版本较高,需要注释掉,不然会报异常)
切换到Nginx源码包的解压目录下(根目录)
执行以下命令(这一段脚本我在最后列出,可直接复制):
上述命令是生成可以通过VS的nmake编译的Makefile
编译后是这样:
至此,可以关闭MSYS2了。(没有用到gcc,只是下载一个msys2来执行configure脚本,因为之前找资料是MinGW+MSYS,所以最后还试过MSYS2通过pacman命令安装gcc,make,最后发现好像没用到gcc,重装了好几次MSYS2了,最后选择的20150916版本的32位)
此时源码根目录下生成一个Makefile文件,objs文件夹下生成一些Makefile和编译要用到的头文件
5.打开VS的命令行
选择32位下的命令行
或者通过cmd命令行打开vc子目录下的vcvars32.bat(网上的教程里面列出的的绝对路径和vs2017、vs2019有点出入,可自行找找
我的vs2019路径是C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build)
切换到源码根目录 nmake –f objs/Makefile
用VS的nmake进行编译就可以在objs目录下生成exe文件
在我的机器上大概两三分钟编译完如下所示:
此时,在objs目录下生成了nginx.exe文件
6. Nginx的发布
新建一个nginx的文件夹,在源码中的conf,contrib,html拷贝过来,将objs目录中生成的nginx.exe放进来,再新建logs和temp文件夹,就完成了nginx for windows的工作。
整个文件夹体积也比较小,不到4MB,双击nginx.exe,就能运行nginx了,我们可以在浏览器中访问http://localhost:80 (nginx默认监听80端口)
Nginx build for windows总结:
1.Nginx是32位的软件,所以最好使用32位的MSYS2和VS的32位命令行编译
2.如果要在64位上编译,需要修改openssl中生成的Makefile文件
3.Openssl1.1以上的版本需要将Makefile中的 VC-WIN32 改成 VC-WIN64A
4.Openssl1.0的版本需要更改INSTALL.W64文件文件找到To build for Win64/x64,用perl执行那几行脚本。
官方给出的nginx build for nginx 的文档:
http://nginx.org/en/docs/howto_build_on_win32.html#build_steps
在MSYS2中执行的脚本代码,如果下载的nginx的源码里面configure文件在根目录,则第一行位./configure \ ,下面指定cl编译器,以及logs和temp的目录等。
auto/configure \ --with-cc=cl \ --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-8.40 \ --with-zlib=objs/lib/zlib-1.2.11 \ --with-openssl=objs/lib/openssl \ --with-openssl-opt=no-asm \ --with-select_module \ --with-http_ssl_module \ --with-http_sub_module \ --with-openssl-opt=no-asm
另外附上一个GitHub上的可以直接在VS上调试nginx的链接:https://github.com/tumtumtum/nginx-visualstudio
下载后,需要将root目录改为conf
然后可以在config目录下的ngx_auto_config.h文件中根据需要更改“*_temp”的路径