仅使用Node.js与将Apache.Nginx与Node.js结合使用


224

在哪种情况下,应该更喜欢只在实际部署中将Node.js用作服务器?

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

Answers:


207

将另一个Web服务器放在Node.js前面有几个充分的理由:

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

我要说明第二点,说您应该通过CDN或从类似Varnish的缓存服务器后面提供静态文件。如果执行此操作,则起源不是Node还是Nginx或Apache都没有关系。

请特别注意nginx:如果您使用的是websocket,请确保使用最新版本的nginx(> = 1.3.13),因为它仅添加了对升级升级以使用websocket的支持。


11
express.static将处理ETag和缓存控制标头就好了。
robertklep


4
pauljz,您是否有基准备份速度较慢?@pawlakpp指出的文章似乎表明Node.js在负载下要快得多。
塞缪尔·内夫

3
这里有一些相关的讨论:stackoverflow.com/questions/9967887/…还有一些其他观点。那里的基准测试(因为您要求其他基准测试)显示了node.js / express,甚至是群集的,表现明显不佳。我的感觉是,最好让静态文件服务和请求处理完全不在节点事件循环之内,为那些需要在Node中进行的工作节省这些周期。但老实说,如果您在Node之外提供静态内容,也可以。没什么大不了的。
pauljz,

4
应该注意的是,如果您仅直接使用节点,则仍然可以:80通过使用authbind 绑定到保留端口,例如无需以root 身份运行节点:thomashunter.name/blog/using-authbind-with-node-js
wyqydsyq

70

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


28

我相信,只要您知道自己在做什么,就可以在所有情况下使用Node服务静态文件。使用应用服务器来服务于静态文件无疑是一种新的范例,因为许多(每一个?)竞争技术(PHP,Ruby,Python等)都需要在应用服务器之前使用HTTPD或Nginx之类的Web服务器。 。

我曾经阅读过的反对使用Node提供静态文件的客观原因都围绕着使用您最了解的知识或使用经过更好测试/更稳定的知识的想法。从实践上讲,这是非常有效的原因,但几乎没有技术上的相关性。

除非您发现经典Web服务器无法使用Node所具有的功能(我怀疑您会做到),否则请选择您最了解的知识或希望使用的方法,因为这两种方法都很好。

至于Nginx与Apache的关系,它们将与Node相同。您应该比较它们而不考虑Node。


2
一般而言,对技术比较的看法很好:“我曾经反对使用Node来提供静态文件的每个客观原因都围绕着使用您最了解的知识或使用经过更好测试/更稳定的知识的想法。这些都是非常合理的原因实际上,但是几乎没有技术上的关联。” 如今,太多的比较是有偏见的,是基于对次等但经过时间考验的技术的经验和舒适度的负担。
2015年

是的,但它们确实是/主观/原因。客观原因的一个很好的例子是基准测试-我发现其中大多数表明nginx> nodejs(尽管我确实应该自己做……)
Nick

@尼克你是完全正确的。尽管我不是科学基准测试专家,但这里还是有一些人,所以我会让人们在网上搜索。我要说的是,我认为使用一台服务器而不是两台服务器的简单性是有好处的。出现问题的可能性较小。在另一方面,Nginx的通常对每一个类Unix具有良好的配置系统,而与节点,你需要弄清楚的整合与包装systemdpm2等等。因此,有优缺点,用户应该挑选自己的毒药,可以这么说。

我认为是相反的-节点在负载下会更好(也许不是以纯粹的卸载速度),因为它不必为每个请求移交为文件提供服务的进程,而是可以在本地磁盘或本地磁盘上推送数据远程客户端与其他所有数千个客户端都在同一线程上就绪。当您有多处理器时,这当然会崩溃。除非节点现在知道如何使用它们。或者Web服务器现在可以使用共同多任务处理服务器最多静态页面..
杰拉德·奥尼尔

1

一个额外的功能:如果您需要反向代理,例如在同一端口上执行Websocket服务器,或者混合使用某些技术(用NodeJS响应某些请求,用PHP响应某些其他请求,等等),这也很重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.