跳转到内容

性能优化与安全实践

性能优化策略

1. 进程复用与连接池

js
// 创建子进程池
const { GenericPool } = require('generic-pool')

const pool = GenericPool.create({
  create: () => fork('./worker.js'),
  destroy: (worker) => worker.kill(),
  max: 10, // 最大进程数
  min: 2   // 最小保持进程数
})

// 使用示例
const worker = await pool.acquire()
worker.send(task)

流式处理优化

js
// 大文件处理(避免内存溢出)
const child = spawn('openssl', ['enc', '-aes-256-cbc'], {
  stdio: ['pipe', fs.createWriteStream('out.bin'), 'ignore']
})

fs.createReadStream('input.bin')
  .pipe(child.stdin)

集群负载均衡

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

if (cluster.isPrimary) {
  for (let i = 0; i < numCPUs; i++) {
    fork('./app.js')
  }
} else {
  // Worker 代码
}

资源限制配置

js
// 使用 cgroups (Linux)
spawn('node', ['app.js'], {
  detached: true,
  stdio: 'ignore',
  // 限制内存为 512MB
  execArgv: ['--max-old-space-size=512']
})

✅ 性能优化最佳实践

内存管理

js
// 定期重启策略
let restarts = 0
function createWorker() {
  const worker = fork('./worker.js')
  
  worker.on('exit', () => {
    if (restarts++ < 5) {
      setTimeout(createWorker, 1000)
    }
  })
  
  return worker
}

数据传输优化

js
// 使用二进制协议
child.send(Buffer.from('binary data'), (err) => {
  // 处理发送结果
})

// 共享内存(Node.js 17+)
const { SharedArrayBuffer } = require('worker_threads')
const sab = new SharedArrayBuffer(1024)
child.send(sab, [sab])

监控指标

js
const pidusage = require('pidusage')

setInterval(() => {
  pidusage(child.pid, (err, stats) => {
    console.log('CPU:', stats.cpu, 'MEM:', stats.memory)
  })
}, 5000)

安全实践方案

输入消毒规范

js
const { execFile } = require('child_process')
const validator = require('validator')

function safeExec(input) {
  if (!validator.isAlphanumeric(input)) {
    throw new Error('非法输入')
  }
  execFile('scan', [input])
}

权限最小化

js
// 降权执行(UNIX)
spawn('sudo', ['-u', 'nobody', 'app.js'], {
  env: { ...process.env, HOME: '/tmp' }
})

沙箱隔离

js
const vm = require('vm')
const context = vm.createContext({})
vm.runInContext('untrustedCode()', context, {
  timeout: 100,
  microtaskMode: 'afterEvaluate'
})

✅ 安全最佳实践

进程隔离策略

js
// 使用 Docker 容器化
spawn('docker', [
  'run', '--rm',
  '--memory=512m',
  '--cpus=0.5',
  'isolated-app'
])

日志审计

js
const { createSecureLog } = require('audit-logger')

spawn('payment-service', [], {
  stdio: [
    'ignore',
    createSecureLog('app.stdout.log'),
    createSecureLog('app.stderr.log')
  ]
})

安全通信

js
const { generateKeyPairSync } = require('crypto')
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
  modulusLength: 2048
})

// 子进程使用公钥加密
child.send({ type: 'PUB_KEY', payload: publicKey.export({ type: 'pkcs1', format: 'pem' }) })

⚠️ 常见问题

资源耗尽攻击

现象
恶意输入导致无限创建子进程

解决方案

js
// 使用 semaphore 控制
const { Semaphore } = require('async-mutex')
const sem = new Semaphore(5)

async function safeSpawn() {
  const [value, release] = await sem.acquire()
  try {
    return await createProcess()
  } finally {
    release()
  }
}

敏感信息泄漏

高危代码

js
exec(`mysql -u${DB_USER} -p${DB_PASS}`, (err) => { /*...*/ })

修复方案

js
execFile('mysql', ['-u', process.env.DB_USER, '-p', process.env.DB_PASS], {
  env: {} // 清空环境变量
})

僵尸进程堆积

处理方案

js
const timeout = setTimeout(() => {
  child.kill('SIGKILL')
}, 30000)

child.on('exit', () => clearTimeout(timeout))

跨平台路径注入

错误处理

js
// 危险写法
const cmd = `build-${process.platform}`
execFile(cmd)

// 安全验证
const ALLOWED_PLATFORMS = ['linux', 'darwin']
if (!ALLOWED_PLATFORMS.includes(process.platform)) {
  throw new Error('非法平台')
}

安全检测工具

工具名称检测方向使用场景
child-process子进程调用分析代码审计
node-secure依赖链安全检查CI/CD 集成
ClamAV病毒文件扫描上传文件处理
sysdig系统调用监控生产环境入侵检测

性能安全矩阵

优化维度性能影响安全增益实施难度
进程池⭐⭐⭐⭐⭐⭐
输入消毒⭐⭐⭐⭐⭐⭐
容器隔离⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
资源限制⭐⭐⭐⭐⭐⭐⭐⭐⭐