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

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

我有一台服务器,上面运行着多个域和应用程序,全部通过 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 应用程序),但我对此很满意。

答案1

几点:

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

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

答案2

Nginx,说话非常(非常) 通常,由于采用不同的架构方法来解决向 Web 提供页面的问题,因此可以获得比 Apache 更高的吞吐量。Nginx 也主要作为反向代理构建,并且它非常出色地扮演了这一角色(这是您提到的负载平衡位);另一方面,Apache 是为提供网页而构建的,后来获得了代理能力。

也就是说,几乎可以肯定的是,在某些领域 Apache 的表现将持续优于 Nginx,而在其他领域,Nginx 的表现也将持续优于 Apache。

简短的回答是,如果 Apache 适合您,则无需切换。(我是以一名前 Apache 用户的身份说这番话,现在已完全转变为 Nginx 信徒。)只有当您的服务器流量开始达到 Apache 成为瓶颈的水平时(这大约是数千个同时连接的数量级,但会根据服务器规格和其他服务器负载而有很大差异),或者如果您尝试在资源匮乏的环境中运行 Apache,Apache 几乎无法适应,切换到 Nginx 才能为您带来切实的好处。

话虽如此,如果你想切换到 Nginx(我确实鼓励这样做!),那就去做吧。你会看到任何好处吗?十有八九:不会。但你提到你更喜欢 Nginx 的配置文件语言,所以如果你觉得配置 Nginx 比配置 Apache 更舒服,那么,对您有好处!(就我个人而言,我发现 Apache 配置总体上更容易阅读,但这可能是因为我花了很多年阅读它们,而只在 Nginx 上花了短短几个月的时间!)

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

答案3

没有人能够真正回答“我应该何时切换”这个问题——这取决于您的负载、您自己的应用程序代码的性能等。

NGinx,似乎比 Apache 性能更好

nginx 使用单个进程(或极少数工作进程)通过事件驱动 I/O 处理所有客户端连接。Apache 有多个“多处理模块”可用,但它们都更倾向于多进程/多线程。因此,Apache 在基本 HTTP 连接处理方面通常会比 nginx 消耗更多的 RAM 和 CPU。您可以在此概览不同的连接处理方法Kegel 的 C10K 页面

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

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

当你需要负载平衡时,NGinx 是最佳选择,

nginx 是一个很好的负载均衡器;但是这个空间里有很多选择

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

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

相关内容