稻草网

Windows下Nginx开启HTTP/2功能的详细教程

今天本站正式进入HTTP/2时代,记录一下踩坑过程

据说目前浏览器HTTP/2仅支持全站HTTPS的网站,因为我是全站HTTPS,所以未考证

Nginx1.9.5版本开始提供对HTTP/2的支持,但一直到我所目前用的最新版(1.11.13)都没有默认开启用于支持HTTP/2http_v2_module模块,需要自己手动编译,而Windows下的编译非常不方便,搜索了很久踩了很多坑才完成,所以就有了本篇文章。

如果不想自己编译的,本文最后有我已经编译好的nginx.exe !!!

如果不想自己编译的,本文最后有我已经编译好的nginx.exe !!!

如果不想自己编译的,本文最后有我已经编译好的nginx.exe !!!

重要的事情说三遍不多

首先,你需要准备的文件

  1. 已编译好的nginx.exe文件,如果你已经有了,可以直接用你现在用的,或者官网下载: http://nginx.org/en/download.html
  2. nginx 源代码,直接点左边的gz即可下载,官方下载地址: http://hg.nginx.org/nginx
  3. Visual Studio,我用的2015版本,没有的可以去MSDN I TELL YOU下载,地址:http://www.itellyou.cn/ 在开发人员工具里面,保险起见版本最好大于等于2010
  4. MSYS 安装步骤后面会提,地址 https://sourceforge.net/projects/mingw/files/Installer/
  5. NASM 点击最新版,进入Win64,下载安装文件,右键以管理员身份安装 http://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D 并在系统变量中添加安装位置,例如 C:\Program Files (x86)\NASM
  6. Perl 我下的ActiveState Perl版本,据说没区别,安装时会自动将其加入系统环境变量,那个勾可别取消了 https://www.perl.org/get.html
  7. openssl源码,最新版即可,我下的openssl-1.1.0e.tar.gz  https://www.openssl.org/source/
  8. pcre 我下的版本是pcre-8.40.tar.gz ,这里注意不要下成了pcre2,编译时会提示缺少文件,别问我怎么知道的。。。 https://ftp.pcre.org/pub/pcre/
  9. zlib 我下的版本zlib-1.2.11.tar.gz 官网地址: http://www.zlib.net/ 

如果你这些东西都下完了,嗯,很强

现在讲一下,MSYS的安装方法

双击mingw-get-setup.exe后,点击Install

《Windows下Nginx开启HTTP/2功能的详细教程》

后面默认即可,这只是个安装器,还要下载文件,最后会安装一个MinGW Installer,打开它

《Windows下Nginx开启HTTP/2功能的详细教程》

 

依次选择左侧Basic Setup ,右侧msys-base,上方Installation,点击Apply Changes,等待msys安装完毕

在合适位置解压nginx源码,我就放在桌面了,方便删,在nginx根目录下创建build文件夹,然后在build下创建lib这个文件夹,然后解压openssl、pcer、zlib这三个文件到lib文件夹下,如下所示

《Windows下Nginx开启HTTP/2功能的详细教程》

 

下面这一步重要了,在你已编译好的nginx目录下,打开命令提示符,输入nginx -V (V是大写,注意空格),完整复制如下所示这一段

《Windows下Nginx开启HTTP/2功能的详细教程》

粘贴到合适位置,这里要修改几处地方,开头的configure arguments:改成auto/configure,builddir=后面改成build--with-pcre=后面的objs.msvc8改成build,也就是build/lib/pcre-8.40 ,同样的还有openssl、zlib,注意版本号要和你下的版本对应,末尾加上 --with-http_v2_module (注意–前的空格)

下面是我的配置,供参考

auto/configure --with-cc=cl --builddir=build --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=build/lib/pcre-8.40 --with-zlib=build/lib/zlib-1.2.11 --with-select_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=build/lib/openssl-1.1.0e --with-openssl-opt=no-asm --with-http_ssl_module --with-mail_ssl_module --with-stream_ssl_module --with-http_v2_module

然后打开你msys的安装目录(我的是C:\MinGW\msys\1.0),运行mysys.bat,输入cd C:/Users/He/Desktop/nginx(你的nginx源码所在目录),将上面的配置粘贴进去,回车,会在build下生成Makefile文件

接着打开你Visual Studio的开发人员命令提示(不同版本名字不同)

《Windows下Nginx开启HTTP/2功能的详细教程》

先输入c: ,再输入cd C:\Users\He\Desktop\nginx ,接着输入nmake -f build/Makefile

然后就等待编译完成,如果不出意外的话编译完成后会提示找不到sed文件,不过无影响,如果想解决可以参照http://m.blog.csdn.net/article/details?id=51981794这篇文章

接着备份一下已编译目录里的nginx.exe文件,将源码目录下build文件夹内的nginx.exe复制进去,命令提示符输入nginx -V,如果末尾有–with-http_v2_module则成功

最后在nginx.conflisten 443 ssl后面加上http2即可

如何测试开启成功?用chrome浏览器打开你的网站,在新TAB中打开chrome://net-internals/#http2

若果在你网站对应那一行的Protocol Negotiated下为h2,则说明HTTP/2开启成功

或者使用 curl –http2 -I https://www.strawtc.cn 命令测试

这里有一个HTTP/2对比HTTP/1的网站https://http2.akamai.com/demo,可为什么我测出来的HTTP/2速度还要慢一些。。。。

 

我已经编译好的nginx.exe下载 点我

 

参考文章: http://www.tuicool.com/articles/F77NvaQ
                  http://m.blog.csdn.net/article/details?id=51981794
                  http://blog.csdn.net/huangyimo/article/details/50717326                   

                  http://www.linuxidc.com/Linux/2017-01/139466.htm

  1. edgexie说道:

    题主,我目前使用的nginx是1.11.5版本,是否可以帮我编译一个?

    1. flyer_H说道:

      不好意思,我现在也没有这套环境了

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注