#!/usr/bin/env bash # # JbTecWiz Support Centre -- generated fix script # # Fault : Apache will not start -- port in use, ServerName, or a bad module # Fix : Read the configuration test output # Source: https://jbtecwiz.com/support/lnx-web-apache-start # # Run as : Root shell # Expect : 20 minutes # Risk : low # Reversible : yes # # WHEN THIS IS THE RIGHT FIX # A syntax error, a module problem, or the ServerName warning. # # HOW TO UNDO IT # a2dismod and a2disconf reverse the enables; restore edited files from # backups. # # 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 5" 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 " Read the configuration test output" echo echo " Risk: low Reversible 20 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 'Test the configuration. It names the file and the line.' '' cmd 'sudo apachectl configtest' 'sudo apache2ctl -S'; then sudo apachectl configtest sudo apache2ctl -S 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 'AH00558 about the fully qualified domain name is only a warning and never prevents startup. Silence it by setting ServerName, but do not spend time on it if the server is failing for another reason.' 'This warning appears at every start on a default install and is the thing most people latch on to. It is noise; the real error is elsewhere in the output.' cmd 'echo '\''ServerName localhost'\'' | sudo tee /etc/apache2/conf-available/servername.conf' 'sudo a2enconf servername' 'sudo systemctl reload apache2'; then echo 'ServerName localhost' | sudo tee /etc/apache2/conf-available/servername.conf sudo a2enconf servername sudo systemctl reload apache2 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 'For a module error, enable the dependency as well as the module.' '' cmd 'sudo a2enmod ssl headers rewrite proxy proxy_http' 'sudo systemctl restart apache2'; then sudo a2enmod ssl headers rewrite proxy proxy_http sudo systemctl restart 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 'Check certificate paths actually exist if SSL is involved.' '' cmd 'sudo apache2ctl -S 2>&1 | grep -i ssl' 'sudo grep -rn '\''SSLCertificate'\'' /etc/apache2/sites-enabled/ | while read -r l; do echo "$l"; done'; then sudo apache2ctl -S 2>&1 | grep -i ssl sudo grep -rn 'SSLCertificate' /etc/apache2/sites-enabled/ | while read -r l; do echo "$l"; done if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 4 failed. The rest of the fix may depend on it." >&2 fi fi if step 5 'Read the error log for anything the test does not catch.' '' cmd 'sudo journalctl -u apache2 -n 40 --no-pager' 'sudo tail -40 /var/log/apache2/error.log'; then sudo journalctl -u apache2 -n 40 --no-pager sudo tail -40 /var/log/apache2/error.log if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 5 failed. The rest of the fix may depend on it." >&2 fi fi rule " Confirm it worked" prose 'configtest returns Syntax OK and the service starts and serves.' if [ "$DRYRUN" = "0" ]; then sudo apachectl configtest && systemctl is-active apache2 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: a2dismod and a2disconf reverse the enables; restore edited files from backups.' rule