Nginx技巧之Windows下編譯
阿新 • • 發佈:2018-12-12
本文主要論述的是如何在Windows下編譯Nginx,尤其是一些埋坑點;自己已經踩過的坑,能救一個是一個。
1. 概述
眾所周知,Nginx在Windows下的表現遠落後於Linux;但奈何公司屬於傳統業務公司,體量小,加之實施人員水平堪憂,所以系統部署的伺服器95%都是Windows Server作業系統,而且在web應用效能整體要求不高的情況下,把nginx作為一個反向和少量請求邏輯處理的應用還是很方便的。而最近在作的效能調優終於將目光轉移到Nginx上了,本文就是在這樣的背景下產生的。
2. 準備
- Visual Studio 2015 【下載地址】
- 網上有說2013也是可以的,但如果你之前沒有安裝過VS,那麼還是推薦使用VS2015。
- MSYS 【下載地址】
- 上面的下載連結進去之後,直接下載那個mingw-get-setup.exe程式即可。
- ActivePerl 【下載地址】
- Mercurial安裝包【下載地址】
- 這是除Git,SVN之外的另外一款原始碼管理器。
- 其實這個安裝包可以不下載,你可以選擇直接從Nginx原始碼下載zip壓縮包。
- Nginx依賴模組
上面的相關安裝包下載完畢之後,按照以下規則進行存放
nginxBuild 【根目錄】 installer 【本次所需要的安裝包】 ActivePerl-5.24.3.2404-MSWin32-x64-404865.exe cn_visual_studio_enterprise_2015_with_update_3_x86_x64_dvd_8923298.iso mingw-get-setup.exe tortoisehg-4.7.1-x64.msi -- 這就是那個Mercurial安裝包,可以不下載 Everything-1.3.3.657b.x64.zip -- 建議安裝,用於安裝過程中確認某些檔案的存在位置 Git-2.18.0-64-bit.exe -- 筆者習慣使用它提供的工具集 lib 【本次編譯Nginx所依賴的】 nginx-http-concat.zip -- 本次我們要整合的 concat 元件 openssl-1.0.1u.tar.gz -- 需要注意的是openssl如果版本太高的話編譯會報錯,所以下載openssl的需要注意在官方地址的old目錄中找到對應的版本 pcre-8.33.tar.gz zlib-1.2.11.tar.gz src 【Nginx原始碼,版本為1.15.4】 nginx-87d2ea860f38.zip
3. 操作
3.1 安裝VS
MS的東西是出了名的無腦(換個詞就是輕鬆),但是這裡面有一個坑點就是這裡我們不能一路“下一步”,因為我們安裝VS的主要目的是使用其中包含的某些C++工具和依賴包,而VS2015的預設安裝是不會勾選這些依賴的,所以千萬記得將這些依賴勾選上。
如果你不幸手速快過腦,那麼請參閱下面這個連結 補救措施 ; 既然筆者能給出這個連結,說明也是手速快過腦的成員之一了。
3.2 安裝MSYS
- 直接雙擊上面下載的
mingw-get-setup.exe
直接執行直接下一步即可。 - 安裝完成之後找到檔案
bin/mingw-get.exe
開啟【上面推薦的Everything此時就派上用場了】 - 點選左側的Basic Setup,右側選擇
mingw32-base-bin
和msys-base-bin
; - 點選選單Insntallation-》Apply Changes 開始下載
- 等待安裝完成即可。
3.3 安裝Perl
- 這一步就非常簡單了,雙擊上面已經下載好的
ActivePerl-5.24.3.2404-MSWin32-x64-404865.exe
安裝包,依然一路預設下去即可。 - 安裝完畢之後, 在CMD下使用
perl -v
測試perl是否安裝成功。
4. 編譯
必要的應用程式已經安裝完畢,接下來就開始編譯過程。
# powershell下;
# 新建build資料夾做為我們編譯目錄,
# 並在build中新增lib存放依賴包解壓目錄
cd F:\_software\nginxBuild
mkdir src/build/lib
cd src\build\lib
# git下
# 解壓各個依賴,以及附加元件
# 執行以下命令之後, 目錄結構應如下:
# nginxBuild/src
# ---build
# ------lib
# ---------openssl-1.0.1u
# ---------pcre-8.33
# ---------zlib-1.2.11
# ---------nginx-http-concat
cd /f/_software/nginxBuild/src/build/lib/
tar -xzf ../../../lib/openssl-1.0.1u.tar.gz
tar -xzf ../../../lib/pcre-8.33.tar.gz
tar -xf ../../../lib/zlib-1.2.11.tar.gz
unzip ../../../lib/nginx-http-concat.zip
# 又一坑點,所以我特意在這裡就指出來。
# 對於解壓完畢的nginx-http-concat元件,切記修改其 ngx_http_concat_module.c 檔案,將其中第14行的 application/x-javascript 更改為application/javascript。
# 因為Nginx在新版本中,使用了標準的 MIME-Type:application/javascript。
# 這個問題相當坑,筆者一度懷疑自己的編譯出了問題。
# powershell下;
# 以下目的是 在生成Makefile之前把openssl模組的配置修改為x64的
# 更多細節參見下方的截圖
cd F:\_software\nginxBuild\src\build\lib\openssl-1.0.1u
perl Configure VC-WIN64A
ms\do_win64a
# 啟動msys.bat並cd到nginx原始碼目錄下
cd C:\MinGW\msys\1.0
start msys.bat
# 以下操作在 msys.bat 下 【MinGW不支援滑鼠複製和貼上,注意活用左上角】
# 注意最後的那行 -add-module 正是指示本次要附加的元件
cd F:/_software/nginxBuild/src
auto/configure --with-cc=cl --builddir=build --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 \
--with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=build/lib/pcre-8.33 \
--with-zlib=build/lib/zlib-1.2.11 --with-openssl=build/lib/openssl-1.0.1u \
--with-select_module \
--with-http_ssl_module \
--with-http_sub_module \
--add-module=build/lib/nginx-http-concat
# 以上操作將在build目錄下會生成一堆檔案,其中Makefile就是我們生成的編譯批處理檔案了。
# 以下操作,在編譯過程中程式碼會引用到很多系統自帶庫,所以我們需要用visual studio 的命令列工具來執行;
# visual studio 的命令列工具的開啟方式參見下方的貼圖
cd F:/_software/nginxBuild/src
set path=%path%;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
nmake -f build/Makefile
上面的步驟如果不出意外的話,等待個幾分鐘就可以看到編譯完成的提示;在編譯時最後提示找不到引用sed,但是不用管它,我們在build下的nginx.exe已經編譯成功了。
5. 測試
接下來讓我們來測試編譯成果
cd F:/_software/nginxBuild/src/
mv build/nginx.exe ./
# 啟動所需要的目錄檔案
mkdir logs,temp
touch logs/error.log
nginx.exe
curl 127.0.0.1
6. 補充
- 之前幾次安裝,換了多臺機器,卻依然是出現這樣或那樣的問題,最後一氣之下整了一臺全新的虛擬機器從零開始裝。
- 以上下載連結,在這篇部落格發表時均是可用的。
- 寫這種操作性部落格,可比原理性部落格輕鬆多了。
- 編譯openssl時的前置操作
- visual studio 的命令列工具