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

Kla*_*aim 11 nginx apache-2.2

我有一个服务器,其中运行着多个域和应用程序,全部通过 Apache。目前一切都很好,但我计划开发一些非常性能密集型的 Web 应用程序(使用 C++ 和 CPPCMS),从我的服务器开始进行测试,也许一旦它准备好,可能会为这个应用程序获得一个单独的服务器。

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

我不是 Apache 高级用户,我是一个糟糕的 linux 管理员,我不怎么开发 Web 应用程序(但我有一些想法)。我主要致力于编写软件,因此网络服务器部分有时对我来说非常模糊。每次我必须通过 apach 配置网站时,我需要大量时间浏览文档以确保我不会破坏所有内容。

话虽如此,我认为我在这方面变得更好了,但仍然需要建议。我已经看到了一些 nginx 配置文件,这似乎比 Apache 的更容易理解,但也许我错了?

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

旁注:请不要催促我使用解释型语言而不是 C++,这与问题无关。请参阅CPPCSM 基本原理页面,了解可以从中受益的应用程序类型。我完全理解这些缺点(与 Ruby 和 Python 中的应用程序相比,我已经将它们用于耗电较少的 web 应用程序)并且我很满意。

Art*_*yom 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 需要整个线程,包括堆栈和其他东西。

根据我在基准测试中的个人经验,Lighttpd(我假设 Nginx 也是如此)使用 FastCGI 后端比 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
Run Code Online (Sandbox Code Playgroud)

因为 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
Run Code Online (Sandbox Code Playgroud)

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


Kro*_*mey 6

Nginx的,说话很(非常)一般,能够获得更高的吞吐量比Apache由于不同的架构方法来提供网页到网络的问题。Nginx 也主要是作为反向代理构建的,它非常好地扮演了这个角色(这是你提到的负载平衡位);另一方面,Apache 是为网页服务而构建的,后来获得了代理能力。

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

简短的回答是,如果 Apache 适合您,则无需切换。(而且我是作为一名前 Apache 用户说的,他已经完全转变为 Nginx 门徒。)只有当你的服务器的流量开始达到 Apache 成为你的瓶颈的水平时(这大约是数千个同时连接,但会因您的服务器规格和其他服务器负载而有很大差异),或者如果您尝试在资源贫乏的环境中运行 Apache,它几乎无法适应,切换到 Nginx 是否会给您带来可观的好处。

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

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