我什么时候应该切换到NGinx?


11

我有一台运行着多个域和应用程序的服务器,所有这些都通过Apache运行。目前一切都很好,但我计划开发一些性能非常密集的Web应用程序(将C ++与CPPCMS结合使用),从我的服务器开始进行测试,也许准备就绪后仅为此应用程序购买一台单独的服务器。

无论如何,我已经听到了很多有关NGinx的信息,它似乎比Apache更具性能,所以我问自己是否值得在新项目中使用它。我不清楚,因为我不知道NGinx究竟能解决什么样的性能瓶颈。

我不是Apache超级用户,我不是一个可怜的linux管理员,并且我不太开发Web应用程序(但是我有想法)。我主要致力于编写软件,因此Web服务器部分有时对我来说很晦涩。每次我必须通过apach配置网站时,我都需要花费大量时间浏览文档以确保不会破坏所有内容。

话虽如此,我想我在这方面会进步很多,但仍然需要建议。我已经看到了一些Nginx配置文件,这似乎比Apache的文件更容易理解,但也许我错了?

根据我收集的信息,当您想要负载平衡时,NGinx将是最佳选择,因此,如果您的应用程序分布在多台计算机上,对吗?当我在考虑用于缩放(和性能)的应用程序时,看起来这是我所需要的,但是也许我需要了解有关何时从Apache迁移到NGinx的有趣信息。我当前所有的应用程序都值得切换到NGinx吗?它要多少钱?(我的意思是,从一个时间切换到另一个时间是否昂贵?)是否可以在同一台计算机上同时使用Apache和NGinx而不会出现任何问题?

旁注:请不要敦促我使用解释语言而不是C ++,这与问题无关。请参阅CPPCSM基本原理页面,以了解哪种应用程序可以从中受益。我完全理解它的缺点(与Ruby和Python中的应用程序相比,我已经在使用那些耗电较少的Web应用程序了),我对此表示满意。

Answers:


10

几点:

Apache和Nginx或Lighttpd(我个人非常喜欢)之间的主要区别是架构:

  1. Apache为每个进程或每个线程处理一个连接(取决于mod-XYZ)
  2. Nginx和Lighttpd是单线程处理单个事件循环中的多个连接。

结果是:

  1. Nginx和Lighttpd在大量同时连接的情况下可扩展性更好,假设有1000个连接,Apache几乎要死了,因为它需要在mod-prefork中使用1000个进程或在mod-worker中使用1000个线程。

    如果您打算使用Comet技术,其中每个连接都需要长时间轮询HTTP连接,那么Apache将无法接受,因为它无法很好地扩展。

  2. Nginx和Lighttpd消耗的内存更少,因为每个连接都需要+-两个套接字(HTTP和FastCGI),中间内存缓冲区和某些状态,而Apache需要整个线程,包括堆栈和其他东西。

根据我在基准测试中的个人经验,我使用FastCGI后端完成了Lighttpd(我也假设使用Nginx)要快于Apache,但这是为了减少连接量。

现在还有一点是,当您想使用FastCGI连接进行一些负载平衡时。

在传统建筑中

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

因为Apache处理进程池,每个进程都运行mod-PHP(或其他模式)

当您使用CppCMS自己处理池时,您可以做一些不同的事情:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

因此,基本上,您不需要另一个间接级别,因为CppCMS为您处理进程,线程和连接池。而PHP / Ruby / Perl需要一些Apache mod-XYZ或处理自己的FastCGI连接器。


+1 CppCMS的作者很好的完整解释;)好的,现在我看到了整体问题。因此,如果我正确理解的话,您只有一台服务器(开始时)的情况是HTTP-> Balancer-> FCGI-> CPPCMS?您如何看待Jesper Mortensen评论中的建议,说FastCGI并不快?
克莱姆2011年

@Klaim:看一下上面的出色图纸-在这种体系结构中,FastCGI用作多个服务器之间的互连,每个服务器运行一个多线程CppCMS实例。在这种情况下,FastCGI的相对速度影响不大。您可以选择的HTTP,AJP和其他网络协议也不是“快速”的。该答案可能应该标记为已接受,并且您的问题已被编辑,因为这与nginx何时值得一并无关。
Jesper M

@Jesper Mortensen>我同意,但是您对这个问题有何建议?
克莱姆2011年

6

通常,非常(非常)地说,Nginx 可以获得比Apache高得多的吞吐量,这要归功于采用不同的体系结构方法来将页面提供给Web。Nginx也主要是作为反向代理构建的,它可以很好地填补该角色(这是您提到的负载平衡位);另一方面,Apache是​​为服务网页而构建的,后来又具有代理功能。

