以下是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进程数的上限?
如果有人可以从这个晒单中获得启发并变得幸福,我会很高兴。