在 Windows 平台编译 64bit Nginx

IT, 其他
没有评论

Nginx 是众所周知的 Web 服务端软件, lnmp/lamp(linux nginx/apache mysql php) 也是比较常用的 Web 服务环境,这次我尝试在 Windows 平台上使用 Nginx 作为目录引索提供简单的 Web 下载服务。Nginx 最为简单的是 autoindex,但是外观非常糟糕,不仅看起来非常脏乱,而且无法搜索。Nginx 环境中有一个完全不依赖 php 的引索模块叫做 fancyindex,它可以比较优雅的完成这项任务,但是在 Windows 下预编译的 Nginx 并不提供此模块,因此我需要手动编译。

准备:

编译环境:

  • MSYS 环境 (或者MSYS2)
  • Microsoft Visual Studio,通常来说 2008 以及以上的版本都可以编译,此处我使用 2017
  • Perl 环境,编译 openssl 需要用到,通常可以使用 Strawberry Perl 或者 ActivePerl
  • MercurialGit,代码版本管理软件
  • nasm, ASM 汇编优化包

以上内容为编译环境,nasm 可选,如果不安装 nasm 则需要在编译时禁用汇编优化。环境的安装不做赘述,多数环境可以按照向导指示直接进行安装。

获取源码:

nginx源码:

Windows 使用的源码不可以从 Nginx 官网直接下载,必须使用 Mercurial 同步,


hg clone http://hg.nginx.org/nginx

这一步可以在 CMD 或者 MSYS 的 bash 环境下完成。

其他 lib 以及附加模块源码:

分别下载 PCREzlib 和 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

, ,
上一篇文章
在 ubuntu 18.04 编译 rtorrent-0.9.4
下一篇文章
利用 Systemd 为服务进程设置优先级

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Fill out this field
Fill out this field
请输入正确的电子邮件地址。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

菜单