ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

【CentOS7】init.d起動スクリプトでApache2.2が起動しない場合の対処方法(systemd起動スクリプト作成で解決)

環境

CentOS7
Apache2.2

事象と対処手順

CentOSにApahce2.2をインストール後、標準の起動スクリプトでstartすると固まった。
ちなみにApacheはソースからのインストール。

start実行で固まる、、、

[root@localhost httpd-2.2.31]# /etc/init.d/httpd start
Starting httpd (via systemctl):  

5分位経過後、以下のようなエラー。

Job for httpd.service failed because a timeout was exceeded. See "systemctl status httpd.service" and "journalctl -xe" for details.
                                                           [失敗]

systemctlでstatusを見るとfaild

[root@localhost httpd-2.2.31]# /etc/init.d/httpd status                                                            
● httpd.service - LSB: start and stop Apache HTTP Server
   Loaded: loaded (/etc/rc.d/init.d/httpd; bad; vendor preset: disabled)
   Active: failed (Result: timeout) since 日 2017-01-08 13:04:28 JST; 3min 4s ago

何故かApacheプロセスは生成されてる

[root@localhost httpd-2.2.31]# ps ax | grep http
 82830 ?        Ss     0:00 /usr/local/apache/bin/httpd                                                            
 82832 ?        S      0:00 /usr/local/apache/bin/httpd                                                            
 82833 ?        S      0:00 /usr/local/apache/bin/httpd                                                            
 82834 ?        S      0:00 /usr/local/apache/bin/httpd                                                            
 82835 ?        S      0:00 /usr/local/apache/bin/httpd                                                            
 82836 ?        S      0:00 /usr/local/apache/bin/httpd 

とりあえずkillする

pkill httpd

ググった所、CentOS7からは起動時のsystemdがhttpdの起動の判断の為にsystemd_moduleというモジュールが必要らしい。
CentOS7のyumで提供されてるhttpdならデフォルトでmod_systemd用のパッチが当てられるそうですが、ソースからのインストール時には別途対応する必要があるようです。
※systemd_moduleモジュールが無くてもsystemdに対応するだけで起動できました

そもそもCentOS7のサービス起動コマンドはsystemdとなっており、apacheの場合はsystemdに対応した起動スクリプトする必要がありそう。
という事で作成。

vi /etc/systemd/system/httpd.service 

スクリプト作成箇所は2つある。
後者が良いかも。
/usr/lib/systemd/system/ : システムデフォルト
/etc/systemd/system/ : 管理者がカスタマイズする場所

設定ファイル作成
※この設定は誤りがあり起動しないので注意、正しい記述は後述。

[Unit]
Description=Apache Web Server Name
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
ExecStart=/usr/local/apache/bin/apachectl -k start
ExecStop=/usr/local/apache/bin/apachectl -k stop
ExecReload=/usr/local/apache/bin/apachectl graceful
PrivateTmp=true
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

LimitNOFILEはulimitらしい。

権限付与

chmod 755 /etc/systemd/system/httpd.service

サービスを有効に設定(自動起動を有効化)

systemctl enable httpd.service

ちなみに、有効設定時に下記エラーが出た場合は

$ systemctl enable httpd.service
Failed to execute operation: Access denied

下記コマンドを実行すると解決する

systemctl daemon-reexec

エラー無く起動できた

systemctl start httpd.service 

と思ったらプロセスが無いんだけど・・

[root@localhost src]# ps ax | grep http                                                                                                       
 83917 pts/2    R+     0:00 grep --color=auto http 

status確認

[root@localhost src]# systemctl status httpd.service 
● httpd.service - Apache Web Server Name
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 日 2017-01-08 13:54:20 JST; 57s ago
  Process: 83901 ExecStop=/usr/local/apache/bin/apachectl -k stop (code=exited, status=0/SUCCESS)
  Process: 83898 ExecStart=/usr/local/apache/bin/apachectl -k start (code=exited, status=0/SUCCESS)
 Main PID: 83898 (code=exited, status=0/SUCCESS)

 1月 08 13:54:19 localhost.localdomain systemd[1]: Started Apache Web Server Name.
 1月 08 13:54:19 localhost.localdomain systemd[1]: Starting Apache Web Server Name...
 1月 08 13:54:20 localhost.localdomain apachectl[83898]: httpd: Could not reliably determine the server's fully qualified domain name, ...erName
 1月 08 13:54:20 localhost.localdomain apachectl[83898]: httpd (pid 83353) already running
 1月 08 13:54:20 localhost.localdomain apachectl[83901]: httpd: Could not reliably determine the server's fully qualified domain name, ...erName
Hint: Some lines were ellipsized, use -l to show in full.

何かエラー出てる

localhost.localdomain apachectl[93743]: httpd: Could not reliably determine the server's fully qualified domain name, ...erName

ApacheのServerNameが指定されてないってエラーらしいので設定

vi /usr/local/apache/conf/httpd.conf 
ServerName localhost:80

まだ起動しない

[root@localhost src]# systemctl status httpd.service 
● httpd.service - Apache Web Server Name
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 月 2017-01-09 07:14:11 JST; 4s ago
  Process: 94220 ExecStop=/usr/local/apache/bin/apachectl -k stop (code=exited, status=0/SUCCESS)
  Process: 94216 ExecStart=/usr/local/apache/bin/apachectl -k start (code=exited, status=0/SUCCESS)
 Main PID: 94216 (code=exited, status=0/SUCCESS)

 1月 09 07:14:10 localhost.localdomain systemd[1]: Started Apache Web Server Name.
 1月 09 07:14:10 localhost.localdomain systemd[1]: Starting Apache Web Server Name...
 1月 09 07:14:11 localhost.localdomain apachectl[94220]: httpd (no pid file) not run


