nginx+https+http2搭建(二)

nginx+https+http2搭建(一),第二部分会简单介绍一下http1.1,https和http2,最后再介绍nginx+https+http2的搭建过程。

HTTP现状

目前主流的http版本是http1.1版,它是在1999年发布的,距今已经有超过十五年的时间。

首先http的安全性问题:

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改
    这里最经典的例子就是恶心的运营商劫持,针对这个就要说到下面的https解决方案

http1.1出生的那个年代,网站的规模还很小,但是现如今的网站已经不是web页面了,而是web应用,SPA,动辄几兆的请求,上百个连接,几十个域名和同域几十个连接,大部分的时间都消耗在网络上,http1.1的瓶颈就显现出来了:

  • 因为HTTP实际上对每个TCP连接,只允许一个优先的请求。
  • 请求只能从客户端开始。客户端不可以接收除响应以外的指令
  • 请求/响应首部未经压缩就发送,首部信息越多延迟越大。
  • 发送冗长的首部,每次互相发送相同的首部造成的浪费较多
  • 可任意选择数据压缩格式,非强制压缩发送
    为此我们做了很多克服延迟的方法,雪碧图,内联样式,域共享等等。。而这里的大部分问题,在http2协议中都得到解决!

HTTPS简介

HTTPS = HTTP + 加密 + 认证 + 完整性保护,它并非是应用层的一种新协议,而是身披SSL外壳的HTTP。

SSL(Secure Socket Layer)是独立于HTTP的协议,不光是HTTP,SMTP和Telnet等协议也可配合SSL协议使用。可以说SSL是当今世界上应用最为广泛的网络安全协议。

HTTPS安全可靠,但是使用SSL时,处理速度会变慢,这里主要体现在通信慢和加密处理慢。

HTTP/2简介

HTTP/2于2015年5月作为互联网标准正式发布。它基于Google制定的SPDY协议,由IETF HTTPbis小组制定维护。并且Google表示将放弃SPDY转而全力支持HTTP/2。

HTTP/2 协议由以下两个 RFC 组成:RFC 7540和RFC 7541。它与HTTP/1.x的主要区别:

  • 基于二进制而不是文本的
  • 完全多路复用,代替原来的排序和阻塞机制
  • 在一条连接中并行处理多个请求
  • 压缩头部减少开销
  • 允许服务器主动推送响应到客户端的缓存中

HTTP/2兼容性:caniuse

ssl证书安装

我这里用的是letsencrypt各大知名网络厂商联合发布的免费 SSL 证书,签发比较麻烦,签一次有效期三个月,可以继续续签。安装地址Certbot
这里没有什么难度,按照教程安装即可。

安装:

1
sudo apt-get install letsencrypt

生成证书:

1
letsencrypt certonly --standalone -d demosite.com

生成后会告诉你证书所在路径,这个要记好,下面的nginx配置时要用到。

nginx+https+http2配置

默认的https的端口是443,而我们的网站默认端口是80,这里的nginx我们需要做一个转发,之前提到的demosite.conf可以改成这样

1
2
3
4
5
6
7
8
9
10
11
12
13
server
{
listen 443 ssl http2;
server_name file.demosite.com;
ssl_certificate /etc/letsencrypt/live/file.demosite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/file.demosite.com/privkey.pem;
location / {
root /home/demosite;
}
access_log logs/static_file_access.log;
}

listen的端口改为443,后面加ssl表示用https,加http2表示使用http2协议,现在的nginx最新版已经默认支持http2模块,不需要特别安装。

然后我们新建一个配置文件vi demosite_80.conf,代码如下:

1
2
3
4
5
server {
listen 80;
server_name file.demosite.com;
return 301 https://file.demosite.com$request_uri;
}

这个配置文件就是做一个80端口的转发,然后重启nginx就可以看到绿色的小锁了。

如果地址是https但是没有绿色的小锁,可能的原因是你的站点有引用不是https协议的资源,这里就需要你一一排查了。

参考:
https://imququ.com/post/http2-resource.html
HTTP/2 常见问题集锦