1. 程式人生 > >Nginx技巧之Windows下編譯

Nginx技巧之Windows下編譯

本文主要論述的是如何在Windows下編譯Nginx,尤其是一些埋坑點;自己已經踩過的坑,能救一個是一個。

1. 概述

眾所周知,Nginx在Windows下的表現遠落後於Linux;但奈何公司屬於傳統業務公司,體量小,加之實施人員水平堪憂,所以系統部署的伺服器95%都是Windows Server作業系統,而且在web應用效能整體要求不高的情況下,把nginx作為一個反向和少量請求邏輯處理的應用還是很方便的。而最近在作的效能調優終於將目光轉移到Nginx上了,本文就是在這樣的背景下產生的。

2. 準備

  1. Visual Studio 2015 【下載地址
    • 網上有說2013也是可以的,但如果你之前沒有安裝過VS,那麼還是推薦使用VS2015。
  2. MSYS 【下載地址
    1. 上面的下載連結進去之後,直接下載那個mingw-get-setup.exe程式即可。
  3. ActivePerl 【下載地址
  4. Mercurial安裝包【下載地址
    1. 這是除Git,SVN之外的另外一款原始碼管理器。
    2. 其實這個安裝包可以不下載,你可以選擇直接從Nginx原始碼下載zip壓縮包。
  5. Nginx依賴模組
    1. pcre 【下載地址】,筆者使用的是pcre-8.33.tar.gz
    2. zlib 【下載地址】,筆者使用的是pcre-8.33.tar.gz
    3. OpenSSL 【下載地址】 ,筆者使用的是 openssl-1.0.1u.tar.gz

上面的相關安裝包下載完畢之後,按照以下規則進行存放

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的預設安裝是不會勾選這些依賴的,所以千萬記得將這些依賴勾選上。 勾選C++依賴

如果你不幸手速快過腦,那麼請參閱下面這個連結 補救措施 ; 既然筆者能給出這個連結,說明也是手速快過腦的成員之一了。

3.2 安裝MSYS
  1. 直接雙擊上面下載的mingw-get-setup.exe直接執行直接下一步即可。
  2. 安裝完成之後找到檔案bin/mingw-get.exe開啟【上面推薦的Everything此時就派上用場了】
  3. 點選左側的Basic Setup,右側選擇mingw32-base-binmsys-base-binBasic Setup設定
  4. 點選選單Insntallation-》Apply Changes 開始下載在這裡插入圖片描述
  5. 等待安裝完成即可。
3.3 安裝Perl
  1. 這一步就非常簡單了,雙擊上面已經下載好的ActivePerl-5.24.3.2404-MSWin32-x64-404865.exe安裝包,依然一路預設下去即可。
  2. 安裝完畢之後, 在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. 補充

  1. 之前幾次安裝,換了多臺機器,卻依然是出現這樣或那樣的問題,最後一氣之下整了一臺全新的虛擬機器從零開始裝。
  2. 以上下載連結,在這篇部落格發表時均是可用的。
  3. 寫這種操作性部落格,可比原理性部落格輕鬆多了。
  4. 編譯openssl時的前置操作 編譯openssl時的前置操作
  5. visual studio 的命令列工具 VS2015開發人員命令提示

Links