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文件做如下修改:
-
將83行的優化選項設置為-W3
-
將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”的路徑