![不使用或使用 nginx/apache 的 node.js 应用程序](https://linux22.com/image/694534/%E4%B8%8D%E4%BD%BF%E7%94%A8%E6%88%96%E4%BD%BF%E7%94%A8%20nginx%2Fapache%20%E7%9A%84%20node.js%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F.png)
我正在使用带有 restify 框架的 node.js 启动 REST 服务器。因此,不会有静态页面。但是,需要 ssl (https)。将 http 服务器作为中间件是一个好主意吗?还是说这是不必要的复杂化?
答案1
我认为 NodeJS(或 ruby、python、perl 等)不是 Web 服务器(无论 express.js、socket.io 等库有多么出色),并且至少在可靠性方面无法与 nginx、apache、lighttpd 等竞争。
运行 NodeJS 服务,我建议使用:
nginx
提供 HTTPS(您的 HTTP 标头、CSP 策略等)PM2
驱动您的 NodeJS 进程(您将能够对它们进行集群,集群进程可以以缩短服务中断的方式重新加载,...)
再次使用 NodeJS 作为前端并不罕见。
答案2
这个问题很难回答。事实上,这完全取决于您的个人需求。在您的环境中添加另一个组件可能会为您提供更多的灵活性和可扩展性(您可能不需要),但可能需要付出维护、许可或支持成本、功能、可用性等代价。
从技术上讲,您既可以使用tls
Node.js 包进行加密处理,也可以让 nginx 为您处理加密处理,并在适用的情况下将请求代理到 node.js。
我认为没有绝对的“正确”或“错误”。你只需比较优点和缺点,并根据结果来判断。
如果要设置类似的东西,我想我宁愿在中间放一个 nginx。一方面,它设置起来相当容易,而且不会为这么小的工作消耗太多资源(因此开销不是太大),另一方面,你可以获得更多的灵活性(例如,直接提供静态内容(如图像)、在未来的其他实例之间进行负载平衡或通过 node.js 仅提供单个域)。
但是,如果您想要最简单的设置并尽量减少将来的维护(例如,安装代理的新版本),您可以采用另一种方式。