最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

速率限制nginx的单WebSocket连接

IT培训 admin 4浏览 0评论

速率限制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

速率限制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

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论