Fork me on GitHub
Fork me on GitHub

Nginx配置HTTP/2.0

最近将公司前端组件的Nginx配置了http 2.0,特此在此记录一下。突然发现博客里竟然没有什么关于Nginx的文章,毕竟是一直在使用的,后面会写几篇关于自己这几年使用Nginx的一些总结。

背景

从 2015 年 5 月 14 日 HTTP/2 协议正式版的发布到现在已经快有一年了,越来越多的网站部署了 HTTP2,HTTP2 的广泛应用带来了更好的浏览体验,只要是 Modern 浏览器都支持,所以部署 HTTP2 并不会带来太多困扰。
虽然 h2 有 h2c (HTTP/2 Cleartext) 可以通过非加密通道传输,但是支持的浏览器初期还是比较少的,所以目前部署 h2 还是需要走加密的,不过由于 Let’s Encrypt 大力推行免费证书和证书的廉价化,部署 h2 的成本并不高。

HTTP 2.0介绍

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 更快更稳定。
现在电信劫持事件频发,网站部署了 HTTPS 加密后可以杜绝大部分劫持,但不是完全。像电子商务行业对 HTTPS 加密可是标配啊,因此部署 h2 更是势在必行。

环境信息

主机名 操作系统版本 IP地址 作用
res CentOS 7.0 172.16.7.180 Res静态资源服务器

我这里使用的Nginx是openresty-1.11.2.5。

安装Nginx

1.安装依赖包

# yum install readline-devel pcre-devel openssl-devel gcc -y

首先确认当前openssl版本,最低要求1.0.2,如果不满足,还得手动下载openssl,然后在编译时使用–with-openssl指定openssl目录。我这里是满足条件的:

# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

2.安装Openresty

[root@res local]# cd /usr/local/
[root@res local]# wget https://openresty.org/download/openresty-1.11.2.5.tar.gz
[root@res local]# tar zxf openresty-1.11.2.5.tar.gz 
[root@res local]# cd openresty-1.11.2.5/

一些较低的版本里是不支持HTTP 2.0的,我这里使用的Openresty-1.11.2.5是支持的。另外,对于官方的Nginx,默认编译的 Nginx 并不包含 h2 模块,我们需要加入参数来编译,截止发文,Nginx 1.9 开发版及以上版本源码需要自己加入编译参数,从软件源仓库下载的则默认编译。 Tengine 可以同时部署 h2 和 SPDY 保证兼容性,Nginx 则是一刀切不再支持 SPDY。

#查看可供编译的参数是否有--with-http_v2_module
[root@res openresty-1.11.2.5]# ./configure --help
[root@res openresty-1.11.2.5]#./configure --with-http_v2_module
[root@res openresty-1.11.2.5]#  gmake && gmake install

配置Nginx

[root@res conf]# pwd
/usr/local/nginx/nginx/conf
[root@res conf]# cp nginx.conf nginx.conf.bak
[root@res conf]# vim nginx.conf
server {
    listen       80;
    server_name  res.wisedu.com;

    rewrite ^(.*)$  https://$host$1 permanent; #http强制转https

}

server {
    listen       443 ssl http2;
    server_name  res.wisedu.com;

    ssl on;
    #证书和私钥
    ssl_certificate /opt/ssl/214199023800937.pem;
    ssl_certificate_key /opt/ssl/214199023800937.key;
    ...

关于ssl使用的证书,由于是公司对外的服务环境,证书是购买的。当然做实验时也可以建立私有CA,模拟颁发证书。

启动Nginx:

# systemctl start nginx.service

访问https://res.wisedu.com,查看Nginx的access.log,可以看到协议已经是HTTP/2.0了。

res.wisedu.com 172.16.0.12 [29/Jan/2018:19:54:20 +0800] "GET /static/img/logo.484ce8c.png HTTP/2.0" 200 17354 "https://res.wisedu.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" 0.000 -