也就是说,几乎可以肯定的是,Apache在某些方面将始终优于Nginx,而在其他方面,Nginx将始终在性能方面优于Apache。

简短的答案是,如果Apache为您工作,则无需切换。(我是说这是以前的Apache用户,已经成为Nginx的完全转换门徒。)只有当到您服务器的流量开始达到Apache成为瓶颈的水平时(这大约是数千个同时连接的顺序,但是根据您的服务器规格和其他服务器负载的不同会有很大差异),或者如果您试图在资源贫乏的环境中运行Apache(几乎无法容纳Apache),切换到Nginx确实会给您带来很多好处。

就是说,如果您想切换到Nginx(我鼓励这样做),那就去吧。您会看到任何好处吗?10次​​中有9次:不,您不会。但是您提到您更喜欢Nginx的配置文件语言,因此,如果让您比Apache更舒适地配置Nginx,那对您来说一个好处!(就我个人而言,我发现Apache配置通常更易于阅读,但这可能是因为我花了很多年阅读它们,而在Nginx上只花了短短的几个月!)

附带说明:您提到了用C ++构建Web应用程序的愿望。为了您的理智,我强烈建议您改用PHP,Python甚至Java之类的高级语言。然后分析您的代码,并考虑创建基于C ++的模块来解决特定的瓶颈(Python和PHP都允许这样做,而Java则不了解)。如果您担心整体性能,请考虑以下问题:EVE Online是世界上最大的未分片MMORPG,它基于Python的变体(无堆栈Python)构建,只有关键组件(例如图形库)用C ++编写。如果Python可以解决这个问题,那么它肯定可以处理您的Web应用程序吗?


+1谢谢。关于C ++,请参阅我对Jesper Mortensen答案的评论。同样,即使Eve Online(我对此非常了解)服务器端使用了Python,但它仅管理游戏代码(很大),而其他一些部分实际上是C ++。图形代码在客户端,因此对于此类图形性能,C ++也是必需的。正如我所说,请参阅CPPCMS基本原理页面,了解我为什么选择它。如果我愿意听取您的建议,我将不得不编写两次应用程序,而我已经知道它非常耗电。另外,我了解缺点,对此我也很好。
克拉姆

3

没有人能真正回答“何时切换”部分,这取决于您的负载,您自己的应用程序代码的性能等。

NGinx,似乎比Apache性能更高

nginx使用单个进程(或很少数量的工作进程)来处理所有使用事件I / O的客户端连接。Apache有几个可用的“多处理模块”,但是它们都更倾向于许多进程/许多线程。结果,对于基本的HTTP连接处理,Apache通常会比nginx消耗更多的RAM和CPU。您可以在Kegel的C10K页面上获得有关不同连接处理方法的概述。

性能非常密集的Web应用程序(将C ++与CPPCMS一起使用)

强烈建议考虑使用高级语言(Python或Ruby,Scala)来做基本的Web应用程序,并使用消息队列将工作票发送到异步处理“性能密集型”任务的工作机。

想要进行负载平衡时,NGinx将是最佳选择,

nginx是一个很好的负载平衡器;但是在这个领域许多选择

我可以在同一台机器上同时使用Apache和NGinx吗?

是。只需在不同的IP端口号和/或IP地址上运行它们即可。


“我强烈建议考虑使用高级语言来开发基本的Web应用程序”>我并不是说这是基本的Web应用程序-甚至都不是琐事。如果您了解使用CPPCMS的基本原理,那么笔者在少数情况下可能会有用,我本人就是其中。我考虑过其他选择,但发现它们比使用C ++昂贵,至少在我正在编写的Webapp中是如此。因此,这不是问题的一部分。但我理解您的建议,并向询问我是否应该将C ++用于Web应用程序的人们提供相同的建议。我还计划将Python用于另一个更简单的应用程序。
克拉伊姆2011年

无论如何,详情请+1。
克莱姆2011年

@Klaim:如果您希望通过经过良好调整的C#/ Java实现实现声称的“数量级”性能改进,那么请看是否可以在Web服务器上运行CppCMS和应用程序代码-即作为插件nginx / Apache。CppCMS页面似乎将FastCGI显示为Web服务器和CppCMS之间的连接。实际上FastCGI并不...很快。
Jesper M,

>有趣的想法。周围的大多数建议是,您应该使用fastcgi,因为它比其他方法快。我会检查是否可以执行此操作,也许可以和CPPCMS的作者一起查看为什么他认为这是最快的。
克莱姆2011年
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.