Apache2.2/CentOS6で動いていたサービスをApache2.4/CentOS7に移植しようとしたらハマったのでメモ。
CentOS7でsudo systemctl start httpdしたら、コンソールが待ち状態のまま制御が戻ってこない。なんでだろ・・?
— DQNEO (@DQNEO) May 21, 2015
症状
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の読み込み忘れ
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"でぐぐってみたら上記の答えにたどりつきました。