仅使用Node.js与使用Apache/Nginx的Node.js

7co*_*ows 208 node.js

在什么情况下,人们是否应该仅将Node.js用作实际部署中的服务器?

当一个人希望只使用Node.js的,有什么用Node.js的发挥更好?Apache还是Nginx?

pau*_*ljz 192

有几个很好的理由在Node.js前面粘贴另一个Web服务器:

  • 不必担心Node.js进程的特权/ setuid.只有root通常可以绑定到端口80.如果你让nginx/Apache担心以root身份启动,绑定到端口80,然后放弃其root权限,这意味着你的Node应用程序不必担心它.
  • 提供图像,css,js和html等静态文件.与使用适当的静态文件Web服务器相比,节点可能效率较低(Node在选择的场景中也可能更快,但这不太可能是常态).除了提供更高效的文件之外,您不必担心处理eTags或缓存控制标头,就像您从Node中提供服务一样.有些框架可能会为您处理此问题,但您可能需要确定.无论如何,仍然可能更慢.
  • 正如Matt Sergeant在他的回答中提到的,如果您的节点服务崩溃,您可以更轻松地显示有意义的错误页面或回退到静态站点.否则用户可能只是获得超时连接.
  • 在Node前面运行另一个Web服务器可能有助于缓解针对Node的安全漏洞和DoS攻击.对于一个真实的例子,通过在Node前面运行类似Nginx的东西阻止CVE-2013-4450.

我会告诉你第二个要点你应该通过CDN或者像Varnish这样的缓存服务器提供静态文件.如果你这样做,那么起源是Node还是Nginx或Apache并不重要.

特别注意nginx:如果你正在使用websockets,请确保使用最新版本的nginx(> = 1.3.13),因为它只是添加了对升级连接以使用websockets的支持.

  • 节点不是那么好吧?http://centminmod.com/siegebenchmarks/2013/020313/index.html,http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php (17认同)
  • `express.static`会处理ETag和缓存控制头文件. (11认同)
  • pauljz,你有基准备份慢吗?@pawlakpp指出的文章似乎说Node.js在加载时要快得多. (4认同)
  • 应该注意的是,如果你只是直接使用节点,你仍然可以通过简单地使用authbind绑定到保留端口,例如`:80`而不以root身份运行节点:https://thomashunter.name/blog/using-authbind -with节点-JS / (4认同)
  • 这里有一些相关的讨论:http://stackoverflow.com/questions/9967887/node-js-itself-or-nginx-frontend-for-serving-static-files,还有一些额外的观点.那里的基准(因为你要求额外的基准测试)显示node.js/express,甚至是群集,显着表现不佳.我的感觉是最好将静态文件服务和请求处理完全保留在节点事件循环之外,为Node中需要进行的工作保存这些循环.但老实说,如果你从Node中提供静态的东西,你也会没事的.没什么大不了的. (3认同)
  • 基准测试很有用并提供有意义的信息,但是在大多数应用程序中差异不足以保证对这些数字的关注.在Node前面使用Nginx/Apache可能会更好,但在大多数情况下,它只是过度杀伤并增加了不必要的复杂性.这一切都取决于您的需求.我的意见是只使用NodeJS才能工作,如果吞吐量不符合您的喜好,那么请考虑在前面添加一个Web服务器. (3认同)
  • Wishnu 这意味着某个端口号(1024?)下的端口通常是为众所周知的应用程序保留的(例如端口 80 上的网络服务器、端口 25 上的 telnet、端口 443 上的安全电子邮件等)。您的进程需要以 root 身份运行才能在该端口上绑定套接字。超过 1024 任何人都可以,只要它没有被使用。 (2认同)

Mat*_*ant 65

为了给pauljz的答案增加一个理由,我使用前端服务器,这样当我重新启动后端服务器时它可以提供502个错误页面,或者由于某种原因它崩溃了.这使您的用户永远不会收到有关无法建立连接的错误.

  • 这本身就非常重要 (17认同)

小智 25

我相信只要你知道自己在做什么,使用Node来提供静态文件就可以了.它当然是使用应用程序服务器提供静态文件的新范例,因为许多(每个?)竞争技术(PHP,Ruby,Python等)需要在应用程序服务器前面使用HTTPD或Nginx等Web服务器.

我曾经阅读过的每一个客观原因都反对使用Node提供静态文件,这一理由围绕着使用您最了解的内容或使用被认为更好测试/更稳定的内容的想法.实际上,这些是非常有效的原因,但几乎没有技术上的相关性.

除非您发现使用Node无法实现的经典Web服务器的功能(我怀疑您会这样做),否则请选择您最了解的内容或您更喜欢使用的内容,因为这两种方法都可以.

至于Nginx和Apache - 他们将与Node"玩"相同.您应该比较它们而不考虑Node.

  • 对技术比较的一般看法很好:"我曾经读过的每一个客观原因都反对使用Node提供静态文件,这主要是围绕着使用你最了解的东西或使用被认为测试得更好/更稳定的东西的想法.这些都是非常有效的理由实际上,但几乎没有技术相关性." 如今,太多的比较是有偏见的,并且基于经验和舒适程度的经验和低级但经过时间考验的技术. (2认同)

Đăn*_*inh 15

仅使用 Node.js

Node.js 可以完成 Web 服务器的所有任务:提供静态文件、响应 API 调用、在 HTTPS 上运行服务器...还有很多包提供额外的功能,例如记录请求、压缩响应、设置 cookie、防止 XSS 攻击...缺乏功能不太可能是使用其他 Web 服务器(Apache/Nginx/etc..)来完成 Node.js 的原因。换句话说,对于不需要扩展的简单应用程序,不需要向 Node.js 添加额外的层,这只会让问题变得复杂。

将 Node.js 与另一个网络服务器一起使用

每个网络服务器都有自己的优点。例如,Apache 允许通过 .htaccess 文件对每个目录进行附加配置。Nginx 在提供静态文件或充当反向代理方面以其性能而闻名。Node.js 在处理 I/O 繁重的系统时提供了巨大的好处...有时,我们需要结合不同 Web 服务器的力量来满足系统的要求。

示例:对于未来可能扩展的企业级应用程序,在 Node.js 应用程序之前设置 Nginx 作为反向代理具有一些优势

  • 如果您有超过 1 个 NodeJS 实例,Nginx 可以充当负载均衡器,将流量分派到您的 NodeJS 实例。
  • Nginx 可以为您处理HTTPS、缓存和压缩。加密和压缩是 NodeJS 不擅长的计算量大的操作。所以使用Nginx会给你带来更好的性能
  • Nginx 将提供静态内容,这减少了Node.js 的负载。
  • 关注点分离:Nginx 负责所有“配置”部分,Node.js 专注于应用程序逻辑。


小智 8

将 NGINX 放在 Node 前面有助于更好地处理高连接量。NGINX 提供(仅举几例) 缓存负载平衡速率限制(使用漏桶算法),如果与 Fail2ban 等禁止服务配合使用,可以帮助减轻攻击。

对于生产应用程序,您可以将应用程序服务器作为反向代理运行在 NGINX 后面,再加上像 Redis 这样的缓存服务器,所有这些服务器都可以位于内容交付网络后面,作为防止暴露 ipv4/ipv6 的另一道防线。


Enr*_*que 5

额外:如果您需要反向代理,例如在同一端口上执行 Websocket 服务器,或者混合一些技术(使用 NodeJS 回复一些请求,使用 PHP 回复其他一些请求或其他),这一点也很重要