刚接触Nodejs,关于http模块有一疑问

刚接触Nodejs,关于http模块有一疑问

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

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

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

这是为何?

8 回复

当然可以。让我们来探讨一下为什么使用Node.js的HTTP模块创建的服务在传输时间上可能比Nginx慢。

问题分析

首先,我们需要理解几个关键点:

  1. Node.js HTTP模块的特点:Node.js的HTTP模块是一个事件驱动、非阻塞I/O模型的实现,非常适合处理并发连接。然而,它也意味着在某些情况下,如处理大量静态文件时,性能可能不如专门设计用于处理静态文件的服务器(如Nginx)。

  2. Nginx的特性:Nginx是一个高性能的HTTP和反向代理服务器,特别擅长处理静态文件和负载均衡。它使用了高效的事件模型,能够以较低的资源消耗处理大量的并发请求。

示例代码

以下是一个简单的Node.js HTTP服务器示例,用于输出 “Hello World”:

const http = require('http');

const server = http.createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World\n');
});

server.listen(3000, () => {
    console.log('Server running at http://localhost:3000/');
});

性能差异原因

  1. 静态文件处理:Node.js并不是为处理大量静态文件而优化的。当需要提供静态文件时,Node.js需要读取文件系统,并将内容写入响应中,这通常比Nginx慢,因为Nginx直接从内存中读取并发送文件。

  2. 事件循环:虽然Node.js的事件循环模型非常高效,但在某些情况下,如频繁的文件系统操作或复杂的计算任务,可能会导致事件循环堵塞,从而影响性能。

解决方案

为了提高Node.js服务器的性能,特别是在处理静态文件时,可以考虑以下几种方法:

  1. 使用反向代理:将Node.js应用放在Nginx后面作为反向代理,让Nginx负责处理静态文件请求,同时利用Nginx的缓存功能。

    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://localhost:3000;
        }
    
        location /static/ {
            alias /path/to/static/files/;
        }
    }
    
  2. 优化Node.js代码:确保你的Node.js代码尽可能高效地处理请求,避免不必要的文件读取或复杂的计算。

通过这些方法,你可以显著提高Node.js服务器的性能,使其更接近甚至超越Nginx的表现。希望这能帮助你更好地理解和解决你的问题!


完全不可能。。。。。不是 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。

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

在Node.js中使用HTTP模块创建的服务相比Nginx处理静态文件确实可能会慢一些。主要原因在于两者的用途不同:Node.js更适合处理动态内容和复杂的业务逻辑,而Nginx擅长于提供静态文件和负载均衡。

如果你只是在测试一个简单的HTTP服务(如返回"Hello World"),那么传输时间较长可能是因为Node.js需要启动一个事件循环来处理请求。而在Nginx中,它直接从磁盘读取静态文件并发送给客户端,因此速度更快。

示例代码

以下是一个简单的Node.js HTTP服务器代码:

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

如何优化

  1. 缓存:可以使用缓存机制来减少重复请求的时间。
  2. 并发处理:利用多线程或集群模式提升处理能力。
  3. 使用反向代理:例如,你可以将静态文件放在Nginx上,动态内容交给Node.js处理。

如果仅仅是测试HTTP服务,可以考虑以上优化方法,但在生产环境中,通常会结合Nginx和Node.js来实现高效的服务。

回到顶部