[译] Node.js, Express.js 搭建 HTTP/2 服务器
原文:Easy HTTP/2 Server with Node.js and Express.js
作者:Azat Mardan
代碼:http2-express
什么是 HTTP/2
現(xiàn)代互聯(lián)網(wǎng)的 TCP/IP 協(xié)議發(fā)布于1975年,這項(xiàng)技術(shù)在41年前是多么令人驚訝。自它發(fā)布開始大部分形式,我們使用 HTTP 和 后續(xù)接任者 HTTP/1.1 來(lái)實(shí)現(xiàn)客戶端和服務(wù)端的通訊。它能很不錯(cuò)的傳輸 Web,但今時(shí)今日的開發(fā)者建立網(wǎng)站的方式已經(jīng)發(fā)生了巨大的改變。存在各式各樣的外部資源鏈接例如圖片、CSS 文件、JavaScript 資源。資源的種類數(shù)量只會(huì)持續(xù)增長(zhǎng)。
HTTP/2 是針對(duì)表現(xiàn)一直不錯(cuò)的舊協(xié)議 HTTP 自從1991年發(fā)布以來(lái)這15年的第一次大的升級(jí)改動(dòng)!它為優(yōu)化現(xiàn)代瀏覽器而生。性能更加優(yōu)越而且不用使用復(fù)雜的行為例如域名分片(通過多個(gè)域名發(fā)送資源)或者資源文件合并`(提供一個(gè)整合的大資源而不是多個(gè)小資源)
HTTP/2 是當(dāng)前 web 的新標(biāo)準(zhǔn),其雛形是 Google 的 SPDY 協(xié)議。當(dāng)前已經(jīng)被大多數(shù)主流瀏覽器支持,且很多網(wǎng)站已經(jīng)通過該協(xié)議實(shí)現(xiàn)。例如訪問 Yahoo 的 Flickr 在使用的是 HTTP/2 協(xié)議(截圖時(shí)間為2016年7月).
HTTP/2 的優(yōu)勢(shì)和注意事項(xiàng)
HTTP/2 和 HTTP/1.1 的使用沒什么區(qū)別,仍然可以在 body 中使用類 xml 的語(yǔ)法,使用 header 協(xié)議頭字段, 狀態(tài)碼, cookies, methods, URLs, 等等。開發(fā)者熟悉使用的東西都還可以繼續(xù)在 HTTP/2 使用。
HTTP/2的優(yōu)勢(shì)如下:
多路復(fù)用傳輸(Multiplexing):允許瀏覽器在單個(gè)TCP連接中包含多個(gè)請(qǐng)求,從而使瀏覽器能夠并行地請(qǐng)求所有的資源;
服務(wù)器推送(Server push):服務(wù)器可以在瀏覽器知道需要該資源前,推送給瀏覽器(如:CSS、JS、Image),從而通過減少請(qǐng)求數(shù)量來(lái)加速頁(yè)面加載時(shí)間;
流傳輸優(yōu)先級(jí)(Stream priority):允許瀏覽器去控制資源的加載優(yōu)先級(jí),例如,瀏覽器先請(qǐng)求 HTML 渲染再去加載其他的 CSS 和 JS 文件;
頭部壓縮(Header compression): HTTP/1.1 請(qǐng)求的頭部總是重復(fù)一樣的內(nèi)容,而 HTTP/2 則強(qiáng)制對(duì)所有請(qǐng)求的頭部進(jìn)行了去重壓縮;
實(shí)際的強(qiáng)制加密(De facto mandatory encryption):雖然加密不是硬性要求的,但是大多數(shù)瀏覽器只支持 TLS(HTTPS) 上的 HTTP/2。
雖然目前對(duì)于 HTTP/2 還不能完全滿足一些苛求,但是直到更好的技術(shù)出現(xiàn)以前,當(dāng)前是一項(xiàng)明顯的技術(shù)進(jìn)步。讓我們來(lái)看看,作為 Web 開發(fā)者需要了解的必要知識(shí)。大部分適用于 HTTP/1.1 的優(yōu)化技巧在 HTTP/2 中變成多余的,其中一些甚至反而會(huì)影響 HTTP/2 上的網(wǎng)站性能,例如:
資源文件合并;
你也應(yīng)該停止使用精靈圖(image sprites)、CSS和JS打包,因?yàn)橹灰渲幸恍〔糠钟懈膭?dòng)就會(huì)影響客戶端的緩存的作用;在 HTTP/2 協(xié)議上更好的方式是使用多個(gè)的小文件,而不是一個(gè)大文件。
作者希望前端構(gòu)建工具,如 Grunt 、 Gulp 、 Webpack 將會(huì)因此特性被放棄使用,他們使 Web 開發(fā)更高的復(fù)雜度,極高的學(xué)習(xí)曲線,以及管理項(xiàng)目的依賴關(guān)系。
另一個(gè)適用于 HTTP/1.1 不適用于 HTTP/2 的是,域名分片(為了繞過TCP并行請(qǐng)求數(shù)量限制)。雖然它不一定在所有情況下有害,但對(duì)于 HTTP/2 的多路復(fù)用傳輸,這樣做也已經(jīng)沒好處了。之所以建議不在 HTTP/2 使用域名分片,還因?yàn)槊總€(gè)域名會(huì)帶來(lái)額外的查詢負(fù)載。如果真的有需要,那么更好的方式是解析多個(gè)域名到同一個(gè)IP,而且保證你使用的是通配符證書或整合了多域名的證書,從而減少域名查詢的時(shí)間。
若想了解更多關(guān)于 HTTP/2 的介紹,可以看看官網(wǎng)。
Node.js 搭建 HTTP/2
現(xiàn)在,讓我們看看怎么通過 Node.js 搭建 HTTP/2 服務(wù)器。
部署證書
創(chuàng)建一個(gè)新文件夾以及自己簽發(fā)的 SSL 證書。
$ mkdir http2-express $ cd http2-express $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 ... $ openssl rsa -passin pass:x -in server.pass.key -out server.key writing RSA key $ rm server.pass.key $ openssl req -new -key server.key -out server.csr ... Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:California ... A challenge password []: ... $ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt當(dāng)你訪問服務(wù)器的時(shí)候,因?yàn)闉g覽器默認(rèn)不信任自己簽發(fā)的證書,請(qǐng)確保選擇 “高級(jí)” 和 “繼續(xù)訪問 localhost (不安全)” 或者將 localhost 設(shè)置成不安全訪問的例外。
初始化、依賴、入口
通過 npm ,初始化項(xiàng)目 package.json ,安裝依賴 spdy 和 express :
npm init npm i express spdy --save創(chuàng)建應(yīng)用的入口文件 index.js ,主要是引用以及實(shí)例化
const port = 3000 const spdy = require('spdy') const express = require('express') const path = require('path') const fs = require('fs')const app = express()定義 Express.js 的 route
實(shí)現(xiàn) Express.js 的 route
app.get('*', (req, res) => {res.status(200).json({message: 'ok'}) })設(shè)置證書以及啟動(dòng) Server
通過 fs.readFileSync() 讀取證書
const options = {key: fs.readFileSync(__dirname + '/server.key'),cert: fs.readFileSync(__dirname + '/server.crt') }然后,設(shè)置證書選項(xiàng)到 Express 對(duì)象:
spdy.createServer(options, app).listen(port, (error) => {if (error) {console.error(error)return process.exit(1)} else {console.log('Listening on port: ' + port + '.')}})最后,node . 啟動(dòng)服務(wù)器
檢查結(jié)果
通過瀏覽器的開發(fā)者工具查看協(xié)議,就如剛剛我們查看 Yahoo 的 Flickr 協(xié)議一樣。
可以看到,使用 Node.js 和 Express.js 配合庫(kù) node-spdy 實(shí)現(xiàn) HTTP/2 簡(jiǎn)單易懂。大多數(shù)情況下,對(duì)你的業(yè)務(wù)代碼是基本不需要修改的,想必,你的網(wǎng)站也已經(jīng)使用了 HTTPS/SSL (除非你的服務(wù)器只提供靜態(tài)資源,否則你應(yīng)該使用安全的 HTTPS/SSL ),即使是不使用 HTTP/2 你也可以替換 HTTP/1.1 而使用 SPDY
當(dāng)然,在 Node.js 的大環(huán)境中,有很多的庫(kù),不只是 node-spdy 提供 HTTP/2 實(shí)現(xiàn),例如:node-http2
結(jié)語(yǔ)
HTTP/2 提供了更多更優(yōu)的好處,而且不用使用復(fù)雜的優(yōu)化技巧。開始享受 HTTP/2 給你帶來(lái)的這些好處。展望光明的未來(lái)!
PS:
本文源代碼地址在 http2-express
我的博客
總結(jié)
以上是生活随笔為你收集整理的[译] Node.js, Express.js 搭建 HTTP/2 服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中dataframe数据框中
- 下一篇: PL/Sql 中创建、调试、调用存储过程