Apache2.4 on CentOS7 でsystemctl start httpdで起動しない問題の対処法

Apache2.2/CentOS6で動いていたサービスをApache2.4/CentOS7に移植しようとしたらハマったのでメモ。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">CentOS7でsudo systemctl start httpdしたら、コンソールが待ち状態のまま制御が戻ってこない。なんでだろ・・？</p>&mdash; DQNEO (@DQNEO) <a href="https://twitter.com/DQNEO/status/601188072554913793">May 21, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 症状

systemctl start したら延々待たされたあげくApacheが起動しない

```
[vagrant@localhost ~]$ sudo systemctl start httpd.service
# ここでシェルが固まったまま制御が返ってこない！
```


1-2分待つと制御が戻るのですが、どうも起動に失敗しているようです。

systemctl statusを見ると下記のような情報が。

```
[vagrant@localhost ~]$ sudo systemctl status httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: failed (Result: timeout) since 木 2015-05-21 17:59:15 JST; 8s ago
  Process: 1154 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
 Main PID: 6061

 5月 21 17:56:15 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
 5月 21 17:57:45 localhost.localdomain systemd[1]: httpd.service operation timed out. Terminating.
 5月 21 17:59:15 localhost.localdomain systemd[1]: httpd.service stopping timed out (2). Killing.
 5月 21 17:59:15 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
 5月 21 17:59:15 localhost.localdomain systemd[1]: Unit httpd.service entered failed state.
```

journalctlしても同じような情報でした。

```
[vagrant@localhost ~]$ sudo journalctl -xn
-- Logs begin at 木 2015-05-21 17:55:26 JST, end at 木 2015-05-21 18:03:41 JST. --
 5月 21 18:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[6116]: starting 0anacron
 5月 21 18:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[6122]: finished 0anacron
 5月 21 18:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[6124]: starting 0yum-hourly.cron
 5月 21 18:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[6128]: finished 0yum-hourly.cron
 5月 21 18:02:29 localhost.localdomain systemd[1]: httpd.service stopping timed out (2). Killing.
 5月 21 18:02:29 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
-- Subject: Unit httpd.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has failed.
--
-- The result is failed.
 5月 21 18:02:29 localhost.localdomain systemd[1]: Unit httpd.service entered failed state.
```

Apacheのエラーログ(/var/log/httpd/) には何もエラーが出力されていませんでした。

# 原因はsystemd_moduleの読み込み忘れ

https://diary.sshida.com/20130706-6-Fedora%2017%E3%81%8B%E3%82%89Fedora%2019%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%83%A1%E3%83%A2

> systemd_moduleは取説が見当たらないが、ないとFedora 19ではapacheは起動しない。 ソースらしきものを見ると、systemdに起動したことの表示と処理件数の報告など、2種類の通知が行われているもよう。systemd_moduleがないと apache httpdを起動できない。正確には、httpdは起動しても、systemdが起動したことが わからないため、systemdからhttpdを起動できない。sysstemdはhttpdを起動するときに systemd moduleがないと、httpdは起動しても1-2分後にhttpdを殺して、「失敗した」と表示する。

だそうです。
たしかにそんな感じの挙動でした。

systemd_moduleを読むこむようにして、マシンを再起動したら見事に解決しました。

```
LoadModule systemd_module modules/mod_systemd.so
```

# どうやって原因を突き止めたのか

当初はまったく見当がつかず途方に暮れていたのですが、

まっさらのCentOS7にApache2.4をyum installした場合はどうなるのだろう？
↓
ちゃんと起動した
↓
Apache2.2のサーバから持ってきた自前設定ファイルに原因があるはず
↓
Apache2.2用設定ファイルと、Apache2.4をyum installした直後の設定ファイルを比較してみた
↓
Apache2.4には"systemd_module"という見知らぬモジュールがある。これは何だろう？

と考えて"systemd_module"でぐぐってみたら上記の答えにたどりつきました。