DEV Community

Cover image for Setting Up a Multi-Tier Web Application Locally: A DevOps Guide
Purvesh Shende
Purvesh Shende

Posted on

Setting Up a Multi-Tier Web Application Locally: A DevOps Guide

For any developer or DevOps engineer, setting up and managing a multi-tier web application can be a daunting task, especially when working locally. But with the right tools, the process can be automated and simplified—saving you time and headaches. Let’s dive into how I automated the setup of a multi-tier web app using Vagrant, Oracle VM VirtualBox, and Git Bash.

Why Local Setup?

When you're in the middle of a project, making changes directly on live servers can be nerve-wracking. What if something breaks? What if it's not easily reversible? The ability to experiment and configure the entire application stack locally can make a world of difference, allowing you to research, experiment, and troubleshoot without any risk to production environments.

But manual setup? It’s often:

  • Complex — so many services, dependencies, and configurations.
  • Time-consuming — doing it from scratch every time is tedious.
  • Not repeatable — making it hard to maintain consistency across multiple environments.

The Solution? Automate it Locally

I used three core tools to automate the setup:

  • Oracle VM VirtualBox for the hypervisor.
  • Vagrant to automate the provisioning of virtual machines (VMs).
  • Git Bash as the command-line interface (CLI).

This setup allows you to automate the process of provisioning and configuring your VMs while integrating multiple services required to run a full web application. Let’s break it down.

Project Architecture: What Are We Building?

Imagine you’re setting up a social networking site written in Java. You need to configure several services across different virtual machines, and these services need to communicate seamlessly. Here’s the stack we’ll be working with:

  • NGINX — Web server and reverse proxy.
  • Tomcat — Application server.
  • RabbitMQ — Message broker.
  • Memcached — In-memory data caching.
  • MySQL — Relational database.

Step-by-Step Setup

1. Provisioning the VMs with Vagrant

Start by writing your Vagrantfile. This file contains all the configuration needed to spin up VMs with VirtualBox. Use $ vagrant up to boot your VMs and $ vagrant ssh to access them. Each service will run on its own VM.

Commands like $ vagrant global-status help you check the status of your machines. You can bring them up or down as needed with $ vagrant reload.

2. Setting Up MySQL

Once your MySQL VM is up and running, SSH into it ($ vagrant ssh db01). Start by installing MariaDB. Don’t forget to run the mysql_secure_installation script to secure your database.

From there, you can create databases, configure users, and load your SQL backups.

3. Configuring Memcached

Memcached is great for caching. Once SSH'd into your Memcached VM ($ vagrant ssh memcached), install it and open the appropriate ports for communication. With Memcached, you can speed up your app by reducing the load on MySQL.

4. Setting Up RabbitMQ

RabbitMQ is used to handle messaging and queuing in distributed systems. After SSH'ing into your RabbitMQ VM ($ vagrant ssh rmq01), install RabbitMQ and configure it to start on boot. Don’t forget to enable the necessary ports and configure user roles for messaging.

5. Deploying Tomcat

The Tomcat VM hosts your web application. After installing Tomcat, configure it to auto-start and deploy your web app using Maven. You can also create a script for automatic deployment and link it to a systemd service for even smoother operation.

6. NGINX Configuration

As the entry point to the application, NGINX handles HTTP requests and balances the load. The NGINX VM is configured to route requests to the Tomcat VM, ensuring efficient distribution of traffic.

7. Connecting It All Together

Once the services are up and running, the magic happens. Requests sent to NGINX get forwarded to Tomcat, where the application is processed. Database queries go through Memcached first for faster lookups, while MySQL holds all the actual data. RabbitMQ handles message queuing, and each component communicates seamlessly through properly configured networking and hostnames.

Wrapping Up

At the end of the day, this local setup allows you to create a repeatable and automated environment for experimenting with a multi-tier web application. You’re free to break things, fix things, and tweak the setup as much as you need without worrying about impacting live servers.

And when you’re done? $ vagrant destroy --force will tear it all down, clean as a whistle.

Top comments (0)