概要
httpdやpostfix等で、OS起動時のサービス自動起動が失敗することがあります。考えられる原因として、ネットワーク起動完了前のタイミングで該当のサービス起動されたというケースが挙げられます。
本記事は、Systemdにおいてネットワーク起動後にサービス起動させる設定についてまとめたものです。対象は主にRHEL7、CentOS7以降です。
詳細な仕様については、こちらの記事にまとめてあります。
基本
起動失敗時のエラー例
httpd
httpd.confにて特定IPアドレスのみをListenで指定した環境において、OS起動時等、そのIPアドレスが使用可能になる前にhttpdサービスを起動し始めた場合、以下のようなエラーで起動失敗します。
Cannot assign requested address: AH00072: make_sock: could not bind to address x.x.x.x:443
postfix
main.cfにて特定IPアドレスのみをinet_interfacesで指定した環境においても、OS起動時等、そのIPアドレスが使用可能になる前にpostfixサービスを起動し始めた場合、以下のようなエラーで起動失敗します。
fatal: parameter inet_interfaces: no local interface found for x.x.x.x
確実にネットワーク起動後にサービス起動させる設定(network-online.target)
元のユニットファイルを直接編集しても良いですが、保守性を考慮し、以下のようにドロップインスニペット (drop-in file、別の設定ファイル) を利用します。ユニットファイルのカスタマイズの全般的なことについては、以下の記事にまとめてあります。
例としてhttpdの場合の手順を記載しますが、他のサービスでも同様です。
# systemctl edit httpd
にて、以下を記載します。
[Unit] After=network-online.target Wants=network-online.target
エディタはデフォルトでvimでなくnanoが起動します(参考1、参考2)。
nanoでは、上記を記載後、Ctrl+"S"(上書き保存)→Ctrl+"X"(閉じる)で保存と終了ができます。もしくは、Ctrl+"X"(閉じる)→保存するか聞かれたら"Y"(はい)→ファイル名の確認でEnterでも同様です。
# systemctl edit httpd
にて設定変更した際は、# systemctl daemon-reload
を実行しなくても自動的にsystemdが再読み込みしてくれるようです。
(ユニットファイルを手動変更した場合には、systemdに再読み込みさせるため# systemctl daemon-reload
が必要)
この設定により、httpdはネットワーク疎通できるようになってからサービス起動するようになります。
詳細
After=network.target ≠ ネットワーク疎通可
サービスのユニットファイルにAfter=network.target
が記載されていても、それは「ネットワーク疎通できるようになった後にそのサービスを起動する」ということを保証するものではありません。
詳細な仕様については、こちらの記事にまとめてあります。
まとめ
本記事は、Systemdにおいてネットワーク起動後にサービス起動させる設定についてまとめてみました。