亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

Node.js一行代碼實現靜態文件服務器的方法步驟

2024-05-06 16:50:36
字體:
來源:轉載
供稿:網友

靜態文件服務器實現

nodejs不僅僅可以用來寫服務端接口,用來做靜態文件服務器替代nginx的功能, 也是分分鐘可以搞定的。 話不多說,先上代碼:

var server=http.createServer(function (req,res){ fs.createReadStream(Path.resolve(__dirname,"."+req.url)).pipe(res);})

在項目根目錄建一個hello.html文件測試一下 hello.html內容如下:

<h1>hello,world</h1>

node app.js運行,打開瀏覽器訪問一下: http://localhost/hello.html

Node.js,代碼,靜態文件服務器

我們再回頭審視一下代碼,的確就只有這么簡單,這要歸功于node Stream類 pipe方法的強大,fs.createReadStream讀取本地文件創建一個可讀流(ReadStream類的實例),再使用pipe導流到res響應流,res是一個http.ServerResponse類的實例,是一個可寫流,繼承自 Stream類

http.ServerResponse類的繼承關系如下:

Node.js,代碼,靜態文件服務器

安全性考慮

上述代碼實現靜態文件服務器后,意味著項目根目錄下所有的文件(遞歸)都可以通過瀏覽器直接訪問和下載了,這樣會帶來一些安全性的問題,想想看,你的服務器端代碼和配置文件都能通過瀏覽器直接下載了,因此需要在代碼里加一些限制,例如只能訪問特定的目錄下的文件和特定擴展名的文件,這樣還不夠,參考OWasp Top 10安全風險(第4條-不安全的對象直接引用),攻擊者仍然可以通過../../目錄回溯的方法訪問到其它目錄,對于訪問路徑中包含..的也要全部過濾掉。

實現mine type

mime type是指http 響應頭中的content-type字段,它決定了瀏覽器如何解析文件,是直接當做純文件顯示(text/plain),還是做為html文件渲染(text/html),或者當做二進制文件下載,沒有輸出正確的mine type,可能導致圖片文件無法顯示,字體文件無效,視頻文件無法播放的問題。要實現起來也十分簡單,只需要做一個映射表,不同文件擴展名,在響應頭的content-type字段中輸出對應的mine type就行了。

完整代碼如下:

