参考如下信息
环境准备
源码下载
编译环境部署
- 打开msys2, 等msys2初始化完成后,会在msys2的统计目录中多出来一个opt的文件夹,将下载的源码都复制到该目录
- 在msys2的终端中切换路径的/opt,就能查看到源码
cd /opt && ls
tar -zxvf nginx-8acaa1161783.tar.gz && tar -zxvf openssl-1.0.2p.tar.gz && tar -zxvf pcre-8.38.tar.gz && tar -zxvf zlib-1.2.11.tar.gz
- 修改代码结构,将依赖的源码都移动到nginx-8acaa1161783/objs/lib目录
cd nginx-8acaa1161783/ && mkdir -p objs/lib && mv ../openssl-1.0.2p ../pcre-8.38 ../zlib-1.2.11 ./objs/lib
开始编译
- 执行configure,这一步路径是关键,我这里是假设我最终会在D:\nginx下运行我的nginx程序,如果不想放在D:\nginx下,也可以根据情况去修改路径。但一定不是/opt,/usr/local这一类的linux路径格式
- 运行的时候出现了auto/cc/msvc: line 117: [: : integer expression expected的错误信息,看了一下auto/cc/msvc的文件,应该是版本判断时出错了,将如下原文修改为,并重新执行一下configure的命令
# 修改前
# MSVC 2005 supports C99 variadic macros
if [ "$ngx_msvc_ver" -ge 14 ]; then
have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have
fi
# 修改后
# MSVC 2005 supports C99 variadic macros
# if [ "$ngx_msvc_ver" -ge 14 ]; then
have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have
# fi
auto/configure \
--with-cc=cl \
--with-debug \
--prefix=D:/nginx \
--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=D:/nginx/temp/client_body_temp \
--http-proxy-temp-path=D:/nginx/temp/proxy_temp \
--http-fastcgi-temp-path=D:/nginx/temp/fastcgi_temp \
--http-scgi-temp-path=D:/nginx/temp/scgi_temp \
--http-uwsgi-temp-path=D:/nginx/temp/uwsgi_temp \
--with-cc-opt=-DFD_SETSIZE=1024 \
--with-pcre=./objs/lib/pcre-8.38 \
--with-zlib=./objs/lib/zlib-1.2.11 \
--with-openssl=./objs/lib/openssl-1.0.2p \
--with-openssl-opt=no-asm \
--with-select_module \
--with-http_ssl_module
- 修改openssl的编译参数,使其支持64位编译器
- 打开.\auto\lib\openssl\makefile.msvc文件
- 找到“VC-WIN32”替换为“VC-WIN64A”;
- “if exist ms\do_ms.bat”替换为“if exist ms\do_win64a.bat”;
- “ms\do_ms”替换为“ms\do_win64a”。
- 修改nginx-8acaa1161783/objs/Makefile中的CFLAGS字段,去掉-W4 -WX的编译选项,添加-W3的编译选项
- 启动Visual Studio x64 Win64命令提示框,将路径切换到nginx-8acaa1161783。然后直接输入nmake进行编译。
- 编译完成之后会有一个与sed相关的报错,不用管他就可以了,我们已经编译完了。
部署