【发布时间】:2016-06-20 08:28:25
【问题描述】:
Keep-alive 应该加快网站的速度。
但是,当我在 chrome (localhost:8080) 中运行这个死的简单服务器时,我得到了这些加载时间:
大约 100 毫秒,带有 "Connection: close" 标头(即未注释 setHeader 行)
大约 400 毫秒,启用标准保持活动状态。
我做错了什么?谁能重现我的结果?
过去 2 天我一直在为此头疼。
var fs = require('fs')
// preparing 50 2k files ...
var a = [], txt = '/*\n' + 'x'.repeat(2000) + '\n*/'
for (var i = 0; i < 50; i++) {
var name = '/test' + i + '.js'
fs.writeFile(__dirname + name, txt)
a.push('<script src="' + name + '"></script>')
}
fs.writeFile(__dirname + '/index.html', a.join('\n') + '\nhello world')
var serve = function (req, res) {
if (req.url === '/favicon.ico') {
res.statusCode = 404; return res.end()
}
var pth = req.url + (req.url.match(/\/$/) ? 'index.html' : '')
var s = fs.createReadStream(__dirname + pth)
res.on('finish', function () { console.log('done', req.url) })
// THIS IS THE KILLER LINE. Just uncomment and restart the server.
// on my system, the page loads 4 times FASTER
// res.setHeader('Connection', 'close')
res.statusCode = 200; s.pipe(res)
}
require('http').createServer(serve).listen(8080)
编辑
为清楚起见,使用标准快速服务器时的行为是相同的。以下服务器代码将产生相同的结果(至少在我的系统上)
// express server code
var express = require('express')
var app = express()
var closeConnection = function (req, res, next) {
res.setHeader('Connection', 'close'); next()
}
// THIS IS THE KILLER LINE. Just uncomment and restart the server.
// on my system, the page loads 4 times FASTER
// app.use('*', closeConnection)
app.use(express.static(__dirname))
require('http').createServer(app).listen(8080)
【问题讨论】:
-
不是因为缺少
Content-Lengthheader吗? IE。浏览器不知道响应何时结束,所以这 400 毫秒是人为的,即它包括等待时间?与Connection: close不同,浏览器知道响应何时结束。那将是我的盲目射击。 -
不,我不这么认为。该行为与标准 Express 服务器完全相同,您提到的问题不存在。你能重现这个问题吗?
标签: node.js http server keep-alive