Nginx与Apache-那里有实际的使用情况比较和统计信息吗?


45

我有一个要使用的新服务器,并且我盯着一块空白的画布。我可以在上面放任何东西。在对Apa​​che感到满意的同时,我不断听到nginx如何处理比Apache多得多的流量,其系数是10、100甚至更多。不仅如此,它“快得多”。

当我搜索文章时,我会发现很多与Drupal无关的东西。或者,当我确实遇到与Drupal相关的文章时,要么是1)某人的配置文件试图快速解释如何设置它,要么是2)某人说“不,不要使用nginx,将Apache与PHP一起使用” fcgid”,但从来没有解释原因。

那么,当谈到Drupal时,这里的现实是什么?

例如,我正在寻找与此2bits.com文章类似的东西。在这里,作者对Apache mod_php与带有fcgid的Apache进行了广泛的比较,权衡了它们的优缺点,并提供了一个案例研究来说明对现实世界的影响。本文中有足够的信息供我做出明智的决定,以决定哪种方法最适合我的情况。

虽然该作者将mod_php与fcgid进行了比较,但我正在寻找对Apache vs Nginx进行相同类型的全面,真实的研究。

是否有人切换到Nginx并被它与Apache的区别“吹牛”?即使对于已经使用APC,Memcache和Varnish之类的主动缓存的高度优化的环境,当唯一变化的变量是用Nginx替换Apache时,其本身也确实会产生很大的差异,值得投资这种新的替代技术?

将在该服务器上运行的网站每月平均可获得200万PV。运行Cent OS 6的LAMP堆栈。4核CPU,8 GIGS内存。Memcached和APC将成为其中的一部分。Drupal安装没什么特别的-基本上是Vanilla 7,带有大约50个模块。


2
如果要调整特定站点的性能,最好不要运行自己的测试,而要依靠其他人的工作。例如,匿名用户与已登录用户的混合是一个主要因素。如果您查看主要来自匿名流量的网站的性能统计信息,而您的情况并非如此,那么您最好也不要打扰。但是,如果您的站点确实存在大量匿名流量,那么根据我的经验,将Varnish置于Web服务器的前面将比您在其后面运行的服务器产生更大的影响。
阿尔弗雷德·阿姆斯特朗

Answers:


60

严格来说,这不能回答您要问的问题。无论如何,我希望它会有所帮助。

Apache / Nginx / Lighttpd /其他Web服务器。选择哪一个有关系吗?简而言之,没有

更长的答案:

如果且仅,如果您完全关心Web服务器的性能,则有很大一部分用户正在登录。如果您的用户是匿名用户,则从理论上讲,通过优化该层所产生的任何差异与使资源更好地可缓存相比,绝对是微不足道的。如果您的css文件上具有正确的缓存头,则UA甚至不会第二次要求它们。那很重要。如果您可以在Varnish或类似的软件解决方案中缓存页面,则为该页面提供服务就是进行散列查找,然后直接从RAM返回大量数据。那很重要。在这两种情况下,都不会涉及HTTP守护程序,也不会调用PHP。Drupal不引导。无需将大量模块加载到RAM中,无需执行耗时的数据库查询。

当您从冷缓存中为登录用户在复杂页面上执行完整页面加载时;发生了很多事情。是的,Web服务器参与处理传入的请求,设置一些标头并将响应传递回去。但是,在Drupal运行完整的引导程序并输出其响应的情况下,所花费的时间甚至不相关。可能有数百个数据库查询正在执行。PHP中高度复杂的逻辑由解析器评估。许多模块正在加载到RAM中。改善其中任何一项的性能,很可能会对性能做出重大贡献。

为了争辩:假设您花了很多时间优化其他所有性能。

  1. 您运行APC(或Optimizer +)和最新最快的PHP版本。
  2. DB查询很少。
  3. PHP逻辑已减少。
  4. 您可以在Varnish中缓存所有内容。
  5. 您已经重新构建了整个网站的结构,以便可以缓存很多客户端,并在ECMAScript中进行了大量繁重的工作。