const http=require("http");const Path=require("path");const fs=require("fs");var server=http.createServer(function (req,res){ const fileName=Path.resolve(__dirname,"."+req.url); const extName=Path.extname(fileName).substr(1); if (fs.existsSync(fileName)) { //判斷本地文件是否存在  var mineTypeMap={   html:'text/html;charset=utf-8',   htm:'text/html;charset=utf-8',   xml:"text/xml;charset=utf-8",   png:"image/png",   jpg:"image/jpeg",   jpeg:"image/jpeg",   gif:"image/gif",   css:"text/css;charset=utf-8",   txt:"text/plain;charset=utf-8",   mp3:"audio/mpeg",   mp4:"video/mp4",   ico:"image/x-icon",   tif:"image/tiff",   svg:"image/svg+xml",   zip:"application/zip",   ttf:"font/ttf",   woff:"font/woff",   woff2:"font/woff2",  }  if (mineTypeMap[extName]) {   res.setHeader('Content-Type', mineTypeMap[extName]);  }  var stream=fs.createReadStream(fileName);  stream.pipe(res); } })server.listen(80);

實現gzip

對于文本類型的文件,如html,js,css,采用gzip壓縮可以大幅減少傳輸量,提升服務器傳輸性能,當然這會損耗一點服務器的cpu性能做為代價,如果客戶端瀏覽器支持gzip壓縮,則會在請求頭的accept-encoding中攜帶gzip關鍵字,用node自帶的zlib類就可以實現gzip壓縮了,只要在stream.pip實多加一層,先導流到gzip流,再導出到res流,當然,還要在響應頭中添加Content-Encoding為gzip,這樣瀏覽器才能正確識別到http body是采用gzip算法壓縮的,并進行自動解壓縮。

代碼如下:

const zlib = require('zlib');if (req.headers["accept-encoding"].indexOf("gzip")>=0 && (extName=="js" || extName=="css" || extName=="html"))) {  res.setHeader('Content-Encoding', "gzip");  const gzip = zlib.createGzip();  stream.pipe(gzip).pipe(res); }

客戶端緩存

http協議的緩存協商流程比較長,最終在響應頭中生成expire(絕對時間)和cache-control(相對時間)兩個用于控制緩存過期時間的參數,瀏覽器下次請求該文件時,分為以下幾種情況:

  • 如果沒到過期時間,瀏覽器不會請求文件直接讀緩存
  • 如果已到過期時間,則會在請求頭中last-modified字段攜帶文件的最后修改日期,如果對比時間戳與服務器文件一致,則HTTP 返回 304: Not Modified
  • 如果按下f5刷新,會在請求頭中if-modified-since字段中攜帶緩存的過期時間,如果對比時間戳與服務器文件一致,則HTTP 返回 304: Not Modified
  • ctrl+f5刷新,請求頭中攜帶 cache-control: no-cache,強制禁用緩存。重新下載文件

邏輯分支較多,但都是日期比對,搞清楚緩存協商過程比較容易寫出來,有興趣的同學可以自行實現

高性能靜態文件服務器優化

如果要做一個高性能的靜態文件服務器僅實現gzip和緩存協商是不夠的,涉及到本地文件的頻繁讀取,高并發下I/O必定成為瓶頸,考慮到服務器上的文件是很少更新的, 可以用Buffer把文件流緩存到內存中,每次請求時先在內存中查找匹配項,如果命中了直接從內存中返回,避免了讀取磁盤,gzip也不用壓縮了,直接用壓縮好的文件流返回,可以成倍的大幅提升性能。當然如果文件太多了,內存也會飆升,需要考慮淘汰算法,只緩存訪問次數高的文件,剔除低訪問量的文件。

采用fs.watch監控目錄文件的變化,如果文件有更新,則刪掉緩存。

小結

Node.js 內置的pipe方法可以非常簡便的實現將服務器本地文件輸出到http 響應流中,gzip壓縮也同樣可以通過pipe實現,再配合輸出mine type 實現的靜態服務器已經可以滿足一般業務的使用。如果要實現高性能的靜態文件服務器,還需要實現客戶端緩存、服務端緩存功能(本文提供了思路,按圖索驥也非難事)。

最后,推薦一下個人的開源項目, node.js web開發框架,已包含本文靜態文件服務器的功能 webcontext: https://github.com/windyfancy/webcontext

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩大陆欧美高清视频区| 国产91精品青草社区| 国产精品久久久久不卡| 欧美日韩国产999| 国产精彩精品视频| 日韩在线视频网站| 亚洲自拍另类欧美丝袜| 色婷婷综合久久久久中文字幕1| 国产成人精品日本亚洲专区61| 国产精品老牛影院在线观看| 国产91网红主播在线观看| 成人精品一区二区三区电影黑人| 久久精品青青大伊人av| 国产精品扒开腿做爽爽爽视频| 疯狂蹂躏欧美一区二区精品| 欧美亚洲国产成人精品| 国产69精品久久久久9| 日韩欧美高清视频| 成人免费视频网| 色中色综合影院手机版在线观看| 久久久成人精品视频| 成人a视频在线观看| 伦伦影院午夜日韩欧美限制| 欧美国产日韩一区二区| 亚洲精品视频中文字幕| 国产精品福利在线观看网址| 最近2019年中文视频免费在线观看| 国产在线视频不卡| 亚洲天堂开心观看| 精品国产一区二区三区久久狼黑人| 亚洲第一级黄色片| 国产午夜精品麻豆| 久久久国产精彩视频美女艺术照福利| 国内揄拍国内精品| 日韩黄色高清视频| 欧美激情xxxx性bbbb| 久久成人免费视频| 国产精品久久久久久av福利软件| 欧美黄色免费网站| 深夜福利一区二区| 美日韩精品免费观看视频| 91在线|亚洲| 国产精品海角社区在线观看| 欧美在线视频一区| 亚洲午夜久久久影院| wwwwwwww亚洲| 久久久免费av| 日韩暖暖在线视频| 久久久久久久久久国产精品| 成人观看高清在线观看免费| 欧美日韩在线观看视频| 欧美日韩一区二区在线| 色在人av网站天堂精品| 欧美日韩一区二区在线| 国产激情久久久久| 美女999久久久精品视频| 国产ts一区二区| 成人黄色中文字幕| 成人激情在线播放| 国产日产欧美a一级在线| 亚洲区在线播放| 亚洲欧洲午夜一线一品| 成人亚洲综合色就1024| 亚洲第一色中文字幕| 成人精品一区二区三区电影免费| 97精品国产97久久久久久| 亚洲视频视频在线| 欧美激情xxxx| 精品国产一区二区三区四区在线观看| 久久精品久久久久| 国产成人精品久久| 欧美精品videos性欧美| 91av在线播放| 国产第一区电影| 日韩av网址在线观看| 亚洲国产中文字幕在线观看| 91久久精品美女| 欧美色视频日本版| 精品少妇一区二区30p| 美女黄色丝袜一区| 欧美激情一区二区三区久久久| 久久天天躁狠狠躁夜夜躁2014| 国产精品夜色7777狼人| 国产一区私人高清影院| 欧美精品性视频| 欧美视频13p| 久久久久久噜噜噜久久久精品| 成人乱人伦精品视频在线观看| 欧美性猛交xxxxx水多| 日韩精品一区二区三区第95| 亚洲电影第1页| 欧美激情综合亚洲一二区| 欧美二区在线播放| 911国产网站尤物在线观看| www.日韩视频| 欧美在线免费观看| 日韩经典中文字幕在线观看| 国产欧美最新羞羞视频在线观看| 成人免费视频xnxx.com| 永久免费毛片在线播放不卡| 成人亚洲欧美一区二区三区| 亚洲午夜性刺激影院| 国产精品91在线观看| 91美女片黄在线观| 国产成人精品免费视频| 日韩精品高清在线观看| 国产精品最新在线观看| 亚洲护士老师的毛茸茸最新章节| 日韩电影视频免费| 久久久中精品2020中文| 91精品视频免费看| 欧美黑人xxx| 成人av在线天堂| 久久成人在线视频| 久久精品在线播放| 国产精品成久久久久三级| 国产午夜精品麻豆| 久久99久久久久久久噜噜| 97婷婷大伊香蕉精品视频| 欧美成人久久久| 国产精品国产亚洲伊人久久| 神马国产精品影院av| 亚洲另类激情图| 福利精品视频在线| 日韩一区二区三区在线播放| 亚洲色图18p| 久久躁日日躁aaaaxxxx| 97在线看免费观看视频在线观看| 国产成人精品最新| 久久久视频免费观看| 日韩精品在线免费| 国产91精品黑色丝袜高跟鞋| 欧美中文字幕在线观看| 国产91亚洲精品| 亚洲国产精品专区久久| 久久香蕉精品香蕉| 亚洲va男人天堂| 亚洲第一在线视频| 亚洲性xxxx| 成人羞羞国产免费| 日韩一级黄色av| 日韩在线视频国产| 一个色综合导航| 日韩国产精品亚洲а∨天堂免| 亚洲小视频在线观看| 国产精自产拍久久久久久蜜| 国产精品最新在线观看| 久久中文字幕在线| 精品国产网站地址| 国产精品老牛影院在线观看| 日韩成人av在线| 国产91精品久| 久久精品91久久香蕉加勒比| 国产精品第一视频| 欧美精品videos另类日本| 亚洲毛片在线观看.| 中文字幕精品久久| 国产一区二区三区视频| 欧美疯狂性受xxxxx另类| 久久视频精品在线| 中文字幕日韩在线观看| 国产一区二区三区视频免费| 亚洲精品久久久久国产| 亚洲摸下面视频|