3

I have this in my httpd.conf:

Listen 216.XX.YY.ZZZZ:80

Just to make sure, I made sure httpd is enabled at boot:

systemctl httpd enable

When the system boots, I have:

systemctl status httpd

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2017-02-23 22:21:03 PST; 8min ago
  Process: 719 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 719 (code=exited, status=1/FAILURE)

Feb 23 22:21:00 centosXXXXXX.aspadmin.net systemd[1]: Starting The Apache HTTP Server...
Feb 23 22:21:03 centosXXXXXX.aspadmin.net httpd[719]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address 216.XX.YY.XXX:80
Feb 23 22:21:03 centosXXXXXX.aspadmin.net httpd[719]: no listening sockets available, shutting down
Feb 23 22:21:03 centosXXXXXX.aspadmin.net httpd[719]: AH00015: Unable to open logs
Feb 23 22:21:03 centosXXXXXX.aspadmin.net systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
Feb 23 22:21:03 centosXXXXXX.aspadmin.net systemd[1]: Failed to start The Apache HTTP Server.
Feb 23 22:21:03 centosXXXXXX.aspadmin.net systemd[1]: Unit httpd.service entered failed state.
Feb 23 22:21:03 centosXXXXXX.aspadmin.net systemd[1]: httpd.service failed.

I can then start it by running:

systemctl start httpd

And everything works:

systemctl status httpd


● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-02-23 22:31:53 PST; 3s ago
 Main PID: 2804 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
       ├─2804 /usr/sbin/httpd -DFOREGROUND
       ├─2805 /usr/sbin/httpd -DFOREGROUND
       ├─2806 /usr/sbin/httpd -DFOREGROUND
       ├─2808 /usr/sbin/httpd -DFOREGROUND
       ├─2824 /usr/sbin/httpd -DFOREGROUND
       └─2831 /usr/sbin/httpd -DFOREGROUND

Feb 23 22:31:53 centosXXXXXX.aspadmin.net systemd[1]: Starting The Apache HTTP Server...
Feb 23 22:31:53 centosXXXXXX.aspadmin.net httpd[2804]: AH00558: httpd:     Feb 23 22:31:53 centosXXXXXX.aspadmin.net systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.

The IP is assigned to eth0 using a normal network script in /etc/sysconfig/network-scripts/ifcfg-eth0.

Checking /lib/systemd/system/httpd.service I have:

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

The only similar problem on the net is here: https://unix.stackexchange.com/questions/207063/apache-httpd-failing-to-start-on-boot-centos-7 However, their advice:

systemctl enable NetworkManager-wait-online.service
Failed to execute operation: No such file or directory

Doesn't seem to work.

I am totally lost.

  • Do you really need to bind to a specific IP address? The answer is almost certainly no. And read freedesktop.org/wiki/Software/systemd/NetworkTarget to understand the issue. – Michael Hampton Feb 24 '17 at 13:19
  • I have an Apache web server listening to an IP address for a list of public web sites, and an Nginx server listening to ANOTHER IP address being the reverse proxy for a bunch of nodeJS apps. So YES, absolutely. They will both listen to port 80. And ANYWAY, this is something BASIC that has been done a MILLION times without bloody systemd. I am starting to understand why people dislike it so much. – Merc Feb 25 '17 at 3:04
  • systemctl enable systemd-networkd-wait-online.service doesn't work on CentOs 7. At this point I need to find a way to create a service that is up once networking is actually setup AND make httpd depend on it. The "how" part escapes me, and I am AMAZED that CentOs doesn't come with it by default – Merc Feb 25 '17 at 3:07
  • I ran # systemctl edit httpd.service and added After=network.target network-online.target remote-fs.target nss-lookup.target . I saved the file -- although nothing seems to be saved under /lib/systemd/system/httpd.service.d. I also did # systemctl enable network-online.target . Still nothing. – Merc Feb 25 '17 at 3:15
  • "If you are a developer, instead of wondering what to do about network.target, please just fix your program to be friendly to dynamically changing network configuration." Is this suggesting I patch HTTPD so that it gracefully waits for the IP to be configured before binding...? Sorry I don't mean to sound cranky, It's just that this problem is proving way more difficult than it should be – Merc Feb 25 '17 at 3:18
1

As it turns out, you need to use NetworkManager for this to work, since you want to wait for the IPs to actually be available. NetworkManager is not installed by default in CentOs 7.

So:

# yum install NetworkManager

Enable it:

systemctl enable NetworkManager-wait-online

Then:

# systemctl edit httpd.service

And add:

After=network.target NetworkManager-wait-online.service remote-fs.target nss-lookup.target

At this point, HTTPD will only start once the IP is assigned to the interface and bingo, it will actually start.

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.