如果您有很多登录用户,并且已经处理了上述所有内容,那么您可能可以有所作为,但可以进行性能调整或替换Web服务器。但是,猜猜是什么。您的网站是如此复杂,并且特定用户的使用模式是唯一的。没有通用答案。您将需要在负载均衡器后面设置所有不同的Web服务器,并在您的方案下查看它们的行为。

以上是试图从逻辑上得出结论,即花费时间性能优化Web服务器可能会浪费时间。我很乐意让某人在上述内容中有所作为,我可能会从中学到一些新东西。:)

其他注意事项:

  1. DrupalCon哥本哈根主题演讲中,PHP创建者Rasmus Lerdorf使用Nginx亲自谈到了Drupal性能的话题,他说:“人们总是问我有关Web服务器的信息……这没关系,Web服务器几乎无关紧要”。 。(大约在视频中的26:30)
  2. Facebook已经花了无数时间来编写Hiphop(一种比Drupal本身要大得多的代码库),以“仅” 100%地加速PHP代码。我检查了Hiphop,$ wc -l $(find . -type f | grep -v "^\.git" | grep -v "^\.hphp/third_party") | sort -nr | head -n1发现它包含1.512.481行代码。那是提高PHP速度的绝对疯狂的工作。我猜这是因为PHP的速度对他们至关重要。
  3. 我是否提到过,良好的缓存将比调整Web服务器产生更大的影响?
  4. 随着Apache 2.4的发布,Jim Jagielski基本上声称Apache 2.4比基于事件的服务器要快
  5. 我曾与The Dream Team接触过Drupal的性能和可伸缩性,只是这个问题出现了。选择的所有答案与性能无关。上面提到的理由之一包括诸如“您已经知道其中一个如何配置”和“哪一个将允许您构建最简单的技术堆栈”之类的东西。表现并没有进入画面。

4
不要忘记CDN,以防止绝大多数CSS,JS和图像请求到达Web服务器。
mpdonadio

好点!我认为我必须在某个时候重写drupal.stackexchange.com/questions/24180/…。关于Apache / Nginx的讨论似乎不是构建性能优化的全面列表的最佳位置。
Letharion

1
这是一个很好的答案。只是一个小问题:不应互换使用“ ECMAScript”和“ JavaScript”。除了ECMAScript,JavaScript还有很多其他功能。

您是说缓存远远比Web服务器的速度重要。你猜怎么了?如果一个Web服务器使用的内存少于另一个,则可以使用更多的RAM进行缓存。因此,可以说,正确调整Web服务器重要,这样它才不会占用所有RAM,对吗?
pqnet 2014年

调整服务器以使用较少的RAM绝对可以,但是如果您尝试进入高性能领域,则可能会在专用服务器上运行varnish,因此您的http服务器和缓存将不会争用相同的内存。
Letharion 2015年

32

好的,尽管这个问题已经回答了,但我还是要重新讨论一下,主要是因为我不喜欢这些答案的含义,因为它没有任何作用,而且因为作为Web开发人员,我不喜欢缓存。

Apache和nginx之间的区别不是“它们可以为请求服务的速度有多快”,而是它们可以在相同数量的硬件上(特别是资源有限的情况下)可以满足多少个请求,这是有些不同的事情。

Apache是​​基于进程的服务器。意思是它为每个请求派生一个进程。Nginx是基于事件的服务器,这意味着它使用(异步)事件循环而不是进程或线程。

