#!/usr/bin/env bash # # JbTecWiz Support Centre -- generated fix script # # Fault : Apache will not start -- port in use, ServerName, or a bad module # Fix : Find what already holds the port # Source: https://jbtecwiz.com/support/lnx-web-apache-start # # Run as : Root shell # Expect : 15 minutes # Risk : medium # Reversible : yes # # WHEN THIS IS THE RIGHT FIX # Address already in use. # # HOW TO UNDO IT # Re-enable whichever service was disabled. # # Walks the fix one step at a time and asks before each. Steps with no # command are yours to do -- it prints those and waits. DRYRUN=1 prints # without executing; UNATTENDED=1 does not ask. # # -------------------------------------------------------------------- # NO WARRANTY - USE AT YOUR OWN RISK # # This script is provided by JbTecWiz as-is and with no warranty of any # kind, express or implied. You run it entirely at your own risk. # # JbTecWiz accepts no liability for any loss or damage arising from its # use, including but not limited to data loss, downtime, or configuration # changes that turn out to be wrong for your system. # # You are responsible for reading this script before running it, for # satisfying yourself that it suits the machine in front of you, and for # having a working backup first. Some steps cannot be undone. # -------------------------------------------------------------------- set -uo pipefail DRYRUN="${DRYRUN:-0}" UNATTENDED="${UNATTENDED:-0}" failed=0 if [ "$(id -u)" -ne 0 ]; then echo " This fix is documented as needing root. Re-run with sudo." >&2 exit 3 fi rule() { printf "\n%s\n" "$(printf '-%.0s' $(seq 1 70))"; if [ $# -gt 0 ]; then echo "$1"; fi; } prose() { echo "$1" | fold -s -w 74 | sed "s/^/ /"; } # Returns 0 when the caller should run the command, 1 when it should not. # A manual step always returns 1 -- there is nothing for the caller to run. step() { # step [command lines...] local n="$1" dotext="$2" why="$3" mode="$4"; shift 4 rule " Step $n of 4" prose "$dotext" if [ -n "$why" ]; then echo; prose "$why"; fi if [ "$mode" = "manual" ]; then echo; echo " -> Do this yourself, then press Enter to carry on." if [ "$UNATTENDED" = "0" ] && [ "$DRYRUN" = "0" ]; then read -r _; fi return 1 fi echo; printf " %s\n" "$@"; echo if [ "$DRYRUN" = "1" ]; then echo " (dry run -- not executed)"; return 1; fi if [ "$UNATTENDED" = "0" ]; then read -r -p " Run this step? [Y]es / [S]kip / [Q]uit " a case "$a" in [Qq]*) echo " Stopped at your request."; exit 0 ;; [Ss]*) echo " Skipped."; return 1 ;; esac fi return 0 } rule echo " Apache will not start -- port in use, ServerName, or a bad module" echo " Find what already holds the port" echo echo " Risk: medium Reversible 15 minutes" echo prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' rule echo if [ "$UNATTENDED" = "0" ] && [ "$DRYRUN" = "0" ]; then read -r -p " Ready? [y/N] " go case "$go" in [Yy]*) ;; *) echo " Nothing was changed."; exit 0;; esac fi if step 1 'Find the process.' '' cmd 'sudo ss -tlnp | grep -E '\'':80 |:443 '\''' 'sudo fuser -v 80/tcp 443/tcp'; then sudo ss -tlnp | grep -E ':80 |:443 ' sudo fuser -v 80/tcp 443/tcp if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 1 failed. The rest of the fix may depend on it." >&2 fi fi if step 2 'It is usually nginx installed alongside Apache, or an old Apache process that did not exit.' 'Both web servers installed and both enabled is extremely common after following two different guides. Whichever starts first wins the port and the other fails at every boot.' cmd 'systemctl is-active nginx apache2 httpd 2>/dev/null' 'ps aux | grep -E '\''apache|httpd|nginx'\'' | grep -v grep'; then systemctl is-active nginx apache2 httpd 2>/dev/null ps aux | grep -E 'apache|httpd|nginx' | grep -v grep if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 2 failed. The rest of the fix may depend on it." >&2 fi fi if step 3 'Decide which one should own the port and disable the other.' '' cmd 'sudo systemctl disable --now nginx' 'sudo systemctl enable --now apache2'; then sudo systemctl disable --now nginx sudo systemctl enable --now apache2 if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 3 failed. The rest of the fix may depend on it." >&2 fi fi if step 4 'If both are wanted, put one behind the other on a different port rather than fighting over 80.' '' cmd 'sudo sed -i '\''s/^Listen 80$/Listen 8080/'\'' /etc/apache2/ports.conf' 'sudo systemctl restart apache2'; then sudo sed -i 's/^Listen 80$/Listen 8080/' /etc/apache2/ports.conf sudo systemctl restart apache2 if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 4 failed. The rest of the fix may depend on it." >&2 fi fi rule " Confirm it worked" prose 'The intended server is listening and answering.' if [ "$DRYRUN" = "0" ]; then sudo ss -tlnp | grep -E ':80 |:8080 ' curl -sI http://localhost/ | head -3 fi rule if [ "$failed" -gt 0 ]; then echo " Finished with $failed failed step(s)." echo " Read the full write-up at https://jbtecwiz.com/support/lnx-web-apache-start" else echo " Finished." fi echo prose 'To undo: Re-enable whichever service was disabled.' rule