재부팅 후 단위 파일을 업데이트한 후에도 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 주소를 획득하는 인터페이스가 지연되기 때문입니다. 한 가지 해결책은 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 

서비스 파일에서는 작동하지 않지만 스크립트는 작동하는지 테스트했습니다.

관련 정보