如何判断apache是​​作为prefork还是worker运行?


40

如何判断apache是​​作为prefork还是worker运行(或配置为运行)?


2
或更严格地说是“编译为”运行

Answers:


37

MPM是在编译时配置的。之后找出它的一种方法是列出模块中编译的列表。该列表将包括所选的MPM。可以使用-l标志运行apache二进制文件来完成列表。

andreas@halleck:~$ apache2 -l
Compiled in modules:
 core.c
 mod_log_config.c
 mod_logio.c
 worker.c
 http_core.c
 mod_so.c
andreas@halleck:~$ 

在这里,我们找到了worker.c模块,因此我正在运行worker MPM。


4
这个答案是错误的。看我的答案。
克里斯·约翰逊

1
嗯,在Ubuntu上执行此操作时,我既没有列出工人,也没有列出
前叉

2
在Ubuntu上,您可以apache2ctl -M用来列出活动模块。
SteffenNielsen '16

53

Series8217和Andol给出的答案都是错误的。

问题是,如何判断Apache是​​否正在运行 prefork或worker。其他答案给出的建议仅告诉您默认的 MPM是什么(基于内置模块),而不是当前是否使用该默认值或其他选择。

如果httpd -V显示prefork,则仅表示prefork是已编译的默认MPM。可以通过更改Apache配置文件设置来覆盖它,如以下过程所示:

  1. 编辑配置文件(例如/etc/sysconfig/httpd在CentOS / RedHat上)
  2. 添加或取消注释此行: HTTPD=/usr/sbin/httpd.worker
  3. 重新启动Apache

使用以下过程可以显示实际正在运行的MPM:

  1. 启用Apache mod_info
  2. 查询mod_info网址,通常是 curl localhost/server-info
  3. “服务器设置”部分将显示“ MPM名称:工作者”
  4. httpd -V再次运行-它仍然显示前叉,而不是工作程序

底线:

  • httpd -V 显示默认选项,而不是实际使用的选项

很多网站说,答案可以httpd -V用来判断Apache是​​在运行prefork还是worker。他们都是错的。尝试以上过程以自己看看。


仅供参考,根据httpd.apache.org/docs/trunk/mpm.html,MPM可以是所有平台上的静态模块,也可以作为DSO构建(在Unix上)。当将其构建为静态模块时,“必须重新构建服务器才能更改MPM。” 关于Apache的文档是否正确,因为除了重建服务器外,静态模块MPM不可更改?
史蒂文·T·斯奈德2014年

这听起来很像发行版特定的东西,周围有更高层次的包装器?
andol 2014年

2
在CentOS 6.6上,/ usr / sbin / httpd,/ usr / sbin / httpd.event和/usr/sbin/httpd.worker都是不同的二进制文件,在编译时配置了不同的MPM(分别为prefork,event和worker)。更改/ etc / sysconfig / httpd中的HTTPD设置仅控制由init脚本运行的二进制文件。
Paul Haldane 2014年

我必须在Ubuntu 16.04 LTS上运行apache2 -V而不是httpd -V
cnizzardini

41

在Ubuntu 14.04中

a2query -M

告诉eventpreforkworker

您可以通过添加mpm_<chosen>mods-availablemods-enabledin的符号链接来更改它/etc/apache2

一次只允许一个。


2
这需要被接受。

是的,很好的答案!简单并返回所需内容
Flash Thunder

最好的为我工作,谢谢(在Apache 2.4上工作。...看起来在Apache 2.2上不工作)
dmikam

eventMPM,根据Apache的网站,“与消费线程仅适用于具有积极处理连接的目标工人MPM的变体”。
乔纳森·伯杰

7

在RedHat及其衍生版本上,只需启动topps aux查看httpd进程名称:

  • httpd 表示Apache正在作为prefork运行
  • httpd.worker 表示它正在作为工人运行

4

在RHEL / Fedora / etc上,运行httpd -V。您将获得一些输出,包括以下内容:

Server version: Apache/2.2.21 (Unix)
     ...
Architecture:   64-bit
Server MPM:     Prefork
     ...

这里的“服务器MPM”是“ Prefork”,因此我的服务器正在运行prefork MPM。


这个答案是错误的。看我的答案。
克里斯·约翰逊

@ChrisJohnson,一个有趣的发现...我的理解是MPM不能通过配置更改,只能通过编译来更改。OP似乎也有同样的想法,因为他对自己的问题发表了“或更严格的'编译为as'”评论。我将研究重现您的答案,一旦确认,我将撤销我的回答。
史蒂文·斯奈德

我通过httpd.apache.org/docs/trunk/mpm.html上的apache文档确认,可以在“ Unix和类似平台”上将MPM构造为DSO模块并通过LoadModule指令动态加载。所以MPM的确可以在加载时在某些情况下改变(这可能是最常见的配置,这些天..)
史蒂芬吨斯奈德

4

克里斯·约翰逊是正确的。转到httpd.conf =>添加以下行:

<Location /server-info>
SetHandler server-info
</Location>

重新启动apache:/etc/init.d/httpd重新启动。然后通过浏览器访问localhost / server-info,然后查看MPM Name部分


更妙的是,将其放在<IfModule info_module> </ IfModule>
Lexib0y 2015年

3

我希望这是确定正在使用哪个MPM的可靠方法。将以下内容添加到您的httpd.conf

<IfModule prefork.c>
    Header append X-MPM prefork
</IfModule>
<IfModule worker.c>
    Header append X-MPM worker
</IfModule>

然后使用检查标题curl -I localhost | grep X-MPM


3

在centos(或rhel)上,您可以运行以下命令:

ps -ef | grep httpd

如果看到/usr/sbin/httpd.worker正在运行,则说明它正在使用工作程序MPM。如果看到/usr/sbin/httpd正在运行,则说明它正在使用prefork



2

我像发行版一样在Debian中弄清楚的一种方式是运行:

apachectl -V | grep -i mpm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.