使用Nginx反向代理后Nodejs性能下降该怎么处理

使用Nginx反向代理后Nodejs性能下降该怎么处理

没使用nginx反向代理前 webbench -c 500 -t 30 http://127.0.0.1:3000 Speed=293592 pages/min, 2133435 bytes/sec. 使用后 webbench -c 500 -t 30 http://exp.com

Speed=7320 pages/min, 48137 bytes/sec.

2 回复

使用Nginx反向代理后Node.js性能下降该怎么处理

问题描述

在没有使用Nginx反向代理时,Node.js应用的性能表现良好。然而,在引入Nginx作为反向代理之后,Node.js应用的性能明显下降。具体测试结果如下:

  • 未使用Nginx反向代理

    webbench -c 500 -t 30 http://127.0.0.1:3000
    Speed=293592 pages/min, 2133435 bytes/sec.
    
  • 使用Nginx反向代理

    webbench -c 500 -t 30 http://exp.com
    Speed=7320 pages/min, 48137 bytes/sec.
    

从上述数据可以看出,引入Nginx反向代理后,Node.js应用的性能显著降低。

解决方案

为了解决这个问题,我们可以优化Nginx配置,以减少其对Node.js性能的影响。以下是几个建议:

  1. 调整Nginx worker进程数量 增加Nginx worker进程的数量可以更好地利用多核CPU资源。

    worker_processes auto;
    
  2. 启用keepalive连接 启用HTTP keepalive连接可以减少TCP连接的建立与关闭,从而提高性能。

    http {
        keepalive_timeout 65;
    }
    
  3. 禁用不必要的日志记录 禁用不必要的日志记录可以减少I/O操作,提高性能。

    server {
        access_log off;
        error_log /var/log/nginx/error.log warn;
    }
    
  4. 使用合适的缓冲区大小 调整缓冲区大小以适应你的应用需求。

    http {
        client_body_buffer_size 10K;
        client_header_buffer_size 1k;
        client_max_body_size 8m;
        large_client_header_buffers 2 1k;
    }
    
  5. 启用gzip压缩 启用gzip压缩可以减少传输的数据量,提高响应速度。

    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    

通过以上配置优化,可以显著提升Node.js应用在使用Nginx反向代理后的性能。

示例配置文件

worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    server {
        listen       80;
        server_name  exp.com;

        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;

            # 禁用access日志
            access_log off;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

通过这些配置优化,可以显著提升Node.js应用在使用Nginx反向代理后的性能。


当使用 Nginx 反向代理后,Node.js 的性能出现下降,这通常与 Nginx 配置不当有关。以下是一些可能的原因及解决办法:

1. Nginx 配置问题

  • 确保 Nginx 配置文件中正确设置了 proxy_passproxy_set_header
  • 确保没有启用不必要的功能或模块,比如 SSL/TLS 加密。

示例配置:

server {
    listen 80;
    server_name exp.com;

    location / {
        proxy_pass http://127.0.0.1:3000; # 指定 Node.js 服务的地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

2. Nginx 资源限制

  • 增加 Nginx 的 worker 进程数和连接数限制。

修改 nginx.conf 文件:

worker_processes auto;
events {
    worker_connections 4096;
}

3. TCP 参数优化

  • 修改 Linux 系统的 TCP 参数以提高性能。

编辑 /etc/sysctl.conf 文件:

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300

然后运行 sysctl -p 使更改生效。

4. Node.js 性能优化

  • 确保 Node.js 代码高效且无阻塞操作。
  • 使用集群模块来利用多核 CPU。

示例代码:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
} else {
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end("Hello World\n");
    }).listen(3000);
}

通过上述方法,可以有效提升 Nginx 反向代理后的 Node.js 性能。

回到顶部