nginx - WebSocket 的 API 网关

标签 nginx proxy haproxy g-wan 3scale

我的 websocket 应用程序需要一个 API 网关。

  • 分析和识别来自特定 IP
  • 的异常请求
  • 配额和速率限制
  • 统计
  • 免费或商业
  • 稳健的表现

  • 我的 WebSocket 的子协议(protocol)是 WAMP,所以恐怕没有现有的产品可以完成这项工作。

    我打算开发一个并假设它会以这种方式工作:

    enter image description here
  • 在我的客户端应用程序和我的 websocket 服务器之间安装了一个代理(NGINX 或 HAProxy)
  • 代理将请求/响应复制到另一个应用程序,我称之为 monitor
  • monitor应用程序分析流量并控制代理以限制/阻止某些 ip。
  • monitor应用程序一起运行,如果它关闭,它不会影响我的应用程序和代理。

  • 这种方法听起来可行。但是代理似乎不支持重用与 monitor 的上游连接。 .

    假设从代理到客户端建立了 10K 连接,那么代理也建立了 10K 连接作为上游到 monitor应用程序?这是 Not Acceptable 。

    我希望代理和 monitor 之间只建立一个或多个连接。发送重复的请求/响应。当然代理通知monitor每个请求/响应的真实来源/目标。

    是否有任何代理或产品满足此要求,以便我只需要开发更少?

    最佳答案

    (TL;DR ...对不起!)
    我正在做一个与 G-WAN 非常相似的项目。最初,我编写了 API servlet,它运行良好并没有充分利用 G-WAN 功能。在 G-WAN 支持的一些指导下,我开始探索处理程序的使用;我将我的 API servlet 移植到处理程序中的 URL 重写例程(API 查询返回的绝大多数内容是静态/预渲染内容)。我现在正在研究一个 404 处理程序例程,以捕捉我们(尚未)预渲染内容的情况,将它们转换为按需渲染请求并动态构建响应。

    从客户端来看,这一切看起来都是动态的。但是通过对静态路径进行 URL 重写并允许 G-WAN 调度我们的按需案例,它减少了我们必须编写的代码量,并利用了 G-WAN 中的一些高度优化的功能。我提到这些细节是 Gil 所说的“打破常规”的一个例子。最初,我们的方法看起来很像我们如何使用 nginx 进行实现(除了不需要像 fcgi 这样的网关)。尽管一旦我们剥离了需求并抛弃了许多关于应该如何构建 Web 服务的假设,这已经是一个相当大的改进。

    如果您打算使用 C++ 进行开发,请注意一点。从 G-WAN 到外部库的链接是“C”而不是“C++”。他们这样做是出于性能和内存占用的原因(不错的选择),但是当我开始用 C++ 编写一些库例程时,我并没有完全考虑到这一点,我打算从我的 G-WAN servlet 和处理程序中引用这些例程。从各种 C++ 应用程序中引用。它不是一个炫耀的东西——那里有很多“C”库可以很好地与 C++ 应用程序一起工作。但是,通过来自 servlet 的 G-WAN 的“C”链接来引用动态 C++ 类库 (.so) 会很麻烦。 (我的简单解决方法是将我的“共享”C++ 代码移动到 .h 文件中,然后将它们包含到我的 G-WAN 处理程序和 servlet 以及我的 C++ 应用程序中。不干净,但方便。)

    从 G-WAN 的角度来看,您的 5 个具体点:

  • 根据您对“分析”和“不寻常”的定义,这可以在协议(protocol)处理程序中的 C/C++ 中轻松完成,或者您可以使用外部库。如果阻塞是一个问题,有多种方法可以使该异步成为单独的进程,或者可能只是非阻塞 I/O。
  • 也很容易从处理程序管理。
  • 同上。
  • 是的。 :) 取决于您想要的支持级别。如果您完全依赖 SO 和其他社区支持,则免费。我们选择了廉价的支持订阅,并且 react 远远超出了我们的预期。
  • 哦耶!我们在头几天确认了这一点。

  • 哦,还有最后一件事:一旦你花了一两个小时编写了一些 G-WAN servlet,你可能很难回到其他 web/app/service 机制。使用 servlet,我只需保存编辑器中的更改并点击浏览器窗口上的刷新以查看新结果(尝试使用 fcgi 实现!)。我的服务器上运行了多个 G-WAN 实例(配置为不同的 IP 地址和端口号),因此在一台机器上,我有多个阶段的开发代码库,以及一个生产服务器。对于开发,我在终端 session 中运行 G-WAN(而不是作为守护程序),并且可以在我的 servlet 和处理程序代码中使用 printf(...) 来查看后端发生的情况与后端发生的情况我的浏览器窗口。

    欲了解更多信息:
  • G-WAN Protocol Handler
  • G-WAN User's Manual (从第 34 页开始)
  • handler states
  • calling library functions from servlets, handlers
  • 并查看 G-WAN 安装包的 handlers 文件夹中的示例。

  • 祝你好运!

    关于nginx - WebSocket 的 API 网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495938/

    相关文章:

    load-balancing - 使用 HAProxy AND Keepalived 与仅使用 Keepalived 的优势

    现代的http keep-alive

    linux - 在haproxy中添加静态html页面

    django - gunicorn、django 和 nginx 的静态文件

    node.js - nginx 代理到子目录中的远程 Node.js Express 应用程序

    proxy - 带 Spring 的 CGLIB 抛出 IllegalAccessError

    python - 将 sudo 标志传递到 makefile

    angularjs - 使用 Nginx 服务器将 Node 应用程序隔离到单独的 URL

    android - nginx 从 Web 重定向到移动应用程序

    django - 如何防止使用 SSL 和 gunicorn/nginx 的重定向循环?