Apache will not start, and systemctl status apache2 or the error log shows:
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
Error 98 is EADDRINUSE. Apache asked the kernel to listen on a port and address that something else already holds. Nothing is wrong with Apache itself. The job is to find out who owns the port.
Windows reports the same situation as "make_sock: could not bind to address 0.0.0.0:80" with error 10048. The steps below use Linux commands, but the logic is identical.
Step 1: see who is listening
sudo ss -ltnp 'sport = :80 or sport = :443'
Output like users:(("nginx",pid=812,fd=6)) names the process. If lsof is installed, sudo lsof -iTCP:80 -sTCP:LISTEN shows the same. Then decide which of these you have.
Case A: another web server owns the port
The usual suspects are nginx, Caddy, Varnish, HAProxy, Docker's published port, or a second copy of Apache.
- nginx installed alongside Apache (a common package side effect): stop and disable the one you do not want, or move one of them to another port.
- Docker container publishing 80:80: check
docker psand see Docker bind address already in use. - Varnish or another proxy in front: it should listen on 80 and Apache on a backend port such as 8080.
sudo systemctl disable --now nginx # example: if you want Apache to own 80
sudo systemctl start apache2
If instead nginx should keep the port, see the nginx side in nginx bind address already in use.
Case B: an old Apache process is still running
A crashed or badly stopped Apache can leave children running that keep the socket open. ss will show apache2 or httpd with a PID.
sudo systemctl stop apache2
sudo pkill -x apache2 # use httpd on RHEL-family systems
sudo ss -ltnp 'sport = :80' # confirm it is empty
sudo systemctl start apache2
Check apachectl status or ps aux | grep -E 'apache2|httpd' afterward to be sure only one parent process exists.
Case C: duplicate Listen directives
Apache can conflict with itself. Listing Listen 80 twice, or adding Listen 443 in two files, produces the same error. Debian keeps listeners in /etc/apache2/ports.conf; RHEL-family systems use Listen in /etc/httpd/conf/httpd.conf, with extra files in conf.d.
grep -rniE '^\s*Listen' /etc/apache2/ /etc/httpd/ 2>/dev/null
Keep one line per port. Also note that Listen 80 binds all addresses, while Listen 192.0.2.10:80 binds only one. Mixing a wildcard listener with a specific one on the same port fails. Pick one style.
A related trap: a Listen [::]:80 alongside Listen 0.0.0.0:80 can conflict on systems where the IPv6 wildcard socket also accepts IPv4. Use a single Listen 80 unless you have a reason not to.
Do not confuse it with permission errors
Ports below 1024 need root or the CAP_NET_BIND_SERVICE capability, and on SELinux systems a non-standard port such as 8080 must be labeled for the http type (sudo semanage port -a -t http_port_t -p tcp 8080). Both produce a permission-denied error, not (98)Address already in use. Read the number in parentheses before changing anything.
How to verify
After fixing, run:
sudo apachectl configtest
sudo systemctl restart apache2
sudo ss -ltnp 'sport = :80'
You should see exactly one Apache parent listening. From outside the server, test the port with the Port Checker and check the site answers with the HTTP Status Checker. If you cannot reach it from outside even though it listens locally, a firewall or cloud security group is blocking it; that is a different problem, covered in ERR_CONNECTION_REFUSED. An Uptime Monitor will flag the next time a restart fails.
Next steps
- Check the open ports with the Port Checker.
- Read about the nginx variant: nginx bind() address already in use.
- Compare setups in Apache vs nginx troubleshooting.
- Monitor with the Uptime Monitor.
FAQ
What does error 98 mean?
It is the Linux errno EADDRINUSE: the address and port combination is already bound by another socket. The same number appears in nginx, Node.js and Docker errors.
Can Apache and nginx run on the same server?
Yes, if they listen on different ports or addresses. A common layout is nginx on 80 and 443 proxying to Apache on 8080 or a Unix socket.
Why does it work after a reboot but not after a restart?
A leftover process survived the restart, often a child that was not stopped in time. Stop the service fully, kill stragglers and confirm the port is free before starting again.
Does this error affect only port 80?
No. The message names the port that failed. If it says 443, look for another TLS listener, a duplicate Listen 443, or a proxy using that port.
Get notified when this fix updates
Plus occasional practical tips on uptime and monitoring, nothing else. Unsubscribe anytime.
This page is general information written by our editorial team and updated when documentation changes. Servers and providers differ, so test changes safely first. See our editorial policy and disclaimer.