參考如下信息
環境準備
源碼下載
編譯環境部署
- 打開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相關的報錯,不用管他就可以了,我們已經編譯完了。
部署