在http/2中有了一个新的概念信道复用在TCP连接上可以并发的去发送http请求链接一个网站只需要一个TCP链接(同域的情况下)之前有写过基于http/1.1协议长链接案例分析可以去做个对比看看两边的实际效果。
由于HTTP2目前只能运行在https协议下需要先借助Nginx部署一个Https协议的服务。
nginx部署https服务
生成public key和private key
/usr/local/etc/nginx/certs目录下执行以下命令
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout localhost-privkey.pem -out localhost-cert.pem
Generating a 2048 bit RSA private key
...............................................................................+++
..............+++
writing new private key to 'localhost-privkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
基于上面的nginx-cache.conf文件进行修改
proxy_cache_path /var/cache levels=1:2 keys_zone=my_cache:10m;
server {
listen 443 ssl; # https默认证书
server_name test.com;
# ssl on; # 开启ssl证书
ssl_certificate_key /usr/local/etc/nginx/certs/localhost-privkey.pem;
ssl_certificate /usr/local/etc/nginx/certs/localhost-cert.pem;
location / {
proxy_cache my_cache;
proxy_pass http://127.0.0.1:3010;
proxy_set_header Host $host; # 设置浏览器请求的host
}
}
http自动跳转https
proxy_cache_path /var/cache levels=1:2 keys_zone=my_cache:10m;
server {
listen 80 default_server;
listen [::]:80 default_server; # [::] 你的ip
server_name test.com;
return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl; # https默认证书
server_name test.com;
# ssl on; # 开启ssl证书
ssl_certificate_key /usr/local/etc/nginx/certs/localhost-privkey.pem;
ssl_certificate /usr/local/etc/nginx/certs/localhost-cert.pem;
location / {
proxy_cache my_cache;
proxy_pass http://127.0.0.1:3010;
proxy_set_header Host $host; # 设置浏览器请求的host
}
}
实现http2协议
http2目前只能在https下面才可以
- 优势:
- 信道复用
- 分帧传输
- Server Push http/1.1协议里是客户端主动请求服务才会响应
http2.conf
server {
listen 443 ssl http2;
server_name http2.test.com;
http2_push_preload on;
ssl_certificate_key /usr/local/etc/nginx/certs/localhost-privkey.pem;
ssl_certificate /usr/local/etc/nginx/certs/localhost-cert.pem;
location / {
proxy_pass http://127.0.0.1:30100;
proxy_set_header Host $host;
}
}
connection.js 基于http/1.1长链接示例修改
const http = require('http');
const fs = require('fs');
const port = 30100;
http.createServer((request, response) => {
console.log('request url: ', request.url);
const html = fs.readFileSync('./connection.html', 'utf-8');
const img = fs.readFileSync('./test_img.jpg');
if (request.url === '/') {
response.writeHead(200, {
'Content-Type': 'text/html',
'Connection': 'close',
'Link': '</test.jpg>; as=image; rel=preload',
});
response.end(html);
} else {
response.writeHead(200, {
'Content-Type': 'image/jpg'
});
response.end(img);
}
}).listen(port);
console.log('server listening on port ', port);
connection.html
<html>
<head>
<meta charset="utf-8" />
<title>http2-connection</title>
<style>
img {
width: 100px;
height: 100px;
}
</style>
</head>
<body>
1
<img src="/test1.jpg" alt="" />
2
<img src="/test2.jpg" alt="" />
3
<img src="/test3.jpg" alt="" />
4
<img src="/test4.jpg" alt="" />
5
<img src="/test5.jpg" alt="" />
6
<img src="/test6.jpg" alt="" />
7
<img src="/test7.jpg" alt="" />
8
<img src="/test8.jpg" alt="" />
</body>
</html>
运行效果基于http2协议复合浏览器同域策略都在一个TCP上复用
测试http2性能的网站 https://http2.akamai.com/demo/http2-lab.html
点击查看更多内容
2人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