接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
13server
{
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
5server {
listen 80;
server_name file.demosite.com;
return 301 https://file.demosite.com$request_uri;
}
这个配置文件就是做一个80端口的转发,然后重启nginx就可以看到绿色的小锁了。
如果地址是https但是没有绿色的小锁,可能的原因是你的站点有引用不是https协议的资源,这里就需要你一一排查了。