Turnkey Linux WordPress with vboxheadless

Posted by patrik.alienus on May 19, 2012
Geeky / No Comments

When something seems just a little too good to be true, that’s usually the way it is. There’s always some little annoying challenge to get around. Sometimes, you do become positively surprised, however.

When I started this little blog of mine, it was meant as a testing platform and never meant to go live. But, that’s how it went. And since it was so frickin’ easy to install WordPress under IIS with the help of MS Web Platform Installer, the WP installation landed in IIS.
This is something I regret, bitterly.

It turns out, that WordPress runs a crazy amount of cron jobs just to even be able to create/delete/edit posts, pages etc. In a LAMP-stsack, this is not an issue since cron is part of the system itself. On Windows, it’s a whole other ball game because PHP has to do it by itself. This is as far as I understand it anyways – correct me if I’m in the wrong here. In either case, this makes browsing of the site a pain since every click takes roughly 40 seconds to result in anything useful. Annoying, to say the least.

So, I guess I’ll just have to move it to a LAMP-stack.

Installing from scratch

My first thought was to simply install MySQL, PHP5 etc on the already existing Ubuntu Server. I did and all went smoothly, until I ran into one of those pesky show-stoppers. Because of my existing proxy solution (Apache2) for my other servers, I couldn’t get blog.alienus.se to be served up on that server – it just kept forwarding the processes to another server in-house. After lots and lots of digging into the Apache documentation, I gave up. I just couldn’t deal with it anymore. I usually don’t give up so easily, but I was motivated by installing a Turnkey Linux system instead. This would also let me separate the servers even more. Something I like.

Said and done.

Turnkey Linux. Run as service/daemon

I didn’t think that it’d be quite so simple as it actually was to install a Turnkey Linux, in my case the WordPress one. There’s usually some annoying little challenge to solve. But, I was wrong. It was amazingly simple:

You’ll need:

  • Virtualbox with vboxheadless
  • root. Duh.
Do the following:
  1. Download the OVF-file and unpack it.
  2. Move it to /root/VMs/TurnkeyWP or wherever you want it to be. I run my server as root for a variety of reasons. Do not forget to chown the files root:root if you downloaded/unpacked it as a regular user!
  3. Start Virtualbox
    If you, like me, already run a few virtual machines through vboxheadless, you’ll see some whining from Vbox about certain resources being busy. Ignore it.
  4. File > Import Appliance
  5. Open the .ovf-file and hit Finish. Rename the machine to something more suitable than “vm”…
  6. Start and follow the brilliant on-screen instructions that the geeks at Turnkey Linux have created.
  7. When all settings are done, turn off the machine.
  8. To then get the WP-box to run whenever you boot up the host machine, as well as perform a graceful shutdown when you reboot/turn off the host, do this:
    $ sudo cd /etc/init.d/
    $ sudo touch virtualbox-wp
    $ sudo chmod +x virtualbox-wp
    $ sudo pico virtualbox-wp
  9. Then you’ll copy the below script that I found through some hardcore googling (and re-scripted a bit…):
    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides:          virtualbox-!!SHORTNAME
    # Required-Start:    $local_fs $remote_fs vboxdrv vboxnet
    # Required-Stop:     $local_fs $remote_fs
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: !!LONGNAME virtual machine
    # Description:       !!LONGNAME virtual machine hosted by VirtualBox
    ### END INIT INFO
    
    # Author: Brendan Kidwell <brendan@glump.net>
    #
    # Based on /etc/init.d/skeleton from Ubuntu 8.04. Updated for Ubuntu 9.10.
    # If you are using Ubuntu <9.10, you might need to change "Default-Stop"
    # above to "S 0 1 6".
    # Do NOT "set -e"
    # PATH should only include /usr/* if it runs after the mountnfs.sh script
    
    PATH=/usr/sbin:/usr/bin:/sbin:/bin
    DESC="TurnkeyWordpress"
    NAME=virtualbox-wp
    SCRIPTNAME=/etc/init.d/$NAME
    MANAGE_CMD=VBoxManage
    VM_OWNER=root
    VM_NAME="TurnkeyWordpress" #This has to be the name exactly as it appears in your VirtualBox GUI control panel.
    
    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
    
    # Load the VERBOSE setting and other rcS variables
    [ -f /etc/default/rcS ] && . /etc/default/rcS
    
    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
    . /lib/lsb/init-functions
    
    #
    # Function that starts the daemon/service
    #
    
    do_start()
    {
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
    
        sudo -H -u $VM_OWNER $MANAGE_CMD showvminfo "$VM_NAME"|grep "^State:\s*running" >/dev/null && {
            echo "$VM_NAME" is already running.
            return 1
        }
    
        sudo -H -u $VM_OWNER $MANAGE_CMD startvm "$VM_NAME" -type vrdp >/dev/null || {
            echo Failed to start "$VM_NAME".
            return 2
        }
    
        echo "$VM_NAME" started or resumed.
        return 0
    }
    
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
    
        sudo -H -u $VM_OWNER $MANAGE_CMD showvminfo "$VM_NAME"|grep "^State:\s*running" >/dev/null || {
            echo "$VM_NAME" is already stopped.
            return 1
        }
    
        sudo -H -u $VM_OWNER $MANAGE_CMD controlvm "$VM_NAME" savestate || {
            echo Failed to stop "$VM_NAME".
            return 2
        }
    
        echo "$VM_NAME" suspended.
        return 0
    }
    
    #
    # Display "State" field from showinfo action
    #
    do_status()
    {
        sudo -H -u $VM_OWNER $MANAGE_CMD showvminfo "$VM_NAME"|grep "^State:\s*.*$"
    }
    
    case "$1" in
      start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
      status)
        do_status
        ;;
      *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2
        exit 3
        ;;
    esac
  10. Change the following things:
    DESC="TurnkeyWordpress" #Whatever you want.
    NAME=virtualbox-wp #Same as the filename, preferrably.
    VM_OWNER=root #Whatever user you'll run it as.
    VM_NAME="TurnkeyWordpress" #Have to be the EXACT name that is on the virtual machine. EXACT!!!
  11. $ sudo update-rc.d virtualbox-wp defaults

    to add the necessary start-up scripts.

  12. $ sudo /etc/init.d/virtualbox-wp start

    to start the virtual machine.

I hope this small (yet low on details, I know) guide have made your life just a little bit easier :)

If anyone wants a guide for how to move the actual blog from a Windows Server to a LAMP-stack like I have, let me know and I’ll write it up.

WordPress Appliance - Powered by TurnKey Linux