Web Server Up Script

I hade some problems with this web server when I was on a business trip i Japan. It was very frustrating not being able to restart the web server remotely which would have made the trick (in this case).

To handle this I have made the following improvements.

  1. Allow access to my servers from anywhere in the world through a trusted relay. I only permit SSH access from a set of "semi-trusted" ISP's and not everyone in the world. I have complemented this setup with a single trusted relay which is allowed to access my servers. This way I am able to access my servers from everywhere in the world by passing through this relay.

  2. I have created a script to test if the web server is running. If the web server isn't running I will be informed via email within an hour. Later I may also allow the web server to be restarted automatically when this happen.

The web server test script can be found below.

#!/bin/ksh

# Simple script to determine if web server is up or not
# Dependencies: curl and mail setup correctly
# Typically run from cron script

# Get the page ($1) with cURL and return the response code
get_http_page() {
    resp=`/usr/local/bin/curl -m 1 -sSfI $1 2> /dev/null | /usr/bin/grep "HTTP/1.1"`
    err=$?
    if [[ $err -ne 0 ]]
    then
        return $err
    fi
    tmp=${resp#*1.1 }
    code=${tmp%% *}
    echo "$code"
}

if [ -z "$1" ]
then
    echo "Usage: ./webserver_check <URL>"
    echo "       ./webserver_check 192.168.0.6" 
    exit 1
fi

# Try to access specified page 5 times, break if successful otherwise count failed attempts
failed=0
for i in 1 2 3 4 5
do
    code=`get_http_page $1`
    if [[ $? -eq 0 ]]
    then
        break
    fi
    ((failed=failed+1))
    sleep 2
done

# Notify user if all attempts failed
if [[ $failed -eq 5 ]]
then
    msg="Webserver on URL: $1 is down, 5 of 5 failed"
    logger "$msg"
    echo $msg | /usr/bin/mail -s 'Webserver is down!' webserver.admin@gmail.com
    echo $msg | /usr/bin/mail -s 'Webserver is down!' root
else
    msg="Webserver on URL: $1 is running $failed of 5 failed"
    logger "$msg"
fi

I run the script hourly from cron on a different machine on the same network.

# check webserver up
10      *       *       *       *       /root/bin/webserver_check.sh http://192.168.0.6