如何配置Apache“工人”以获得最大并发

Sea*_* W. 6 httpd centos apache-2.4

希望这是一个好问题,对处于类似情况的任何人都有用。我最近接替了我公司一位非常资深的 Linux 管理员,这是我第一次不得不设置一个新服务器来为我们的客户提供我们的内容。我的前任在这件事上留下了有限的文件,因为在他离开时其他事情更重要。我已经广泛地参考了我拥有的文档,以及来自以前服务器的配置和大量在线阅读来设置所有内容。

我正在构建的服务器的“堆栈”如下:CentOS 7、Apache 2.4.6、MariaDB 5.X、服务于 JSP/Servlets 的 Tomcat 7。以前的生产安装使用 CentOS 5、旧版本的 Apache 和 MySQL 以及 Tomcat 5.X。

Apache 是前端,它使用 AJP 连接到 Tomcat 后端。大多数流量将是 HTTPS。

该服务器是,我认为是 Gen 9 HP 服务器,它在 RAID 1 阵列中具有 32GB RAM 和 SSD。在让它工作后,我现在关心的是最大化它同时为用户提供服务的能力,我预计数百个用户的爆发并不少见。为此,我希望防止堆栈中的任何一点出现瓶颈:从 Tomcat 和 MariaDB 开始,并针对这些采取特定的措施,我对这些措施感到满意。继续使用 Apache,但是我发现更难理解我应该做什么。

有 3 种不同类型的“工人”,我在优化这些方面有 3 个主要问题:
1. 有三个选项,prefork、mpm_worker 和 mpm_event。我不太明白如何配置它们,尽管我对它们的用途有一个大致的了解。
2. 与之前服务器中的 Apache 不同,StartServers、ServerLimit、MaxRequestsPerChild 等选项未在 /etc/httpd/conf/httpd.conf 中列出。是否有我必须手动覆盖的默认设置?除了“它们是上次手动添加的”之外,还有其他原因可以在旧的 httpd.conf 中找到设置而不是新的设置吗?

我指的是这个,在旧的 httpd.conf 中,我在新配置文件的任何地方都看不到任何类似的东西,只有一个规范:

// prefork MPM
// StartServers:要启动的服务器进程数
// MinSpareServers:保持空闲的最小服务器进程数
// MaxSpareServers:保持空闲的最大服务器进程数
// ServerLimit:MaxClients 的最大值服务器的生命周期
// MaxClients:允许启动的最大服务器进程数
// MaxRequestsPerChild:服务器进程服务的最大请求数

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

// worker MPM
// StartServers:要启动的服务器进程的初始数量
// MaxClients:同时客户端连接的最大数量
// MinSpareThreads:保持空闲的工作线程的最小数量
// MaxSpareThreads:保持空闲的工作线程的最大数量
// ThreadsPerChild :每个服务器进程中工作线程的数量恒定
// MaxRequestsPerChild:服务器进程服务的最大请求数

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

请注意,我将井号替换为 // 以表示 httpd.conf 中的注释,因为井号导致文本显示为标题。

与我在新服务器上遇到的问题相反,我无法分辨旧服务器上正在使用哪个 worker,prefork 和 mpm_worker 都有设置,但是我找不到要使用的实际规范。

  1. 稍作调整后,如果需要,我可以使用 mpm_worker 启动服务器(必须先禁用 php.conf 文件),但我不确定控制一切的模块是否是线程安全的(用于虚拟主机的模块、openssl、mod_proxy_ajp)。mod_proxy_ajp 是我使用的唯一一个在任何意义上都不寻常的东西。

服务器尚未投入生产,因此我无法选择获取大量当前客户端的平均内存使用情况来帮助确定最大客户端的“完美”数量,此外,我不关心获得完美的数字,恰到好处的数字。

如果我想确保大约 400 人在给定时间可以使用服务器,而没有人看到 http 500 类型错误,那么我应该为 Apache 使用哪些设置?

提前致谢,希望这不是太笨拙。

Mik*_*ler 13

这里似乎有很多可能的问题,对于“响应”来说有点非结构化。让我看看我是否可以帮助回答一些。

  • 确定正在使用的多处理模块 (MPM)。

    “最简单”的方法是转储所有当前正在运行的模块并选择其中的模块mpm以查看正在运行的模块。这里有两种方法:

    # apachectl -M | grep mpm
    mpm_worker_module (shared)
    # httpd -V | grep MPM
    Server MPM:     worker
    
    Run Code Online (Sandbox Code Playgroud)
  • 更改正在使用的 MPM

    在 CentOS7 上,这现在在一个名为/etc/httpd/conf.modules.d/00-mpm.conf. 这是一个简短的文件,LoadModule任何时候都只能取消注释。

    LoadModule mpm_worker_module modules/mod_mpm_worker.so

    更改后需要重新启动服务以激活所需的 MPM。

  • 设置所需的配置值

    许多模块的配置指令在未指定时都有默认值。 当使用= 5时,StartServers使用worker将默认为 3。在prefork此处查看更多信息:https : //httpd.apache.org/docs/current/mod/mpm_common.html#startservers。我建议创建一个新文件来包含您的覆盖,而不是编辑现有的。

    类似的东西/etc/httpd/conf.modules.d/10-worker.conf

    <IfModule mpm_worker_module>
        ServerLimit             250
        StartServers             10
        MinSpareThreads          75
        MaxSpareThreads         250
        ThreadLimit              64
        ThreadsPerChild          32
        MaxClients             8000
        MaxRequestsPerChild   10000
    </IfModule>
    
    Run Code Online (Sandbox Code Playgroud)

至于用什么,调整确切的数字是留给你来测试你的工作负载和应用-一样的工具ab,并siege可以提供帮助。