HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。
HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 将在「2016 年初结束对 SPDY 的支持」;Nginx、Apache 也已经全面支持 HTTP/2 ,并也不再支持 SPDY)。一般的大家把 HTTP2 简称为 h2,尽管有些朋友可能不怎么愿意,但是这个简称已经默认化了,特别是体现在浏览器对 HTTP2 都是这个简写的。普通的 HTTPS 网站浏览会比 HTTP 网站稍微慢一些,因为需要处理加密任务,而配置了 h2 的 HTTPS,在低延时的情况下速度会比 HTTP 更快更稳定!
从 Nginx 1.9.5 开始,http_v2_module 已经替换了 ngx_http_spdy_module,建议直接去 Nginx 官网下载最新源码包
- 要开启HTTP/2需要nginx版本在1.9.5以上且需要openssl版本在1.0.2以上编译。
- http2.0只支持开启了https的网站
OpenSSL
由于 OpenSSL 是系统基础库,大量其他软件都对它有依赖,如果直接升级系统自带的 OpenSSL,很容易引发各种问题。更为稳妥的做法是在编译 Web Server 时自己指定 OpenSSL 的位置。也就是通过 --with-openssl
指定了新版 OpenSSL 源码路径,这样编译出来的 Nginx 就会用上最新的 OpenSSL 库。
本站目前使用 OpenSSL 1.0.2l:
1 2 3 |
wget -O openssl.tar.gz -c https://github.com/openssl/openssl/archive/OpenSSL_1_0_2l.tar.gz tar zxf openssl.tar.gz mv openssl-OpenSSL_1_0_2l/ openssl |
打上 ChaCha20/Poly1305 补丁:
1 2 3 4 |
git clone https://github.com/cloudflare/sslconfig.git cd openssl patch -p1 < ../sslconfig/patches/openssl__chacha20_poly1305_draft_and_rfc_ossl102j.patch cd ../ |
编译并安装 Nginx
接着就可以获取 Nginx 源码,并打上 Dynamic TLS Records 补丁:
1 2 3 4 5 6 7 |
wget -c https://nginx.org/download/nginx-1.11.13.tar.gz tar zxf nginx-1.11.13.tar.gz cd nginx-1.11.13/ patch -p1 < ../sslconfig/patches/nginx__1.11.5_dynamic_tls_records.patch cd ../ |
编译和安装:
1 2 3 4 5 |
cd nginx-1.11.13/ ./configure --user=www --group=www --prefix=/usr/local/nginx --with-openssl=../openssl --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_sub_module make sudo make install |
除了 http_v2 和 http_ssl 这两个 HTTP/2 必备模块之外,我还额外启用了 http_gzip_static,需要启用哪些模块需要根据自己实际情况来决定(注:从 Nginx 1.11.5 开始,ipv6 模块已经内置,故 --with-ipv6
配置项已被移除)。
以上步骤会把 Nginx 装到 /usr/local/nginx/
目录,如需更改路径可以在 --prefix
指定。
设置nginx启动脚本
编辑 vi /lib/systemd/system/nginx.service
文件,没有创建一个 touch nginx.service
然后将如下内容根据具体情况进行修改后,添加到nginx.service文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[Unit] Description=nginx After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target |
设置开机启动:systemctl enable nginx
立即启动:systemctl start nginx
配置HTTP/2
配置Nginx开启http 2.0特别简单,只要在Nginx配置文件中找到你要开启http2.0的域名server
模块,然后将 listen 443 ssl;
改成 listen 443 ssl http2;
即可。
1 2 3 4 5 6 7 |
server { listen 443 ssl http2 default_server; ssl_certificate server.crt; ssl_certificate_key server.key; ... } |
保存配置文件之后,重启或重载Nginx即可生效:systemctl restart nginx
评论前必须登录!
注册