Apache-2.4

Apache 不斷恢復到 mpm_prefork (Apache 2.4.7 / Ubuntu 14.04.2)

  • May 26, 2016

這個問題我已經有一年多了,每次 Ubuntu 有安全更新並且我必須重新啟動伺服器時,Apache 2.4 決定開始使用 mpm_prefork 工作程序,儘管事實上我已將 mpm_event 設置為 / 中的啟用模組etc/apache2/mods 啟用。

我什至在 /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

問題似乎是您將這些安裝為軟體包:

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 類型,則 adpkg -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.

引用自:https://serverfault.com/questions/779143