systemdサービスの依存関係を設定する方法は?


17

CentOS 7システムのブート中に、nginxの起動が次のエラーで失敗します。

2014/08/04 17:27:34 [emerg] 790#0: bind() to a.b.c.d:443 failed (99: Cannot assign requested address)

これは、SSL経由で仮想ホストを提供するためにそのIPアドレスにバインドする前に、ネットワークインターフェイスがまだ起動していないために発生していると思われます。

私の推測では、nginx.serviceの要件としてnetwork.serviceを指定する必要がありますが、/ etc / systemd /にネットワークサービスがまったく見つかりません。

systemdでサービスの順序または依存関係を構成するにはどうすればよいですか?


1
注文よりもサービスの依存関係を探していませんか?
CVn 14

いい視点ね!更新しました。
vincent.io 14

1
これが役立つことがあります。serverfault.com/questions/482730/...
Belminフェルナンデス

ありがとう、それはそれを解決します!回答に入れて閉じることができますか?:)
vincent.io 14

回答を削除しました。その回答のソースが投稿されました(Mr. Hampton)。彼を正解としてマークする必要があります。
ベルミンフェルナンデス14

回答:


19

あなたは、最低でも、必要After=network.target[Unit]ネットワークがnginxのを開始する前にアップしていることを確認するために、あなたのユニットファイルのセクション。ユニットファイルにそのファイルがないのはなぜかわかりません。

以下は、Fedoraに同梱されている便利なFedoraシステムの完全な例です。

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

ありがとう、素晴らしい答え!reginリポジトリ(サードパーティ)からnginxをインストールしたので、ユニットファイルに「After」が表示されない理由を説明できます。
vincent.io 14

1
面白い。私は彼にメモを落とし、問題について知らせます。彼のパッケージは通常非常に高品質であり、彼がどのようにそれを逃したかはわかりません。
マイケルハンプトン

素晴らしい提案、完了しました。
vincent.io 14

5

エラーログからは、nginxの設定のように見えます。ファイルには、明示的なIPアドレスを持つlistenディレクティブがあります。

listen a.b.c.d:443

これは、ネットワークインターフェイスが起動していて、IP abcdがインターフェイスに割り当てられていない限り、nginxが起動しないことを意味します。

次の2つのオプションがあります。

  • listenディレクティブを次のように変更します。listen 443; (すべてのIPアドレスにバインド)
  • nginxをnetwork-online.targetに依存させる

http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/で説明されているように、network.target はネットワーク管理スタックが起動していることを示すだけです[...]到達時にネットワークインターフェイスが既に構成されているかどうか未定義です。

IPアドレスがすでに割り当てられていて、インターフェースが稼働していることを確認したい場合は、nginxのsystemdユニットファイルにnetwork-online.targetを追加する必要があります。

/etc/systemd/system/multi-user.target.wants/nginx.serviceファイルのAfter =行とRequires =行にnetwork-online.targetが必要です。

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target network-online.target
Requires=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

1
言及するための+ network-online.target1-誰かが疑問に思っている場合:はい、両方Requires=After=必要ですRequires=(おそらく驚くべきことに)必要なユニットと必要なユニットとの間の順序を意味しないためです。
-maxschlepzig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.