当前位置: 首页>>技术问答>>正文


Nginx与Apache – 那里有任何实际的使用比较和统计吗?

webfans 技术问答 , , , 去评论

问题描述

我有一个新的服务器,我正盯着一块空白的画布。我可以放任何我想要的东西。虽然我对Apache感到满意,但我一直听说nginx如何处理比Apache更多的流量,因为10,100甚至更多。不仅如此,它“快得多”。

当我搜索文章时,我可以找到许多与Drupal无关的东西。或者,当我遇到Drupal相关文章时,它是1)某人的配置文件,快速尝试解释如何设置它,或者2)有人说“不,不要使用nginx,请使用Apache与PHP一起使用fcgid“但是从来没有解释为什么。

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

作为一个例子,我正在寻找这条2bits.com文章的内容。在这里,作者使用fcgid对Apache mod_php与Apache进行了相当广泛的研究,权衡了各自的优缺点,并提供了一个案例研究来说明现实世界中的影响。本文中有足够的信息让我做出明智的决定,了解哪种方法最适合我的情况。

虽然该作者将mod_php与fcgid进行了比较,但我正在寻找与Apache vs Nginx相同类型的全面,现实世界的外观。

任何人都转而使用Nginx,并且与Apache相比,它与”blown away”有所不同?即使对于已经使用APC,Memcache和Varnish等积极缓存的高度优化环境,当唯一变化的变量正在用Nginx取代Apache时,确实会产生足够的差异,值得投资这种更新的替代技术?

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

最佳解决办法

严格来说,这并不能回答你提出的问题。无论如何,我希望它有用。

Apache /Nginx /Lighttpd /其他Web服务器。我选择哪一个是否重要?简而言之,没有。

答案要长得多:

如果且仅当您的用户中有很大一部分用户登录时,您是否应该关注Web服务器的性能。如果您的用户是匿名的,那么理论上您可以从优化该层次的绝对值得到的任何差异与使您的资源更好地缓存相比。如果您的css文件上有适当的缓存标头,UA甚至不会第二次请求它们。这很重要。如果您可以使用Varnish或类似的软件解决方案缓存页面,那么提供该页面就是制作hash-lookup,然后直接从RAM返回大量数据。这很重要。在这两种情况下,甚至都不涉及HTTP守护进程,不会调用PHP。 Drupal没有引导。不必将大量模块加载到RAM中,不会执行耗时的数据库查询。

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

为了论证:假设你花了很多时间来优化其他一切。

  1. 您运行APC(或Optimizer+)以及最新和最快的PHP版本。

  2. DB-queries很少。

  3. PHP逻辑已经减少了。

  4. 你可以在Varnish中缓存你的东西。

  5. 您有re-structured整个站点,这样您就可以缓存很多客户端,并在ECMAScript中进行大量繁重的工作。

如果您有大量登录用户,并且已经处理了上述所有内容,那么您可能会有所作为,但性能调整或更换您的Web服务器。但是,猜猜是什么。您的网站非常复杂,特定用户的使用模式也是独一无二的。没有通用的答案。您需要在负载均衡器后面设置所有不同的Web服务器,并在您的方案中查看它们的行为方式。

以上是尝试从逻辑上得出结论,花时间性能优化Web服务器可能是一个不好的时间使用。我希望有人在上面挖洞,但我可能会从中学到新东西。 🙂

其他一些说明:

  1. DrupalCon Copenhagen keynote期间,PHP创建者Rasmus Lerdorf,使用Nginx本人,谈论Drupal性能的主题,说“人们总是问我关于Web服务器……它真的没关系,Web服务器几乎无关紧要”。 (大约在视频中的26:30)

  2. Facebook花了不少时间编写Hiphop,这是一个比Drupal本身大得多的代码库,用于通过”measly” 100%加速PHP-code。我用$ wc -l $(find . -type f | grep -v "^\.git" | grep -v "^\.hphp/third_party") | sort -nr | head -n1检查了Hiphop,发现它由1.512.481行代码组成。这对于提高PHP的速度来说是一项绝对疯狂的工作量。我猜这是因为PHP的速度对他们很重要。

  3. 我是否提到良好的缓存会对调整Web服务器产生更大的影响?

  4. 随着Apache 2.4,Jim Jagielski basically claims that Apache 2.4 is faster than event based servers的发布。

  5. 我关注了Drupal Performance and Scalability with The Dream Team,这个问题就出现了。所有选择的答案都与表现无关。诸如“您已经知道如何配置哪一个”以及“哪一个将允许您构建最简单的技术堆栈”之类的事情,是提到的另一个原因之一。表演没有进入画面。

次佳解决办法

好吧,虽然这个问题已经得到解答,但我再次狡猾,主要是因为我不喜欢这些答案的含义,它没有什么区别,因为作为一名网络开发者,我讨厌激情缓存。

Apache和nginx之间的区别并不是“它们能够以多快的速度提供请求”,而是它们可以在相同数量的硬件上提供多少请求(特别是有限的资源),这有点不同。

Apache是​​一个process-based服务器。这意味着它为每个请求分配一个进程。 Nginx是一个基于事件的服务器,意思是使用(异步)event-loop而不是进程或线程。

虽然process-based服务器(如Apache)在轻负载下可以与异步event-based服务器(如nginx)或多或少相同,但在较重的负载下,例如10’0000个并发请求,nginx只使用几兆字节的RAM,而Apache只需要几百兆字节的Web服务器(不包括Web应用程序,它需要更多的资源本身),如果它可以完成它。

因此,在负载较重的情况下,您会发现Apache消耗的RAM过多,这无疑会显著降低性能。

更重要的是,更高的RAM消耗意味着Apache能够在与nginx相同的硬件上提供更少的请求,这意味着Apache需要更多硬件用于相同数量的用户,这意味着您拥有更高的TCO(总拥有成本)使用Apache而不是使用nginx,这会降低您的投资回报率(投资回报率)。

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

performance,apache,nginx,drupal

可以在1组硬件上的X并发连接上每秒提供的请求(越多越好)

performance,apache,nginx,drupal

来源:ApacheBench,来自dreamhost.com

另请参见this digital ocean writup。显然,它取决于您为Apache选择的连接处理架构。

第三种解决办法

几个月前我从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的力量是cache system

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

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’s configuration Nginx for Drupal

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2724.html,转载请务必附带本地址声明。