我正在构建一个新的 Node.js Web 应用程序的后端,我希望它具有很好的可扩展性,但又不会过度。在我之前的所有 Node.js 部署中,我都使用 Nginx 来提供静态资产(例如 JS/CSS)和 Node 的反向代理(据我所知,Nginx 在这方面做得更好/express 还没有真正准备好投入生产)。
但是,Nginx不支持 WebSockets。我第一次大量使用 Socket.IO,发现很多文章详细介绍了这一限制。其中大多数建议使用 Varnish 将 WebSockets 流量直接引导到节点,绕过 Nginx。这是我当前的设置:
漆:端口 80 - 将 HTTP 请求路由到 Nginx 和 WebSockets 直接到节点
Nginx:端口 8080 - 提供 CSS/JS 等静态资产
Node.jsExpress:端口 3000 - 通过 HTTP + WebSockets 为应用程序提供服务
但是,现在增加了复杂性,因为 Varnish 不支持 HTTPS,这需要 Stunnel 或其他解决方案,而且它还没有负载平衡(也许我会使用 HAProxy 或其他东西)。复杂性正在增加!如果可能的话,我希望让事情比这更简单。
当 Varnish 也存在时,是否仍需要使用 Nginx 反向代理 Node.js? 因为即使 express 在提供静态文件时速度很慢,理论上它们也应该被 Varnish 缓存。或者有更好的方法来实现这一点?
答案1
当 Varnish 也存在时,是否仍需要使用 Nginx 反向代理 Node.js?
Varnish 可以从 node.js 应用程序缓存您的静态文件。您需要从应用程序提供正确的 http 标头(缓存控制)(对于默认 VCL)。或者您可以调整 VCL 以根据 URL 或例如内容类型缓存静态文件。
对于 SSL/TLS 支持,我使用 Pound 和 Varnish(http://www.apsis.ch/pound)。
正如评论中所指出的,Varnish 也可以作为负载均衡器。
答案2
无论您使用什么软件,您仍然需要实现以下功能:
- websocket 后端
- 应用程序后端
- 静态后端
- 反向代理
- 内容缓存
- http 路由器
- 负载均衡器
- https 过滤器
复杂性并不在于您使用了多少软件 - 它更多地取决于您拥有多少配置功能。拥有更多专用软件比使用具有重复功能的不同模块更简单。
对于其他问题:链接反向代理通常是不好的,因此您最好设置 varnish 以仅使用 nginx 作为静态后端,或者为此使用 node.js 并在 varnish 中设置缓存以实现所需的性能。