速率限制nginx的单WebSocket连接
我试图设置速率限制为单个WebSocket连接(以便最终用户不会用炸弹或setInterval(_=>socket.send(1))
的东西一样,该连接)。
我使用的是作为的NodeJS nginx的反向代理服务器后端。当然,我可以检查节点WebSocket的轰炸,但我想,如果nginx的可以处理这个负载,因为它会继续节点进行其他作业。我没能找到关于单WebSocket连接nginx的限制什么。它甚至有可能?
回答如下:由于没有答案,这里就不NGINX的解决方案。
rate-limiter-flexible包帮助。
const app = require('http').createServer();
const io = require('socket.io')(app);
const { RateLimiterMemory } = require('rate-limiter-flexible');
app.listen(3000);
const rateLimiter = new RateLimiterMemory(
{
points: 5, // 5 points
duration: 1, // per second
});
io.on('connection', (socket) => {
socket.on('bcast', async (data) => {
try {
await rateLimiter.consume(socket.handshake.address); // consume 1 point per event from IP
socket.emit('news', { 'data': data });
socket.broadcast.emit('news', { 'data': data });
} catch(rejRes) {
// no available points to consume
// emit error or warning message
socket.emit('blocked', { 'retry-ms': rejRes.msBeforeNext });
}
});
});
详情请阅读official docs