在使用 Apache 搭建网站时,经常会遇到因为访问量大,导致网站无法访问的情况。造成网站无法访问的情况有很多,例如服务器配置较低,无法承载当前的访问量。也有可能因为 Apache 的配置参数不够优化导致的。
ECS Linux 系统下 Apache 的默认工作模式是 prefork MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。如果不做调整,访问量增大可能造成 Apache 崩溃的情况。
具体使用哪种模式是在编译安装 Apache 时指定的。在编译的时候可以加入 —with-pem=(prefork|worker) 选项决定启用什么模式。可以使用 httpd -l 命令查看当前 Apache 的工作模式:
Apache 的如下配置参数对性能影响较大:
- StartServers 5MinSpareServers 5MaxSpareServers 10MaxClients 150MaxRequestsPerChild 0
建议做如下修改:
- $ vi /usr/local/apache/httpd/conf/extra/httpd-mpm.conf StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 1024 MaxClients 1024 MaxRequestsPerChild 300
说明:
- 这些参数是经验上的参数,具体是否有效,需要根据服务器的配置,访问量情况综合考虑。可以通过逐步调整参数,观察网站访问情况的方法是网站的性能达到最优。
- MaxRequestsPerChild 参数还是必要设置为非 0,避免内存消耗殆尽而导致系统触发 OOM(Out Of Memory),导致应用系统异常,具体可以参考 Apache 官方文档说明 。
最后,重启apache生效:
- $ /usr/local/apache/httpd/bin/apachectl restart
附一些参数的介绍:
- ServerLimit
默认的MaxClient最大是256个线程,如果想设置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。如果需要更大,则必须编译apache,此前都是不需要重新编译Apache。
生效前提:必须放在其他指令的前面
- StartServers
指定服务器启动时建立的子进程数量,prefork默认为5。
- MinSpareServers
指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
- MaxSpareServers
设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1”
- MaxClients
限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit。
- MaxRequestsPerChild
每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果 MaxRequestsPerChild为”0”,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
- 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
- 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
如果问题还未能解决,您可以到阿里云社区进行免费咨询,或联系云市场商家寻求帮助。