问题描述
当前在Ubuntu 14.04上的Apache 2(确切地说是Apache 2.4.7)上,我有以下设置:
/etc/apache2/mods-enabled/mpm_prefork.conf
<IfModule mpm_prefork_module>
StartServers 20
MinSpareServers 100
MaxSpareServers 250
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
该服务器是一台8GB(RAM)的Amazon服务器,只不过为某些Google广告系列加载了three-page注册表格。
我在网上找到了一个名为apachetuneit.sh的脚本,但过了一会儿Apache才报告此错误:
[2015年2月21日星期二16:45:42.227935] [mpm_prefork:错误] [pid 1134] AH00161:服务器已达到MaxRequestWorkers设置,请考虑提高MaxRequestWorkers设置
如何判断如何设置这些设置?
我仅在询问如何调整Apache 2.4,而没有其他要求。这就是为什么这个问题与this question不同的原因。
最佳办法
-
认识到Ubuntu 14.04使用通过mpm_prefork模块运行的PHP 2和Apache 2,该模块的可编辑文件在/etc/apache2/mods-enabled/mpm_prefork.conf中。另外,请注意,从Apache 2.4开始,MaxClients现在已重命名为MaxRequestWorkers,因此有关MaxClients的所有文档都需要切换到MaxRequestWorkers。
-
暂时使用以下命令停止Apache Web服务:
sudo service apache2 stop
-
等待5秒钟,然后运行以下命令来查找服务器上可用的虚拟内存量:
sudo free -ht
阅读Mem:行,并查看免费专栏。尽管我通常喜欢在功能更强大的服务器(如大于4GB)中减去2GB或在更轻便的服务器上减少1GB,但可以将其视为可以分配给Apache的RAM数量。因此,如果免费专栏说我有13GB的免费空间,我建议给Apache 11GB。那是基线。如果我们偶尔在日志中遇到任何数据库问题(例如在3天的时间里日志中有3次),则它需要更多的内存,那么我们可能会认为只有10GB可以玩,而不是11GB(在这种情况下) )。如果我们在Apache日志中遇到服务器需要更多MaxRequestWorkers的问题,那么这是我将在下面解决的另一个问题。
-
启动Apache Web服务器。
sudo service apache2 start
-
像打开10个浏览器选项卡一样打开,从您的网站连接到更长的页面或slower-loading,然后在每个选项卡上刷新3-4次。
-
之后,立即运行以下命令:
sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}'
快速运行5次。
查看“平均流程大小”值,然后将其平均5次运行。
现在进行以下数学运算,并确保根据需要将GB转换为MB,以便所有数字均以MB值表示。因此,乘以1024还是除以1024,这取决于您要走的路。
MaxRequestWorkers =无基线(具有缓冲区空间)/平均进程大小
例如,我有一台14GB的服务器,但是当Apache停止时,该服务器显示它在空闲状态下使用了1GB RAM。然后,我为操作系统提供了一些额外的1GB的额外缓冲空间,以备需要时使用。这意味着我将拥有12GB的免费基准。现在,我必须将其从GB转换为MB,因此我将12 x 1024乘以得到12288。12288MB是我的免费基准值。就我而言,我看到平均进程大小为21MB。因此,我采用12288/21,我得到大约585。现在,sysops将这个值四舍五入是很常见的,所以我得到580。
-
编辑文件/etc/apache2/mods-enabled/mpm_prefork.conf并考虑将其设置为以下默认值,用您的MaxRequestWorkers计算替换XXX:
`<IfModule mpm_prefork_module>`
StartServers 2
MinSpareServers 2
MaxSpareServers 5
MaxRequestWorkers XXX
ServerLimit XXX
MaxConnectionsPerChild 0
</IfModule>
请注意,您可能在此处看不到ServerLimit参数。添加它。如果不存在,则此参数默认为256,但必须与MaxRequestWorkers的值相同,否则会出现错误。
-
Apache配置中的另一个关键因素是带有Timeout变量的/etc/apache2/apache2.conf文件,以秒为单位。这是您可以在服务器超时之前从服务器发送或接收的时间。您还必须牢记文件上传或文件下载,例如,如果您有一个网站,人们可以在其中上传或下载CSV或其他大文件。并且您需要记住繁忙的数据库服务器,并且可能需要在页面超时之前提供一些时间。使Timeout变量越小,Web服务器就越有能力接收新连接。但是请注意,将此值设置得太低可能会破坏PHP会话变量,尽管不会导致基于浏览器会话的cookie。因此,例如,对于依赖于Web应用程序工作流的PHP会话变量而不是浏览器会话cookie的Web服务器,值300(5分钟)可能会更好。值45可能对只提供静态广告登陆页面的Web服务器是好的,但对于需要大量使用PHP会话变量的服务器来说则是可怕的。因此,将此文件中的“超时”参数编辑为所需的数量。您可能需要对所有网页进行一些测试,以查看该值是否太低。但是,最好不要将其设置为大于300,除非您在大型文件上传或大型文件下载中遇到问题。
-
现在,重新启动Apache Web服务。如果您做错了什么,Apache可能会在您再次启动它时将其告知您,并且您可以进行纠正。
sudo service apache2 restart
-
现在,重复之前所做的10选项卡浏览器技巧,并在Apache Web服务器错误日志中查看是否遇到Apache配置错误:
sudo tail -f /var/log/apache2/error.log
…如果需要,请按CTRL + C摆脱该限制。
查找有关需要MaxRequestWorkers的投诉(以及最近重新启动Web服务器以来的投诉)。如果您看到最佳的MaxRequestWorkers设置,那么您的网站或Web应用程序可能需要更多的强大功能。考虑以下选项:
-
使用CDN进行大文件下载,图像和脚本。
-
使用缓存服务,例如CloudFlare或其他。
-
重做您的网站或Web应用程序策略,以使用多个Web服务器充当负载均衡器后面的一个”web app”。
-
向服务器添加更多RAM,从而再次进行此计算。
-
现在已经调整了Apache服务器,已经有点基线调整了。您需要在2-3周的时间内进行检查,并在Apache错误日志中查找MaxRequestWorker问题。由此,您可以决定优化(请参见步骤10)。您还可以在Ubuntu上使用apt安装Munin,并查看Apache随时间推移的性能,并确定增长点,然后再决定需要对Web服务器处理的流量进行任何处理。
次佳办法
可以将MaxRequestWorkers提高到什么取决于每个httpd /apache进程占用多少RAM。如果每个人占用50MB(只是选择一个随机数),那么您一次使用的20个请求工作程序(即并发连接)将占用1GB。因此,在该示例中,您最多可以有8GB * 20 = 160个MaxRequestWorkers。但是,您无法用完所有的RAM用于Apache,需要为其中运行的其他内容保留一些内存。另外,留出一些备用RAM有助于提高性能,因为OS会使用它来缓存内容并提高性能(尽管与服务器相比,不浪费连接数可能更可取,因为服务器在站点运行缓慢时会显得很慢)用户的浏览器等待连接耗尽(如果它们用尽了)。