systemdのログ確認

journalctl -xn 

-- Logs begin at 土 2017-01-07 11:10:53 JST, end at 月 2017-01-09 07:01:18 JST. --
 1月 09 07:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[93998]: finished 0anacron
 1月 09 07:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[94000]: starting mcelog.cron
 1月 09 07:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[94004]: finished mcelog.cron
 1月 09 07:01:04 localhost.localdomain polkitd[518]: Registered Authentication Agent for unix-process:94006:15765868 (system bus name :1.847 [/us
 1月 09 07:01:04 localhost.localdomain polkitd[518]: Unregistered Authentication Agent for unix-process:94006:15765868 (system bus name :1.847, o
 1月 09 07:01:17 localhost.localdomain polkitd[518]: Registered Authentication Agent for unix-process:94013:15767181 (system bus name :1.848 [/us
 1月 09 07:01:17 localhost.localdomain systemd[1]: Started Apache Web Server Name.
-- Subject: Unit httpd.service has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit httpd.service has finished starting up.
-- 
-- The start-up result is done.
 1月 09 07:01:17 localhost.localdomain systemd[1]: Starting Apache Web Server Name...
-- Subject: Unit httpd.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit httpd.service has begun starting up.
 1月 09 07:01:17 localhost.localdomain polkitd[518]: Unregistered Authentication Agent for unix-process:94013:15767181 (system bus name :1.848, o
 1月 09 07:01:18 localhost.localdomain apachectl[94023]: httpd (no pid file) not running

もしかしてsystemdの設定ファイルの記述に誤りがあるのかと思い、参考サイトを元に修正

[root@localhost src]# cat /usr/lib/systemd/system/httpd.service

[Unit]
Description=Apache Web Server Name
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/apache/bin/apachectl -k start
ExecReload=/usr/local/apache/bin/apachectl graceful
ExecStop=/usr/local/apache/bin/apachectl -k stop
PrivateTmp=true
LimitNOFILE=infinity
 
[Install]
WantedBy=multi-user.target

Typeの値を「simple」から「forking」に変更した。
古典的なデーモンにはforkingを指定するぽい。

ServiceのTypeは、サービスプロセスの起動完了の判定方法(デフォルトは「simple」)らしい。
いくつかTypeの種類について調べる。
※実際には他にもあります

  • Type=simple

フォアグラウウンドで実行を継続するコマンド。
フォアグラウンドで実行するタイプの場合、systemdから実行したコマンドのPIDが「メインプロセス」のPIDとして認識する。

  • Type=forking

子プロセスをフォークしてバックグラウンドにまわして、最初のコマンド自体は終了する。
この場合は、実行したコマンドが終了した時点で起動完了と判断。

  • Type=oneshot

デーモン型のプロセスではなく、一度だけ指定のコマンドを実行するタイプのサービス。
「ExecStart」で指定したコマンドを実行して、それが完了したタイミングで起動完了(かつサービス終了)と判断する。


起動スクリプト変更後は再読込

[root@localhost src]# systemctl daemon-reload

起動実行

[root@localhost src]# systemctl start httpd.service 

起動した

[root@localhost src]# systemctl status httpd.service 
● httpd.service - Apache Web Server Name
   Loaded: loaded (/etc/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2017-01-09 07:34:43 JST; 7s ago
  Process: 94827 ExecStart=/usr/local/apache/bin/apachectl -k start (code=exited, status=0/SUCCESS)
 Main PID: 94830 (httpd)
   CGroup: /system.slice/httpd.service
           ├─94830 /usr/local/apache/bin/httpd -k start
           ├─94831 /usr/local/apache/bin/httpd -k start
           ├─94832 /usr/local/apache/bin/httpd -k start
           ├─94833 /usr/local/apache/bin/httpd -k start
           ├─94834 /usr/local/apache/bin/httpd -k start
           └─94835 /usr/local/apache/bin/httpd -k start

 1月 09 07:34:42 localhost.localdomain systemd[1]: Starting Apache Web Server Name...
 1月 09 07:34:43 localhost.localdomain systemd[1]: Started Apache Web Server Name.
 ||<

プロセスも立ち上がってる
>||
[root@localhost src]# ps ax | grep http
 94830 ?        Ss     0:00 /usr/local/apache/bin/httpd -k start                                                                                 
 94831 ?        S      0:00 /usr/local/apache/bin/httpd -k start                                                                                 
 94832 ?        S      0:00 /usr/local/apache/bin/httpd -k start                                                                                 
 94833 ?        S      0:00 /usr/local/apache/bin/httpd -k start                                                                                 
 94834 ?        S      0:00 /usr/local/apache/bin/httpd -k start                                                                                 
 94835 ?        S      0:00 /usr/local/apache/bin/httpd -k start  

問題のあるエラーも無さそう

[root@localhost src]# tail -3 /usr/local/apache/logs/error_log                                                                                   
[Mon Jan 09 07:34:43 2017] [notice] Digest: generating secret for digest authentication ...
[Mon Jan 09 07:34:43 2017] [notice] Digest: done
[Mon Jan 09 07:34:44 2017] [notice] Apache/2.2.31 (Unix) DAV/2 configured -- resuming normal operations

アクセスも出来た

[root@localhost src]# curl http://localhost
<html><body><h1>It works!</h1></body></html>