刚接触nodejs,关于http模块有一疑问
发布于 10 年前 作者 zstxt1989 4540 次浏览 最后一次编辑是 8 年前

昨晚开始学nodejs,按照教程创建了个简单的http服务,输出hello world.

通过chrome控制台记录到的页面传输时间高达150ms

而通过同服务器下的nginx打开一个静态页面,传输时间只有不到10ms

这是为何?

9 回复

完全不可能。。。。。不是 node 的问题。

可以说详细点吗

我想知道怎么贴图。。 好吧,我手写一下。 nodejs的代码:

var http = require('http');
http.createServer(function(req,res){
        res.writeHead(200,{'Content-Type':'text/html'});
        res.write('<h1>hello nodejs</h1>');
        res.end();
}).listen(999);

浏览器接收到的:

HTTP/1.1 200 OK
Content-Type: text/html
Date: Tue, 25 Feb 2014 02:36:01 GMT
Connection: keep-alive
Transfer-Encoding: chunked

消耗时间:

connecting:20ms
receiving:225ms

刚才测试的,然后我又通过nginx加载一个1KB的文件,才耗时26ms,费解。

http://115.28.221.33:8080/ 这是nginx http://115.28.221.33:999/ 这是nodejs

大家帮忙测试下看看啊

我这里的话,前者 25ms,后者 38ms。

@alsotang 嗯,我找到原因了,因为之前Transfer-Encoding: chunked,不能确定长度,我刚才修改了一下代码,确定了 content-length 头,就可以了

数据量小且轻量json情况下,可以用api读出长度并且赋予content-length,甚至可以不用写 但是类似于模板输出,硬编码数据量比较大的情况下,如果声明content-length话,那么node须把数据全部读取然后存储到内存中,从而计算他的字节数,在随着http响应头报文输出给浏览器,假如并发数多或者说,服务器网络传输慢的话,这些数据都储存在内存里,可能会造成内存crash,所以建议用transfer-encoding,这种分块编码机制,读多少响应多少,直到服务器没有任务为止

@zstxt1989 哇 活到老学到老

@zstxt1989 具体改动了哪里?贴出来让大家看看,我也很苦恼为什么不能贴图。这功能太弱了

回到顶部