尽管基于进程的服务器(如Apache)在轻负载下可以与基于异步事件的服务器(如nginx)在性能上有所不同,但在较重的负载(例如10'0000同时请求)下,nginx仅使用了少数几个如果需要的话,Apache仅需要一个Web服务器(不包括需要大量资源本身的Web应用程序)就需要数百MB的RAM(不包括Web应用程序)。

因此,在较重的负载下,您将看到Apache消耗过多的RAM,这毫不奇怪地会显着降低性能。

更重要的是,较高的RAM消耗意味着Apache在同一个硬件上能够比nginx处理更少的请求,这意味着Apache在相同数量的用户上需要更多的硬件,这意味着您拥有更高的总拥有成本(总拥有成本)与使用Nginx相比,使用Apache可以减少投资回报率。

X并发连接使用的总内存(越少越好)

内存使用情况

可以在一组硬件上的X个并发连接上每秒处理的请求(越多越好)

每秒请求

资料来源:ApacheBench,由dreamhost.com提供

另请参阅此数字海洋写作。
显然,这取决于您为Apache选择的连接处理体系结构。


6
您用“ ...打了钉子”。不是它们可以满足一个请求的速度,而是它们可以在相同数量的硬件上满足的请求数量...”的确,我最终希望获得最大的收益。给定一台具有完全相同的硬件和其他变量的机器,如果我每天可以使用nginx为1,000,000个用户提供服务,而apache只能为200,000个用户提供服务,那么从成本角度来看,最好的选择当然是nginx。给定某种硬件配置,与apache相比,您是否可以看到nginx可以做什么?
blue928 2013年

2
当前版本的Apache 2.4具有基于事件的模型:httpd.apache.org/docs/current/mod/event.html
Greg

1
另外,对于那些说这没关系的人来说,因为“只要您缓存东西就可以了”:您知道需要做什么缓存吗?您需要免费的RAM。
pqnet 2014年

我经常看到这些关于“ Nginx更令人敬畏”的一般说法,但是,我很少(从来没有?)看到有人用确凿的证据来证明这一点。它始终是“我的高配置nginx实例击败了股票apache服务器,所以现在我证明自己很酷,因为我像其他酷孩子一样使用nginx”。就我所知,Nginx可能比Apache好得多,但是我还没有看到有人真正证明过这种情况。
Letharion 2015年

@Letharion:完成(由dreamhost.com完成),并根据您的要求添加。正如您可以在此基准测试结果中看到的那样,nginx显然具有更高的内存效率。也可能是这样:我的stock-nginx-instance在同一台计算机上的同一基准上击败了我的stock-Apache-instance。
困惑

16

我几个月前从Apache切换到Nginx / PHP-FPM。

我在一个drupal网站上做了一些基准测试,并测试了几个用例。在具有1个CPU和512 Mo RAM的VPS服务器上

仅缓存的Drupal

Nginx的

ab -n 100 -c 30 xxx
Server Software:        nginx
Document Path:          /
Document Length:        24902 bytes

Concurrency Level:      30
Time taken for tests:   2.775 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      2529500 bytes
HTML transferred:       2490200 bytes
Requests per second:    36.04 [#/sec] (mean)
Time per request:       832.394 [ms] (mean)
Time per request:       27.746 [ms] (mean, across all concurrent requests)
Transfer rate:          890.28 [Kbytes/sec] received


httperf --client=0/1 --server=xxx --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
Maximum connect burst length: 1

Total: connections 100 requests 1000 replies 1000 test-duration 48.946 s

Connection rate: 2.0 conn/s (489.5 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 470.6 avg 489.5 max 522.2 median 488.5 stddev 9.5
Connection time [ms]: connect 0.2
Connection length [replies/conn]: 10.000

Request rate: 20.4 req/s (48.9 ms/req)
Request size [B]: 74.0

Reply rate [replies/s]: min 20.0 avg 20.4 max 20.8 stddev 0.2 (9 samples)
Reply time [ms]: response 46.8 transfer 2.1
Reply size [B]: header 450.0 content 24902.0 footer 2.0 (total 25354.0)
Reply status: 1xx=0 2xx=1000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 6.50 system 17.58 (user 13.3% system 35.9% total 49.2%)
Net I/O: 507.3 KB/s (4.2*10^6 bps)

阿帕奇

ab -n 100 -c 30 xxx
Server Software:        Apache/2.2.16
Document Path:          /
Document Length:        24902 bytes

Concurrency Level:      30
Time taken for tests:   28.364 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      25346000 bytes
HTML transferred:       24902000 bytes
Requests per second:    35.26 [#/sec] (mean)
Time per request:       850.918 [ms] (mean)
Time per request:       28.364 [ms] (mean, across all concurrent requests)
Transfer rate:          872.66 [Kbytes/sec] received


httperf --client=0/1 --server=xxx --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
Maximum connect burst length: 1

Total: connections 100 requests 1000 replies 1000 test-duration 52.261 s

Connection rate: 1.9 conn/s (522.6 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 499.0 avg 522.6 max 591.0 median 518.5 stddev 19.4
Connection time [ms]: connect 0.6
Connection length [replies/conn]: 10.000

Request rate: 19.1 req/s (52.3 ms/req)
Request size [B]: 74.0

Reply rate [replies/s]: min 18.2 avg 19.2 max 19.6 stddev 0.5 (10 samples)
Reply time [ms]: response 46.9 transfer 5.3
Reply size [B]: header 453.0 content 24902.0 footer 2.0 (total 25357.0)
Reply status: 1xx=0 2xx=1000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 6.80 system 18.88 (user 13.0% system 36.1% total 49.1%)
Net I/O: 475.2 KB/s (3.9*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

具有缓存和增强功能的Drupal

Nginx的

ab -n 10000 -c 30 xxx
Server Software:        nginx
Document Path:          /
Document Length:        25002 bytes

Concurrency Level:      30
Time taken for tests:   2.275 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      253780000 bytes
HTML transferred:       250020000 bytes
Requests per second:    4395.52 [#/sec] (mean)
Time per request:       6.825 [ms] (mean)
Time per request:       0.228 [ms] (mean, across all concurrent requests)
Transfer rate:          108934.95 [Kbytes/sec] received


httperf --client=0/1 --server=xxx --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --num-conns=1000 --num-calls=30
Maximum connect burst length: 1

Total: connections 1000 requests 30000 replies 30000 test-duration 5.971 s

Connection rate: 167.5 conn/s (6.0 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 4.2 avg 6.0 max 13.0 median 4.5 stddev 2.6
Connection time [ms]: connect 0.1
Connection length [replies/conn]: 30.000

Request rate: 5024.0 req/s (0.2 ms/req)
Request size [B]: 74.0

Reply rate [replies/s]: min 5017.2 avg 5017.2 max 5017.2 stddev 0.0 (1 samples)
Reply time [ms]: response 0.2 transfer 0.0
Reply size [B]: header 405.0 content 25002.0 footer 0.0 (total 25407.0)
Reply status: 1xx=0 2xx=30000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.79 system 2.56 (user 13.2% system 42.9% total 56.1%)
Net I/O: 125016.7 KB/s (1024.1*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

阿帕奇

ab -n 1000 -c 30 xxxx
Server Software:        Apache/2.2.16
Document Path:          /
Document Length:        25002 bytes

Concurrency Level:      30
Time taken for tests:   0.753 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      25291000 bytes
HTML transferred:       25002000 bytes
Requests per second:    1327.92 [#/sec] (mean)
Time per request:       22.592 [ms] (mean)
Time per request:       0.753 [ms] (mean, across all concurrent requests)
Transfer rate:          32797.26 [Kbytes/sec] received


httperf --client=0/1 --server=xxx --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
Maximum connect burst length: 1

Total: connections 100 requests 1000 replies 1000 test-duration 1.148 s

Connection rate: 87.1 conn/s (11.5 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 6.2 avg 11.5 max 14.1 median 11.5 stddev 1.3
Connection time [ms]: connect 0.1
Connection length [replies/conn]: 10.000

Request rate: 870.8 req/s (1.1 ms/req)
Request size [B]: 74.0

Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 1.1 transfer 0.1
Reply size [B]: header 260.0 content 25002.0 footer 0.0 (total 25262.0)
Reply status: 1xx=0 2xx=1000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.13 system 0.57 (user 11.1% system 49.5% total 60.6%)
Net I/O: 21544.9 KB/s (176.5*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

认证用户的基准(页面加载)

Nginx的

Page load times : 2.85 s

阿帕奇

Page load times : 5.4 s

但是Nginx的强大之处在于缓存系统

启用Boost和Nginx且启用了缓存系统的Drupal

Server Software:        nginx
Document Path:          /
Document Length:        24902 bytes

Concurrency Level:      30
Time taken for tests:   2.437 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      252670000 bytes
HTML transferred:       249020000 bytes
Requests per second:    4103.34 [#/sec] (mean)
Time per request:       7.311 [ms] (mean)
Time per request:       0.244 [ms] (mean, across all concurrent requests)
Transfer rate:          101248.99 [Kbytes/sec] received


httperf --client=0/1 --server=xxx --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --num-conns=1000 --num-calls=30
Maximum connect burst length: 1

Total: connections 1000 requests 30000 replies 30000 test-duration 6.044 s

Connection rate: 165.5 conn/s (6.0 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 4.2 avg 6.0 max 11.7 median 4.5 stddev 2.6
Connection time [ms]: connect 0.1
Connection length [replies/conn]: 30.000

Request rate: 4963.7 req/s (0.2 ms/req)
Request size [B]: 74.0

Reply rate [replies/s]: min 4970.1 avg 4970.1 max 4970.1 stddev 0.0 (1 samples)
Reply time [ms]: response 0.2 transfer 0.0
Reply size [B]: header 405.0 content 25002.0 footer 0.0 (total 25407.0)
Reply status: 1xx=0 2xx=30000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.72 system 2.68 (user 12.0% system 44.3% total 56.3%)
Net I/O: 123516.8 KB/s (1011.8*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

您应该将perusio的配置 Nginx用于Drupal


Apache如何运行,预成型,FCGI等?运行这些测试时,Apache配置是否已尽可能优化?是否运行了完全相同的PHP环境?
mpdonadio

PHP(5.3)环境完全相同。Apache正在运行mpm_prefork,并且apache配置(maxclient,MaxSpareServers,MaxRequestsPerChild等)与PHP5-FPM完全相同
flocondetoile 2013年

4
这些数字不错,但我不确定它们是否是真正的比较。Apache + FastCGI与Apache + FCGI + PHPFPM与Nginx + PHPFPM可以更好地显示Apache和Nginx之间的差异。
mpdonadio

正如MPD所指出的,这不是真正的比较。您需要同时运行php-fpm才能得到真实的图片。

1
我认为Nginx是内存有限的VPS帐户的不错选择。因为它可以以比Apache更少的RAM占用空间舒适地运行-尤其是如果您卸载了不必要的模块-您还有剩余的RAM来运行操作码缓存(APC或PHP 5.5的内置OpCache),请使用MySQL / Postgres服务器守护程序是一个很大的缓冲区,而Letharion正确指出的其他优化也很重要。
加勒特·奥尔布赖特

0

这是针对十个Web服务器/变量(例如Apache,Nginx,lighttpd,Lightspeed,Hiawatha,Cherokee)的性能测试。其中三个测试与Drupal有关。

我认为Hiawatha可能是最好的总体选择。假定具有完全的Drupal兼容性,并强调安全性(DoS,XSS,CSRF,SQL注入预防),并且速度和占用空间类似于Nginx。

在三个Drupal测试中的两个中,Hiawatha和Nginx的性能都比Apache高出约150%,但是在Drupal静态测试中,Apache的性能比Nginx略胜一筹,而Hiawatha则比Nginx高出约10%。

我不会在任何这些测试上大惊小怪,但它确实为人们提供了在不同使用情况下的性能概览。我认为,仅性能不是唯一的考虑因素。稳定性和安全性可能是更重要的因素。


0

是在相同硬件上但在不同Web服务器上运行的drupal 的负载测试结果。(nginx和Apache)

这是该测试的结论:

在具有相同硬件资源的大量流量下,nginx的性能要比apache更好。

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.