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でサービスの順序または依存関係を構成するにはどうすればよいですか?
Nginxを開始する前にネットワークが稼働していることを確認するには、少なくともユニットファイルのAfter=network.target
セクションに[Unit]
が必要です。あなたのユニットファイルになぜそれがないのか私にはわかりません。
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
エラーログから、それはあなたのnginx設定のように見えます。ファイルには、明示的なIPアドレスを持つlistenディレクティブがあります。
listen a.b.c.d:443
これは、ネットワークインターフェースが稼働中およびIP a.b.c.dがインターフェースに割り当てられていない限り、nginxは起動しないことを意味します。
次の2つのオプションがあります。
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