Apache 不断恢复到 mpm_prefork(Apache 2.4.7 / Ubuntu 14.04.2)

Apache 不断恢复到 mpm_prefork(Apache 2.4.7 / Ubuntu 14.04.2)

我遇到这个问题已经一年多了,每次 Ubuntu 有安全更新,我都必须重新启动服务器,Apache 2.4 就会决定开始使用 mpm_prefork 工作程序,尽管我已在 /etc/apache2/mods-enabled 中将 mpm_event 设置为启用模块。

我甚至编辑了 /etc/apache2/mods-available 中的 mpm_prefork.conf 文件并注释掉了加载模块的位置,但是今天早上重启后,apache 根本无法启动,因为它坚持使用 Prefork 启动。

这是我的 /etc/apache2/mods-enabled/ 目录列表

access_compat.load
actions.conf
actions.load
alias.conf
alias.load
auth_basic.load
authn_core.load
authn_file.load
authz_core.load
authz_host.load
authz_user.load
autoindex.conf
autoindex.load
deflate.conf
deflate.load
dir.conf
dir.load
env.load
evasive.conf
evasive.load
expires.load
fastcgi.conf
fastcgi.load
filter.load
headers.load
mime.conf
mime.load
mpm_event.conf
mpm_event.load
negotiation.conf
negotiation.load
pagespeed.conf
pagespeed.load
rewrite.load
setenvif.conf
setenvif.load
socache_shmcb.load
spamhaus.conf
spamhaus.load
ssl.conf
ssl.load
status.conf
status.load

我通过运行 apache2 -l 检查它是否已被编译到 Apache 中,这是输出

Compiled in modules:
  core.c
  mod_so.c
  mod_watchdog.c
  http_core.c
  mod_log_config.c
  mod_logio.c
  mod_version.c
  mod_unixd.c

最后 a2query -M 的结果是

sudo a2query -M
event

但是如果我现在重新启动,Apache 在启动时就会死机,因为它需要 mpm_prefork 模块,正如我所说,我已通过在其 .conf 文件中注释掉来禁用它,以防止它加载,但这并不能解决我的问题。

说实话,我真的很困惑为什么 Apache 2.4 总是自行决定加载 mpm_prefork。

这也是我的 apache2.conf 文件,没有注释

# Global configuration
Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 40
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostNameLookups Off
ErrorLog ${APACHE_LOG_DIR}/apache-error.log
LogLevel warn
SetEnvIf Remote_Addr "127\.0\.0\.1" loopback
SetEnvIf Remote_Addr "::1" loopback
CustomLog ${APACHE_LOG_DIR}/apache-access.log combined env=!loopback

# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

# Include list of ports to listen on
Include ports.conf


<Directory />
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/>
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/html/opcache/>
    Options -Indexes +FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>


AccessFileName .htaccess

<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>

LogFormat "%V %v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
LogFormat "%h %l %u %t \"%r\" %>s %O %b %D \"%{Referer}i\" \"%{User-Agent}i\"" custom


IncludeOptional conf-enabled/*.conf

IncludeOptional sites-enabled/*.conf

答案1

问题看起来是因为你已将这些内容作为包安装:

apache2-mpm-event 2.4.7-1ubuntu4.9 amd64 transitional event MPM package for apache2
apache2-mpm-prefork 2.4.7-1ubuntu4.9 amd64 transitional prefork MPM package for apache2

更新时,您会明确告知服务器安装 prefork 版本。如果您在 Ubuntu 14.04 上正确安装了 Apache2,并且未指定 MPM 类型,则将dpkg -l | grep apache2包括:

apache2 2.4.7-1ubuntu4.9 amd64 Apache HTTP Server

但不会显示您列出的两个包。

正确的Ubuntu 14.04 上的 Apache2 安装简单来说就是:

sudo apt-get install apache2

没有任何 MPM 规范。基础的多处理模块是 Apache 2.4 的核心功能,并包含在 apache2 安装中

然后按如下方式设置 MPM:

要确定当前正在使用哪个 MPM,请运行apache2ctl -V。您将看到如下行:

 Server MPM:     prefork

例如,假设您apache2ctl -V在安装后运行“prefork”(如上例结果所示),则使用以下命令切换到“event”:

 sudo a2dismod mpm_prefork
 sudo a2enmod mpm_event
 sudo service apache2 restart

这将设置正确的符号链接。

一旦以这种方式设置,在正确安装的情况下,更新将不会更改您的设置。

笔记:您对文件的“编辑”*.conf应在目录中进行/etc/apache2/mods-available,这样在更新期间,它们将受到保护,不会被覆盖。该/etc/apache2/mods-enabled目录将只具有指向的符号链接/etc/apache2/mods-available

答案2

我从 Ubuntu 14 LTS 开始就遇到了同样的问题,在 Ubuntu 22 LTS 上仍然如此。

我确实正确安装了 apache(使用apt install apache2

我确实正确地禁用/启用了 mod (使用a2dismod mpm_prefork& a2enmod mpm_event

如果问题再次出现,请检查你是如何安装 php 的(例如 php8.0),你是否使用了 libapache2-mod-php8.0 (或apt install php)?除非你禁用该 mod,否则它将恢复到 prefork: a2dismod php8.0

此外,如果您手动进行更新并阅读文本,您将看到一行内容,说禁用 mpm-event 然后启用 mpm-prefork,这提示我注意这个模块。

如果你想使用 php 而不是 prefork,你必须使用 php8.0-fpm

相关内容