0x01 前言

http2 是什么?首先http 是一个协议,平常我们通过浏览器输入一个地址进行浏览,一般用的是http1.1 而http2 就是http 协议的2.0 版本。http1.1 是1997 开始正式使用的,其实http2 早在2012年11月就已经发布了,在经过漫长的开发、审核,终于在2015年2月正式获得IETF 批准正式使用。

http2 有什么好处?然而我也在看文档,文档很长很长…但总的来说就以下几个亮点:

  • 多路复用
  • HEAD 压缩
  • 服务器推送
  • 优先级请求

既然是新技术,我为什么不支持呢?其实我从nginx 1.9.5 开始就已经关注http2 了。直到今天我才对我的服务器进行更新升级。

0x02 nginx

你可以在chrome 浏览器上输入以下地址,查看你的网站是否正在使用http2 :

chrome://net-internals/#http2

以下是我网站开启http2 支持后的截图:

1466866085

0x02.1 编译安装

其实我在这篇文章里(nginx 1.9.10 编译安装 with ngx_lua_waf & pagespeed)的编译参数已经带有http2 的相关模块,可能是因为openssl 的原因导致不能启用http2 。那我只好下载最新的openssl 在此进行编译安装。

你可以通过这个地址下载最新的openssl :https://www.openssl.org/source/

要注意的是http2 Over TLS 需要NPN 或 ALPN 来完成协商,而OpenSSL 在1.0.2 才开始支持ALPN 。所以,请下载1.0.2 版本的openssl 。

因为我服务器上有些服务依旧依赖于旧版本的openssl ,所以我并不打算将它升级。因此我在configure nginx 时添加with-openssl 参数。

#进入存放源代码的文件夹
cd /root/codex/nginx

#下载并解压openssl
wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
tar zxvf openssl-1.0.2h.tar.gz

如果你之前按照这篇文章(nginx 1.9.10 编译安装 with ngx_lua_waf & pagespeed)的方法进行进行编译安装,请使用以下命令再次进行编译安装:

#设置LUAJIT_LIB变量
export LUAJIT_LIB=/usr/local/lib

#设置LUAJIT_INC变量
export LUAJIT_INC=/usr/local/include/luajit-2.1

#configure
./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --lock-path=/var/lock/nginx.lock --with-http_gunzip_module --with-pcre --with-pcre-jit --with-http_perl_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-select_module --with-poll_module --with-file-aio --with-http_degradation_module --with-md5-asm --with-sha1-asm --with-libatomic --http-client-body-temp-path=/var/tmp/nginx/client_body --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --add-module=/usr/local/nginx/module/ngx_devel_kit --add-module=/usr/local/nginx/module/lua-nginx-module --with-ld-opt=-Wl,-rpath,$LUAJIT_LIB --with-openssl=/root/codex/openssl/openssl-1.0.2h/

#编译
make

#安装
make install

如果你并不需要lua-nginx-module ,请使用以下configure 参数:

#configure
./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --lock-path=/var/lock/nginx.lock --with-http_gunzip_module --with-pcre --with-pcre-jit --with-http_perl_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-select_module --with-poll_module --with-file-aio --with-http_degradation_module --with-md5-asm --with-sha1-asm --with-libatomic --http-client-body-temp-path=/var/tmp/nginx/client_body --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --add-module=/usr/local/nginx/module/ngx_devel_kit --with-openssl=/root/codex/openssl/openssl-1.0.2h/

#编译
make

#安装
make install

停止并重新启动nginx :

#停止nginx
nginx -s quit

#启动nginx
nginx

完成后测试下自己的服务吧。

0x03 curl for mac

我MacBook 的curl 版本信息:

MacBook-Air:~ terence$ curl -V
curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets

通过brew 安装:

brew install curl --with-nghttp2

创建链接:

sudo ln /usr/local/Cellar/curl/7.49.1/bin/curl /usr/local/sbin/

测试:

/usr/local/sbin/curl -I --http2 https://ngx.hk
HTTP/2 200 
server: OdinServer/0.1.2
date: Sat, 25 Jun 2016 15:37:22 GMT
content-type: text/html; charset=UTF-8
vary: Cookie
link: <https://ngx.hk/wp-json/>; rel="https://api.w.org/", <http://wp.me/P7yURE-C>; rel=shortlink
set-cookie: wfvt_1373194275=576ea532d14a6; expires=Sat, 25-Jun-2016 16:07:22 GMT; Max-Age=1800; path=/; HttpOnly
cache-control: max-age=0, no-cache
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
strict-transport-security: max-age=31536000; preload; includeSubDomains;

0x04 结语

可能是我网络太好了,也有可能是我并没有使用http2 的其它功能或者还没配置好,升级完成后并没发现加载速度与之前有什么区别。过两天我找个时间来次压力测试。