开发者社区 问答 正文

云服务器 ECS Linux Apache 运行参考的调整优化

在使用 Apache 搭建网站时,经常会遇到因为访问量大,导致网站无法访问的情况。造成网站无法访问的情况有很多,例如服务器配置较低,无法承载当前的访问量。 也有可能因为 Apache 的配置参数不够优化导致的。

展开
收起
开发者说 2019-07-15 13:47:17 816 分享 版权
1 条回答
写回答
取消 提交回答
  • 问题分析

    ECS Linux 系统下 Apache 的默认工作模式是 prefork MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。如果不做调整,访问量增大可能造成 Apache 崩溃的情况。

    解决方案

    具体使用哪种模式是在编译安装 Apache 时指定的。在编译的时候可以加入 —with-pem=(prefork|worker) 选项决定启用什么模式。可以使用 httpd -l 命令查看当前 Apache 的工作模式:

    Apache 的如下配置参数对性能影响较大:

       
    1. StartServers 5MinSpareServers 5MaxSpareServers 10MaxClients 150MaxRequestsPerChild 0


    建议做如下修改:

       
    1. $ 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生效:

       
    1. $ /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设置成非零值有两个好处:
      • 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
      • 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
    2019-07-22 11:22:29
    赞同 展开评论