优化Nginx和Node.js的协同工作需要从Web服务器配置、应用性能、资源管理等多方面入手。以下是分步骤的详细优化方案:
worker_processes auto; # 自动匹配CPU核心数
worker_connections 1024; # 每个worker的最大连接数
keepalive_timeout 65; # 保持长连接减少重建开销
gzip on; # 启用Gzip压缩静态资源
access_log off; # 生产环境可关闭日志提升性能(或设为缓冲模式)
location ~* \.(jpg|css|js|png)$ {
expires 365d; # 长期缓存
add_header Cache-Control "public";
}
location / {
proxy_pass http://nodejs_app;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_buffer_size 16k; # 缓冲区优化
proxy_buffers 4 32k;
}
upstream nodejs_app {
least_conn; # 最少连接算法
server 127.0.0.1:3000;
server 127.0.0.1:3001;
keepalive 64; # 复用TCP连接
}
使用Cluster模块:利用多核CPU。
const cluster = require('cluster');
if (cluster.isMaster) {
for (let i = 0; i < require('os').cpus().length; i++) {
cluster.fork();
}
} else {
require('./app');
}
避免阻塞主线程:
async/await
处理I/O操作。PM2管理进程:
pm2 start app.js -i max # 根据CPU核心数启动实例
pm2 save && pm2 startup # 持久化进程
性能分析:
node --inspect app.js # 使用Chrome DevTools分析
bash
node --max-old-space-size=4096 app.js # 4GB内存
heapdump
或clinic.js
工具。Nginx缓冲请求
nginx
proxy_buffering on;
proxy_buffer_size 8k;
WebSocket优化
location /socket.io {
proxy_pass http://nodejs_app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
HTTP/2支持
nginx
listen 443 ssl http2;
实时监控工具
ngxtop
、GoAccess
(日志分析)。pm2 monit
、New Relic
。压力测试
ab -n 10000 -c 100 https://yoursite.com/ # Apache Benchmark
内核参数调优(Linux)
echo "net.core.somaxconn=65535" >> /etc/sysctl.conf
sysctl -p
limit_except GET POST { deny all; }
helmet
中间件加固HTTP头。express.json({ limit: '10kb' })
)。通过以上步骤,可显著提升Nginx和Node.js的性能与稳定性。建议根据实际业务场景逐步测试调整参数,并持续监控关键指标(如QPS、延迟、内存使用率)。