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

我有一个服务器,运行几个域和应用程序,都通过Apache。 目前一切正常,但我计划开发一些性能密集的Web应用程序(使用C ++和CPPCMS),从我的服务器开始testing,一旦准备就绪,可能只会为此应用程序获取单独的服务器。

无论如何,我听说过很多关于NGinx的东西,似乎比Apache更高性能,所以我问自己是否值得为这个新项目工作。 我不清楚,因为我不知道NGinx究竟是在做什么样的性能瓶颈。

我不是一个Apache的高级用户,我是一个可怜的Linuxpipe理员,我不开发Web应用程序太多(但我有概念)。 我主要致力于编写软件,所以Web服务器部分有时对我来说是非常模糊的。 每次我必须通过apachconfiguration一个网站,我需要大量的时间浏览文档,以确保我不会破坏一切。

这就是说,我认为在这方面我已经变得更好了,但仍然需要build议。 我已经看到了一些nginxconfiguration文件,这似乎比Apache的更容易理解,但也许我错了?

从我收集的信息来看,当你想要负载平衡的时候,NGinx是最好的select,所以如果你的应用在多台机器上传播,对吧? 当我在考虑我的应用程序(和性能)时,它看起来就是我所需要的,但是也许我需要了解更多关于何时从Apache迁移到NGinx的更多信息。 是否值得切换到NGinx我所有的当前应用程序呢? 它要多less钱? (我的意思是,从一个切换到另一个是否很贵?)我可以在同一台机器上同时使用Apache和NGinx吗?

附注 :请不要催促我使用解释型语言而不是C ++,这与问题无关。 查看CPPCSM的基本信息页面 ,了解哪种应用程序可以从中受益。 我完全理解这些缺点(与Ruby和Python中的应用程序相比,我已经使用了功耗更低的web应用程序),而且我很好。

几点:

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消耗更less的内存,因为每个连接都需要两个套接字(HTTP和FastCGI),中间内存缓冲区和一些状态,而Apache需要整个线程,包括堆栈和其他东西。

从我个人在基准testing中的经验来看,我做Lighttpd(也是假设Nginx)的FastCGI后端稍微快一些,但是这对于less量的连接来说要快一些。

现在另外一点就是当你想用FastCGI连接做一些负载平衡的时候。

在传统build筑中有

| 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连接器。

Nginx通常说得非常( 非常 ),可以获得比Apache更高的吞吐量,这要归功于针对向网页提供页面的问题采用不同的架构方法。 Nginx也主要是作为一个反向代理构build的,并且它非常好地填充了这个angular色(这就是你提到的负载均衡位)。 另一方面,Apache是​​为网页服务而build立的,后来获得代理的能力。

也就是说,几乎可以肯定的是,Apache将会一直胜过Nginx,而Nginx的performance也会一直超越Apache。

简短的回答是,如果Apache为你工作,则不需要切换。 (而且我说这是一个以前的Apache用户,他已经成为了一个完全转换的Nginx门徒。)只有当到你的服务器的stream量开始达到Apache成为你的瓶颈的水平时(这是几千个同时连接的数量级,但会根据您的服务器规格和其他服务器负载而变化很大),或者如果您尝试在资源匮乏的环境中运行Apache,那么切换到Nginx是否会给您带来实实在在的好处。

这就是说,如果你想切换到Nginx(我鼓励!),然后去做。 你会看到任何好处吗? 9次10:不,你不会。 但是你提到你更喜欢Nginx的configuration文件语言,所以如果你觉得configurationNginx比Apache更舒服,那对你来说一个好处! (就我个人而言,我发现Apache的configuration一般来说更容易阅读,但这可能是因为我花了很多年阅读它们,只有短短几个月的时间花在了Nginx上!)

在旁边注意:您提到了您想用C ++构build一个Web应用程序的愿望。 为了您的理智,我强烈build议您改用PHP,Python甚至Java等更高级的语言。 然后分析你的代码,并考虑创build基于C ++的模块来解决特定的瓶颈(Python和PHP都允许这样做很容易;不知道Java)。 如果您担心整体性能,请考虑一下:EVE Online是世界上唯一最大的未加固的MMORPG,它build立在Python(Stackless Python)的变种上,只有用C ++编写的关键组件(例如graphics库)。 如果Python可以处理,肯定可以处理您的networking应用程序?

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

NGinx,这似乎比Apache更高性能

nginx使用单个进程(或者很less的工作进程)来处理所有使用均衡I / O的客户端连接。 Apache有几个“多处理模块”可用,但他们都更多地倾向于许多进程/multithreading。 因此,Apache通常会比基于HTTP连接处理的nginx消耗更多的RAM和CPU。 您可以在Kegel的C10K页面上了解不同的连接处理方法。

性能密集的Web应用程序(使用C ++和CPPCMS)

强烈build议考虑使用更高级别的语言(Python,或者Ruby,Scala)来执行基本的Web应用程序,并使用消息队列将工作票据发送给工作机器,这些工作机器asynchronous地处理“性能密集型”任务。

当你想要负载平衡的时候,NGinx是最好的select,

nginx是一个很好的负载均衡器; 但在这个领域有很多select 。

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

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