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文件做如下修改:

  1. 将83行的优化选项设置为-W3
  2. 将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”的路径

posted @ 2019-05-17 22:00  小蜗牛慢跑  阅读(9061)  评论(2编辑  收藏  举报