以下是PHPer分享在处理40万个页面访问量每小时时的Apache设置

这是Adventure Advent Calendar 2018的第12天的文章。(已追溯)

我是株式会社Adventure的成员。
由我负责管理航空票预订网站skyticket(スカイチケット),请多关照。

本月发布了PHP7.3,据说性能进一步提升,让人对PHP的热爱更加浓厚!

我对PHP非常着迷,但在之前的工作中,我也做过一些类似基础设施的工作。

这篇文章讲述了四年前的故事,尽管有些尴尬,但我决定公开那次每小时处理400,000次页面浏览(PV)的Apache设置。

希望这些调节的参考对你有所帮助,具体的调节方案会根据网站的情况而有所不同。但是,即使是这样的调节,希望也能稍微解决一些问题。

不要放弃Apache!

这次谈话将涉及到Apache。

由于备受欢迎的nginx的份额超过了30%,导致市场份额不断下降的Apache…但它仍然是一个完全可用的服务器哦!

关于prefork MPM的初始值

Apache 2.4系列的初始值如下所示。
Apache 2.2系列,则需将以下值替换为:
MaxRequestWorkers → MaxClients
MaxConnectionsPerChild → MaxRequestsPerChild

StartServers               5
MinSpareServers            5
MaxSpareServers           10
ServerLimit              256
MaxRequestWorkers        256
MaxConnectionsPerChild 10000

在Apache HTTP服务器2.4版本中,prefork被描述如下。

由于这个MPM非常自治,几乎不需要调整该MPM的设置指令。最重要的是确保MaxClients足够大以处理预期的并发请求数,但同时确保每个进程都有足够的物理内存,这是将MaxClients设置为较小值的关键。

不仔细理解的情况下,我随意修改了这个数值,这是一个美好的回忆。

实际上,当我理解要点的时候,对于每月数百万PV的PHP网站来说,可以在1GB内存的服务器上几乎使用默认设置来运行。

然而,如果仅有这么少的内存,MaxRequestWorkers在达到256之前就会出现问题,所以需要同时调整为合适的数值,并且还需要考虑到KeepAliveTimeout。

请确保没有误解,我提醒您不仅仅根据访问量来判断,还要综合考虑需求和体制等因素,来设计合适的服务器配置。

关于 KeepAliveTimeout。

保持连接 (KeepAlive) 的默认设置是“开启”(On)。除非有特殊情况,一般应保持设置为“开启”。接下来讨论的是保持连接超时时间(KeepAliveTimeout)。

KeepAliveTimeout的初始值为『5』。这意味着在持续连接中,服务器会等待下一个请求到来的时间,也就是说,进程会占用5秒钟。

即使这个进程已经不再使用了,它仍然会保持5秒钟的“居住状态”,并消耗相应的内存。

如果服务器的内存不足,可以尝试将KeepAliveTimeout设置为“2”,这样可以减少进程数,可能解决内存不足的问题。

如果减少KeepAliveTimeout反而导致进程数增加的情况下,请尝试寻找合适的值。

寻找MaxRequestWorkers的合适值。

首先,我们要调查可用的Apache内存总量(内存剩余容量)是多少。由于有一个易于理解的网站,所以请参阅该网站以获取详细信息。

【RHEL】图解Linux内存中的free和meminfo的关系,并解释使用率的计算方法。

接下来,我们将调查Apache的子进程占用多少内存。由于有一些易于理解的网站提供了详细信息,请参阅那里以获取更多详细信息。

考虑到内存共享部分,计算出Apache的内存使用量。

    • CentOS 7.6

 

    • Apache 2.4.35

 

    • PHP 7.3.0

 

    • MariaDB 10.2.20

 

    メモリ 1GB

在上述环境中,设置了一个小规模系统,并增加了进程进行测量,结果为
Apache(子进程)可用内存=570MB
进程占用的平均内存=3MB。

实际上,由于Apache并非完全可用,所以无法使用全部570MB。假设只能使用510MB。

510除以3等于170。

中国国家主席一号习近平也能喊出这样的数字。
tè yī xí yě chū de .)

在寻找MaxRequestWorkers合适的值时,这提供了一些指导。

揭示题目的设定

当时的设置是使用一台服务器处理了每小时40万个页面访问量。

    • CentOS 6.3

 

    • PHP 5.3

 

    • Apache 2.2

 

    メモリ 32GB
<IfModule prefork.c>
StartServers           30
MinSpareServers        20
MaxSpareServers        70
ServerLimit          5200
MaxClients           5200
MaxRequestsPerChild  4000
</IfModule>

KeepAliveTimeout 3

将MaxClients的值设为5200,但如果按照常规方式书写,会引起不满。

实际上,CentOS 6(RHEL6)的默认进程最大数(ulimit)设置为1024。(RHEL7的默认值为4096)

所以,需要进行ulimit的设置,但是有一个提供了简明解释的网站,有兴趣的话请详细阅读。

如何通过设置ulimit来增加httpd进程数的上限?

如果有人可以从这个晒单中获得启发并变得幸福,我会很高兴。

广告
将在 10 秒后关闭
bannerAds