高并发场景下Node.js HTTP服务器优化请求响应性能
- 缓存策略
- 内存缓存:使用如
node-cache
这样的库,在内存中存储频繁访问的数据。例如,对于一些不经常变化的配置信息、基础数据等,可在首次请求时查询数据库或其他数据源,将结果存入内存缓存,后续相同请求直接从缓存获取,减少数据库或其他IO操作。
- HTTP缓存:合理设置HTTP缓存头,如
Cache - Control
和 ETag
。对于静态资源(如CSS、JS、图片等),设置较长的缓存过期时间,告知浏览器直接从本地缓存加载,减少服务器负载。对于动态数据,可根据业务逻辑设置合适的缓存策略,如根据数据的更新频率设置较短的缓存时间。
- 连接管理
- 连接池:对于数据库连接或其他外部服务连接,使用连接池技术。例如,在连接MySQL数据库时,通过
mysql2
库的连接池功能,创建一定数量的连接对象并复用。在高并发场景下,避免频繁创建和销毁连接带来的性能开销,提高连接的使用效率。
- Keep - Alive:启用HTTP Keep - Alive功能,默认情况下Node.js的HTTP服务器是支持Keep - Alive的。它允许在同一个TCP连接上进行多个HTTP请求和响应,减少了建立和关闭TCP连接的开销,提高了请求处理效率。可以通过设置
http.Server
的 keepAliveTimeout
和 headersTimeout
等属性来优化Keep - Alive行为。
- 负载均衡:采用负载均衡技术,如使用Nginx作为反向代理服务器,将请求均匀分配到多个Node.js实例上。这样可以充分利用多台服务器的资源,提高整体的处理能力和并发性能。
防范常见HTTP安全漏洞
- SQL注入防范
- 参数化查询:使用数据库驱动提供的参数化查询功能。例如,在使用
mysql2
库操作MySQL数据库时,不要直接拼接SQL语句,而是使用占位符。如下代码示例:
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test'
});
const username = req.body.username;
const query = 'SELECT * FROM users WHERE username =?';
connection.query(query, [username], (err, results) => {
if (err) throw err;
console.log(results);
});
- **输入验证**:对用户输入的数据进行严格的验证和过滤。使用正则表达式或专门的验证库(如 `joi`)来验证输入的数据格式是否符合预期。例如,验证邮箱格式:
const Joi = require('joi');
const schema = Joi.string().email();
const { error } = schema.validate(req.body.email);
if (error) {
// 返回错误信息
res.status(400).send('Invalid email');
}
- XSS防范
- 输出编码:对输出到前端的数据进行编码。例如,在使用模板引擎(如EJS)时,引擎会自动对输出的数据进行HTML转义,防止恶意脚本注入。如果是手动拼接HTML,要使用
DOMPurify
这样的库对数据进行净化。示例如下:
const DOMPurify = require('dompurify');
const dirty = '<script>alert("XSS")</script>';
const clean = DOMPurify.sanitize(dirty);
res.send(clean);
- **内容安全策略(CSP)**:设置HTTP的 `Content - Security - Policy` 头,限制页面可以加载的资源来源。例如,只允许从特定的域名加载脚本、样式等资源,防止恶意脚本的注入。在Node.js中,可以在响应头中设置:
res.setHeader('Content - Security - Policy', "default - src'self'");