【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>