再起動後にユニットファイルを更新してもApache2は起動しません。

再起動後にユニットファイルを更新してもApache2は起動しません。

問題:サーバーを再起動した後、apache2は自動的に起動しません。 (手動でsshを実行してsystemctlを介して起動する必要があり、起動時に問題はありません。)

エラーメッセージ:

Feb 08 05:53:46 domain1_test.com systemd[1]: Starting The Apache HTTP Server...
Feb 08 05:53:47 domain1_test.com apachectl[834]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address [xxxx:xxxx::xxxx:xxxx:xxxx:xxxx]:80
Feb 08 05:53:47 domain1_test.com apachectl[834]: no listening sockets available, shutting down
Feb 08 05:53:47 domain1_test.com apachectl[834]: AH00015: Unable to open logs
Feb 08 05:53:47 domain1_test.com apachectl[809]: Action 'start' failed.
Feb 08 05:53:47 domain1_test.com apachectl[809]: The Apache error log may have more information.
Feb 08 05:53:47 domain1_test.com systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
Feb 08 05:53:47 domain1_test.com systemd[1]: apache2.service: Failed with result 'exit-code'.

現在のApache設定:

# port.conf
Listen xxx.xxx.xx.xx:80
Listen xxx.xxx.xx.xx:443

Listen [xxxx:xxxx::xxxx:xxxx:xxxx:xxxx]:80
Listen [xxxx:xxxx::xxxx:xxxx:xxxx:xxxx]:443

---

# domain1_VirtualHosts.conf
<VirtualHost xxx.xxx.xx.xx:80 [xxxx:xxxx::xxxx:xxxx:xxxx:xxxx]:80>
....
<VirtualHost xxx.xxx.xx.xx:443 [xxxx:xxxx::xxxx:xxxx:xxxx:xxxx]:443>

ターゲットを介してネットワークの依存関係を追加し、apache2ユニットファイルを期待することをテストしましたが、再起動後にapache2ステータスを確認してもソケットをバインドできないエラーが発生します。

[Unit]
Description=The Apache HTTP Server
After=network.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
Documentation=https://httpd.apache.org/docs/2.4/

[Service]
Type=forking
Environment=APACHE_STARTED_BY_SYSTEMD=true
ExecStart=/usr/sbin/apachectl start
ExecStop=/usr/sbin/apachectl stop
ExecReload=/usr/sbin/apachectl graceful
PrivateTmp=true
Restart=on-abort

[Install]
WantedBy=multi-user.target

環境:

  • エノード
  • Ubuntu 20.04.2 LTS
  • Apache/2.4.41
  • VirtualMin/webmin

インターフェース構成:

iface eth0 inet dhcp

iface eth0 inet6 manual
        pre-up /sbin/modprobe -q ipv6 ; /bin/true

システムネットワーク構成:

[Match]
Name=eth0

[Network]
DHCP=no
DNS=xxx.x.xx.xx xxx.xxx.xx.x xxx.xxx.xx.x
Domains=members.linode.com
IPv6PrivacyExtensions=false

Gateway=xxx.xxx.xx.x
Address=xxx.xxx.xx.xx/24

この問題に関するアドバイスをお寄せいただきありがとうございます。

答え1

これは、IPv6 アドレスを取得するインターフェイスが遅延するためです。 1つの解決策は、ExecStartPre=サービスファイルからスクリプトが緊密なループを介して提供されていることを確認するスクリプトを呼び出すことです。たとえば(必要に応じて変更):

#!/bin/sh

for Secs in {1..60}
do
        ip addr show dev eth0 | grep -qi <IPv6 address> && echo Found in ${Secs} &&  exit 0
        sleep 1
done

echo "NOT FOUND after ${Secs} seconds"
exit 1 

サービスファイルでは機能しませんが、スクリプトは機能しているかどうかをテストしました。

関連情報