目标是使用 nodejs http 服务器交付文件。
问题是从服务器响应到浏览器的传输。
我提供字符串作为内容,如程序代码所示。
VPS: debian 7/SSD/2 核心/~30ms ping
相关:node.js response.write(data) 当数据大小较小时需要很长时间
一些字符串大小基准测试(内容下载时间)
- 1 kb: 0,18 ms - 10 kb: 7,00 ms - 20 kb: 47,50 ms - 30 kb: 55,00 ms - 40 kb: 58,10 ms - 50 kb: 86,20 ms - 60 kb: 93,10 ms - 80 kb: 107,10 ms - 100 kb: 120,00 ms (nginx needs 0.31ms)
程序代码:
// var request => the http incoming request
request.socket.setNoDelay();
request.connection.setNoDelay();
// var response => the response from the http incoming request
response.on('close', function () {
console.log("[ABORTED][%s] %s", request.connection.remoteAddress, request.url);
});
response.on('finish', function () {
console.log("[SUCCESS][%s] %s", request.connection.remoteAddress, request.url);
});
// get the content of the file (takes ~0ms)
var fileContent = fileSystem.readFileSync(filePath, 'utf8');
// Configure response header
response.writeHead(200, {
'content-length': ''+fileContent.length,
'content-type': 'text/plain',
});
// Send content
response.end(fileContent, 'utf8', function(){
console.log("Ending response took %sms", Date.now()-timeB2);
});
TL;DR:
改变
response.writeHead(200, {
'Content-Type': 'text',
'Content-Length': stat.size
});
自
response.writeHead(200, {
'Content-Type': 'application/arraybuffer',
'Content-Length': stat.size
});
长版本:问题是内容长度是错误的。 事实上,标头的信息是错误的,因为createReadStream返回一个缓冲区(数字数组),而不是文本。
如果要以文本形式发送,只需使用
response.end(readFileSync (filePath, 'utf8'));
它将自动构造正确的标头。 否则,您将需要找到"字符数"作为内容长度,并将编码传递给createReadStream,即:
var readStream = fileSystem.createReadStream(filePath, 'utf8');
我不知道在文本文档中获取"字符数"的简单方法。
另一种方法是将其作为应用程序/数组缓冲区发送,内容长度作为缓冲区的字节长度。 当您使用 stat.size 时,它实际上是文件字节大小,如果要将其读取为缓冲区流,则相当于 byteLength。
,没有问题。
内容下载时间根据我的网络速度而定。
区别在于压缩和缓存。Nginx速度更快,因为它使用某种类型的压缩和缓存。
为了获得更好的结果,我将SPDY和GZIP添加到我的nodejs应用程序中,结果几乎与nginx相同。