Comment 0 for bug 1207384

Nicholas Meyer (nickmeyer07) wrote :

Pertinent info:
Description: Ubuntu 12.04.2 LTS
Release: 12.04

apache2:
  Installed: 2.2.22-1ubuntu1.4
  Candidate: 2.2.22-1ubuntu1.4
  Version table:
 *** 2.2.22-1ubuntu1.4 0
        500 http://us.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.2.22-1ubuntu1 0
        500 http://us.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages

Issue:
Apache fails to start on boot when attempting to bind to an IPv6 address. boot.log shows the following (IP changed for privacy purposes):

(99)Cannot assign requested address: make_sock: could not bind to address [2001:db8::1]:80
no listening sockets available, shutting down
Unable to open logs
Action 'start' failed.
The Apache error log may have more information.
 * Starting web server apache2 [fail]

Starting manually (apachectl start) after boot starts the daemon as expected.

Here is the inet6 section of my /etc/network/interfaces. Again, IPs removed for privacy. The post-up/pre-down route directives are required to access my provider's network:

iface eth0 inet6 static
 address 2001:db8::1
 netmask 64
 up /sbin/ifconfig eth0 inet6 add 2001:db8::2/64
 down /sbin/ifconfig eth0 inet6 del 2001:db8::2/64
 post-up /sbin/ip -f inet6 route add 2001:db8::ff:ff:ff:ff dev eth0
 post-up /sbin/ip -f inet6 route add default via 2001:db8::ff:ff:ff:ff
 pre-down /sbin/ip -f inet6 route del default via 2001:db8::ff:ff:ff:ff
 pre-down /sbin/ip -f inet6 route del 2001:db8::ff:ff:ff:ff dev eth0

Doing a little bit of research, it appears apache is trying to bind to an IP in the tentative state. (source: http://pyro.eu.org/how-to/micro/nginx-cannot-assign-requested-address-ipv6.txt).

Adding the while loop shown on at that URL to /etc/network/interfaces did not help; however, adding it to the beginning /etc/init.d/apache2 resolved the issue. Suggest implementing something similar as a fix; have /etc/init.d/apache2 check for IPs in the tentative state and sleep until resolved.