Nginx 是众所周知的 Web 服务端软件, lnmp/lamp(linux nginx/apache mysql php) 也是比较常用的 Web 服务环境,这次我尝试在 Windows 平台上使用 Nginx 作为目录引索提供简单的 Web 下载服务。Nginx 最为简单的是 autoindex,但是外观非常糟糕,不仅看起来非常脏乱,而且无法搜索。Nginx 环境中有一个完全不依赖 php 的引索模块叫做 fancyindex,它可以比较优雅的完成这项任务,但是在 Windows 下预编译的 Nginx 并不提供此模块,因此我需要手动编译。
Contents
准备:
编译环境:
- MSYS 环境 (或者MSYS2)
- Microsoft Visual Studio,通常来说 2008 以及以上的版本都可以编译,此处我使用 2017
- Perl 环境,编译 openssl 需要用到,通常可以使用 Strawberry Perl 或者 ActivePerl
- Mercurial 和 Git,代码版本管理软件
- nasm, ASM 汇编优化包
以上内容为编译环境,nasm 可选,如果不安装 nasm 则需要在编译时禁用汇编优化。环境的安装不做赘述,多数环境可以按照向导指示直接进行安装。
获取源码:
nginx源码:
Windows 使用的源码不可以从 Nginx 官网直接下载,必须使用 Mercurial 同步,
hg clone http://hg.nginx.org/nginx
这一步可以在 CMD 或者 MSYS 的 bash 环境下完成。
其他 lib 以及附加模块源码:
分别下载 PCRE,zlib 和 OpenSSL 的源码并且解压(此处的代码需要在 MSYS 环境下执行):
mkdir -p objs/lib cd objs/lib tar -xzf ../../pcre-8.42.tar.gz tar -xzf ../../zlib-1.2.11.tar.gz tar -xzf ../../openssl-1.0.2q.tar.gz
同步 fanxyindex 源码
git clone https://github.com/aperezdc/ngx-fancyindex.git ngx-fancyindex
修改编译配置:
修改 openssl 编译配置(仅针对目标系统为 64bit):
Nginx 默认的设置是针对 32bit 系统的,因此我们需要简单的修改 nginx\auto\lib\openssl:
# Copyright (C) Igor Sysoev # Copyright (C) Nginx, Inc. all: cd $(OPENSSL) perl Configure VC-WIN64A no-shared \ --prefix="%cd%/openssl" \ --openssldir="%cd%/openssl/ssl" \ $(OPENSSL_OPT) if exist ms\do_win64a.bat ( \ ms\do_win64a \ && $(MAKE) -f ms\nt.mak \ && $(MAKE) -f ms\nt.mak install \ ) else ( \ $(MAKE) \ && $(MAKE) install_sw \ )
修改编译警告等级:
默认的编译警告可能会导致编译过程中以外的退出,因此我们对 nginx\auto\cc\msvc 进行修改(大约在 83 行):
# warnings CFLAGS="$CFLAGS -W3"
添加 msvc linker 版本:
如果这里不添加此参数,则会在下一步编译的时候触发异常提示 “auto/cc/msvc: line 117: [: : integer expression expected”,但实际不影响编译(大约在 17 行).
NGX_MSVC_VER=19.12 # MSVC 2017 (15.5.7) cl 19.12 echo " + cl version: $NGX_MSVC_VER"
删除对 manpage 的操作:
由于 Windows 的 CMD 或者 powershell 不含 sed 命令,因此如果不注释相关代码,则会造成报错,但不影响二进制生成。修改 nginx\objs\Makefile (大约在1762行):
manpage: objs/nginx.8 objs/nginx.8: docs/man/nginx.8 objs/ngx_auto_config.h #sed -e "s|%%PREFIX%%||" \ #-e "s|%%PID_PATH%%|/logs/nginx.pid|" \ #-e "s|%%CONF_PATH%%|/conf/nginx.conf|" \ #-e "s|%%ERROR_LOG_PATH%%|/logs/error.log|" \ #< docs/man/nginx.8 > $@
编译:
configure:
首先使用 MSYS 环境进行配置,此处的配置来源于 Nginx 官网预编译的版本,并且加入 fancyindex 模块(Nginx根目录)
auto/configure \ --with-cc=cl \ --builddir=objs \ --with-debug \ --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.42 \ --with-zlib=objs/lib/zlib-1.2.11 \ --with-select_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_stub_status_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_auth_request_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_slice_module \ --with-mail \ --with-stream \ --with-openssl=objs/lib/openssl-1.0.2q \ --with-http_ssl_module \ --with-mail_ssl_module \ --with-stream_ssl_module \ --add-module=objs/lib/ngx-fancyindex
如果不想用 nasm 进行优化,那么需要在编译参数中加入如下内容:
--with-openssl-opt=no-asm
compile:
操作完成后,就可以开始使用 MSVC 的编译工具链进行后续编译了:
如果目标系统为 64bit 那么就使用 64 Native Tools Command Prompt for VS 2017,编译前将 nasm 加入临时环境变量:
"C:\Program Files\NASM\nasmpath.bat"
然后开始编译(Nginx根目录):
nmake /f objs\MakeFile
在编译一段时间后即可得到 Nginx 的二进制文件了。有关 Fincyindex 的用法可以直接参考项目地址
Tips:
1.Windows 下Nginx的简单用法介绍(powershell):
start .\nginx #启动 nginx 进程 .\nginx -s stop #快速关闭全部 nginx 进程 .\nginx -s quit #正常退出 nginx 进程 .\nginx -s reload #重载配置文件,正常退出老进程,并且重新启动新的 nginx 进程 .\nginx -s reopen #重新打开 log 文件,可用作切割 log
2.Windows 环境下,中文虽然可以通过指定 gbk 编码正常显示,但是由于 url 会被转码的问题,无法正常使用,因此尽可能避免中文路径。
参考文档:
http://nginx.org/en/docs/howto_build_on_win32.html
https://blog.csdn.net/i348018533/article/details/51701865
https://www.cnblogs.com/lidabo/p/9077938.html