学习网址:HTTP2 | Node.js 中文文档 | Node.js 中文网
(1)在Linux虚拟机上创建koa 脚手架项目,koa2 -e myhttp2 && cd myhttp2
安装项目依赖,npm i
运行 wd18,npm start
浏览器访问 wd18,通过 Network 面板,确认 HTTP 协议版本
创建证书文件夹,mkdir key && cd key
创建自签名证书,注意,给证书提供一些有用信息
openssl genrsa 1024 > key.pem
openssl req -x509 -new -key key.pem > key-cert.pem
修改项目代码
// 原代码
var http = require('http');
// 改为
const http = require('http2');
const fs = require('fs');
// 原代码
var server = http.createServer(app.callback());
// 改为
const server = http.createSecureServer({
key: fs.readFileSync('./key/key.pem'),
cert: fs.readFileSync('./key/key-cert.pem')
}, app.callback());
浏览器访问koa2项目,通过 Network 面板,确认 HTTP 协议版本
(2)使用koa2搭建静态网站,给网站页面与图片资源添加cache-control缓存处理,让资源在100秒内使用缓存资源,100秒后重新从服务端获取资源。可以考虑使用cache-control与if-modified-since last-modified字段
目录结构:
bin/www的代码段
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('demo:server');
var http = require('http2');
const fs = require('fs');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
// app.set('port', port);
/**
* Create HTTP server.
*/
// var server = http.createServer(app.callback());
const server = http.createSecureServer({
key: fs.readFileSync("./key/key.pem"),
cert: fs.readFileSync("./key/key-cert.pem")
},app.callback());
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
导入我们的证书
key/key-cert.pem
-----BEGIN CERTIFICATE-----
MIICUjCCAbugAwIBAgIJAKalvICyyvAcMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNV
BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
Q29tcGFueSBMdGQwHhcNMjIwMzE2MDg1MTQxWhcNMjIwNDE1MDg1MTQxWjBCMQsw
CQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh
dWx0IENvbXBhbnkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR6aOz
jVahJrS3FjuQJfYnupkDsLTkgvY30EZZj94bPvZlSeMG0LPL1uvrDpObZCODQrkp
d7cTMlTjCKZ3NbHKShKjL6L9tyvrOZ+xMmDrw3t5pVbHGd0VhFi1GgxlN5yCxg8Z
zJ6qLgulLdlNmQ0q/+6rrZzJ2sqBEKNDTv+I7QIDAQABo1AwTjAdBgNVHQ4EFgQU
X1aZMmyNH4qUyunbaGBFjVyp068wHwYDVR0jBBgwFoAUX1aZMmyNH4qUyunbaGBF
jVyp068wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQB/yuEKLknzQMjD
FDxIWIyXgjlEjiI+ArMz7IU5FOHwRt1eI3Etg8D9IfoD3i/RNLP0Lvxv4cmQ+Ytb
L5k+MPTeDeisUsz4/Ev0J706r9Qlr86vM6iRjJJZ2YjmY9iVjYdgCauInwTpY/lQ
c0l6Kpmr6kgOOFWUGfKk0mciHGsLmw==
-----END CERTIFICATE-----
key/key.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDR6aOzjVahJrS3FjuQJfYnupkDsLTkgvY30EZZj94bPvZlSeMG
0LPL1uvrDpObZCODQrkpd7cTMlTjCKZ3NbHKShKjL6L9tyvrOZ+xMmDrw3t5pVbH
Gd0VhFi1GgxlN5yCxg8ZzJ6qLgulLdlNmQ0q/+6rrZzJ2sqBEKNDTv+I7QIDAQAB
AoGADMrqWRTyBJwxQz8tnhlSKRWsIZdxTsPUcY5V2ztzU8HAjme0WEP70R5l/ktD
H6M4rtUwJ6DOHXNhzPxH+Nfi387KC/Uj2Hpv3JU6YaFZqOe3NGfWI91kdCFVu4et
oNdEFIQHZu9q1lLGZzmk31zX0gS35p9sWu2+3JmF0FKwEsECQQD9UYr15bGZfDc+
XZzglRJYzIRfV2h4qDmYaACdB86RhfBOUMgwu5K+rCVLQmFxLe08wj82TOtwOOGq
EuxaMIH1AkEA1CJ5EBbtnsESY6xLtz3sjrLLzPL0QpSFZ8hlsBen5b2e5TmT9cOz
eEzIkS5hmR5Bs6rdD+0jYJVRb2Hxpvh4GQJBAM2j7pzj1CL3NZmJQRsHqRcxH5yO
Rp78YZUZiLXxan20L3pEFd+JxfzHnpbT0mqgj+AtCEe6db5qTrdUGU615ikCQQCH
qDvvFBqE6UcPQoFw/0KlxqUZvUyCv2PIiJiu0ZHnEynnwLhj8/BzP/cLELQNLRIr
CVsw8h8rhpF7PxFAC6kRAkEApinD2WI3nYO7rlqy6xiLt7bP/wAzgTkl7V87o9iK
YYI8YfgmQETC86fV+O+qMzZSXLTpy9ubCC9ZDXeO4ERXZg==
-----END RSA PRIVATE KEY-----