Node.js在Ubuntu上的最佳实践
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash,之后通过nvm install --lts安装最新LTS版本,nvm use <version>切换版本。这种方式避免系统包管理器版本滞后的问题,且不会影响系统全局环境。sudo apt remove --purge nodejs,导入GPG密钥并添加仓库curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -,最后sudo apt install nodejs。此方法确保版本一致性,适合生产环境。root用户启动Node.js应用,建议创建专用用户(如nodeuser)并赋予应用目录权限。通过adduser nodeuser创建用户,chown -R nodeuser:nodeuser /path/to/app修改目录归属,再用sudo -u nodeuser node app.js启动。const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/fullchain.pem')
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('Secure connection established');
}).listen(443);
```。
npm audit检查项目依赖的已知漏洞,或使用Snyk等第三方工具(支持自动化修复)。在package.json中锁定依赖版本(如"express": "^4.18.2"),避免意外升级引入风险。helmet中间件设置安全HTTP头(如Content-Security-Policy),或escape-html库转义用户输入;csurf库生成和验证CSRF令牌;Sequelize ORM的$param语法)或ORM工具,避免拼接SQL语句。.env文件(通过dotenv库加载),而非代码中。示例:DB_PASSWORD=your_secure_password
API_KEY=your_api_key_here
```,代码中通过`process.env.DB_PASSWORD`访问。
cluster模块创建多个工作进程(数量等于CPU核心数),共享端口提高并发能力。示例代码:const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
for (let i = 0; i < os.cpus().length; i++) cluster.fork();
cluster.on('exit', (worker) => console.log(`Worker ${worker.process.pid} died`));
} else {
require('./app.js'); // 启动应用
}
```。
fs.readFileSync()、child_process.execSync()等同步方法,改用fs.promises.readFile()、child_process.exec()等异步API,防止阻塞事件循环。对于大文件或网络传输,使用Stream(如fs.createReadStream().pipe(res))减少内存占用。emitter.removeListener()),避免全局变量滥用(如global.user = req.user),优化数据结构(如用Map代替Object提高查找效率)。可通过--max-old-space-size调整内存上限(如node --max-old-space-size=4096 app.js设置4GB内存)。pm2 start app.js -i max启动(-i max表示按CPU核心数启动进程),pm2 monit监控实时性能,pm2 logs查看日志。/etc/sysctl.conf文件,优化网络性能:net.core.somaxconn = 4096 # 增加连接队列长度
net.ipv4.tcp_max_syn_backlog = 4096 # 增加SYN队列长度
net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME-WAIT状态的连接
net.ipv4.tcp_fin_timeout = 30 # 缩短TIME-WAIT超时时间
运行sudo sysctl -p使配置生效。同时,通过ulimit -n 65535增加文件描述符限制(永久生效需写入/etc/security/limits.conf)。winston或pino等日志库,记录不同级别(info、error、warn)的日志,并输出到文件(如logs/app.log)和远程服务(如ELK Stack)。示例winston配置:const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
logger.info('Application started');
```。
--inspect标志启动应用(node --inspect app.js),通过Chrome DevTools分析CPU、内存使用情况;用--prof生成性能分析报告(node --prof app.js),再用node --prof-process isolate-0xnnnnnnnnnnnn-v8.log解析。nvm install --lts)、npm(npm install -g npm)和依赖项(npm update)为最新版本,修复安全漏洞。定期备份应用代码(如用git)和数据库(如mysqldump),防止数据丢失。