旧サイト(新URLを見てね)

ITや家計、身近なことの整理

[お知らせ]
当サイトは、2024年1月1日に
新URL(happynap.net)に引っ越しました





このページの内容は、最新ではない場合がありますので、新URLをご確認ください。






当サイトには広告を含みます。"オススメ"として紹介している商品やサービスは、個人的にそう思えたものだけです。
共感、興味をもっていただけるものがあればご利用ください (広告掲載ポリシー)。

ネットワーク起動後にhttpdやpostfixをサービス起動させる設定(Systemd)

概要

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、別の設定ファイル) を利用します。ユニットファイルのカスタマイズの全般的なことについては、以下の記事にまとめてあります。

happy-nap.hatenablog.com

例として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においてネットワーク起動後にサービス起動させる設定についてまとめてみました。