Web Hosting using PHP and MySQL on AWS

It’s was a Sunday and I was bored. Then I came across a custom URL shortener service, YOURLS that I had previously used in my college days. It was very simple to set it up with my GoDaddy shared web hosting. I no longer have a web hosting package on GoDaddy so I decided to try out AWS cloud instead.

AWS is cheap and easy to get started. Our goal is to get our own custom URL shortener service up and running on http://aloudapp.in.

Before we deep dive into the details of setting up everything, here are our our broader goals.

  • Setup a EC2 instance for cloud hosting
  • Setup a hosting zone and configure DNS
  • Setup a load balancer for the EC2 instance.
  • Install a LAMP web server on the EC2 instance.
  • Configure YOURLS on the web server.

This article will cover everything upto setting up the LAMP web server.

Create a EC2 instance

An EC2 instance is a virtual server in Amazon’s Elastic Compute Cloud (EC2) for running applications on the Amazon Web Services (AWS) infrastructure.

Launch a EC2 instance

Click on Launch Instance to create a new instance.

Creata a EC2 instance

Run a Linux machine

Choose Amazon Linux from the listed options for machine images.

Choose Amazon Linux image

Choose an Instance Type

We will go for a t2.micro free instance for the purpose of this example.

Choose t2.micro free instance

Review your EC2 instance

All done! Review your settings.

Review your settings

Create Key Pair

Create a public-private key pair if you desire. This is an optional step but we recommend that you create a key pair and download it. We will be using it later on in the article to SSH into our EC2 instance.

View Launch Status

Good Going! Your instance is up and running.

Edit Security Group

Edit security group settings to allow SSH inbound traffic from your IP address.

Edit Inbound Traffic for your instance

Add a custom rule

Whitelist your IP

Domain Mapping

Next, you need to create a Hosting Zone where you would configure your DNS settings for the domain name. Here are the steps.

Create a Hosting zone

Click on Create Hosting Zone to get started.

Create a hosted zone

Setup Your Domain

Fill in your Domain Name to create a new hosted zone.

Put in your domain name

Edit Namespace for your Domain

Once you have created a Hosted zone, you will be able to see associated name space records for it. Edit these NS records for your domain. I purchased the domain from GoDaddy, so i had to go and edit these records in DNS settings for the domain on GoDaddy’s admin panel.

Edit name space on godaddy

Add a A Record

Coming back to your Hosted Zone, create a new A record. Leave the Name field empty if you don’t want to configure just for a particular subdomain.

That’s it. Your Hosted Zone is now setup.

Create a Load Balancer

Next, you need to create a Load Balancer for your EC2 instance. As described by Wikipedia,

In computing, load balancing improves the distribution of workloads across multiple computing resources, such as computers, a computer cluster, network links, central processing units, or disk drives.

Create a Classic Load Balancer

Choose a Classic Load balancer which is used for HTTP, HTTPS and TCP traffic.

Click on Create Load Balancer
Choose a Classic Load Balancer

Follow the wizard to complete the Load Balancer settings.

Define Load Balancer Properties

Define its name and protocol as depicted in the section below.

Load balancer settings

Assign Security Groups

Assign security groups to the load balancer. Create a new security group for your load balancer that allows traffic from any IP address.

Create a new Security group for load balancer

Set Load balancer’s security group to the newly created one.

Setup Health Checks

Setup health checks. Again you and go ahead with the default options as of now. We can revisit these settings later.

Default health check settings

Map with EC2 instance

Choose the EC2 instance that you created earlier for the load balancer.

Map with your EC2 instance

Create tags

Tags are optional and help to identify your resources.

Optional tags

All done! Your load balancer is now setup.

Edit Inbound Rules for EC2 instance

Go back to your EC2 instance and add a new inbound rule for it. This will allow all traffic from the load balancer.

Edit security rules for EC2

Now your EC2 instance, hosting zone and load balancer are all setup. We will go ahead and install a LAMP web server on our EC2 instance.

Connect to your Instance

  • Open a SSH client
  • Locate your private key file and provide permissions
chmod 400 amazon_ec2_key.pem
  • Connect to your EC2 instance
ssh -i "amazon_ec2_key.pem" ec2-user@ec2-13-127-42-0.ap-south-1.compute.amazonaws.com

Install a LAMP webserver

  • Check if software packages are up to date.
sudo yum update -y
  • Install the packages for php and mysql.
sudo yum install -y httpd24 php70 mysql56-server php70-mysqlnd
  • Start the http server
sudo service httpd start
  • Create a health.html file in cd/var/www/html . Put any content in the file and save it.
nano health.html
  • Edit health check settings for your load balancer.
Change health check settings

Now you should be able to see the test page when you hit the domain.

http://aloudapp.in

Set File Permissions for your User

Run the following commands to set file permissions.

sudo usermod -a -G apache ec2-user
sudo chown -R ec2-user:apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
Run these commands to give permissions to your user

Test your LAMP server

Create a PHP file in Apache document root.

echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

Open http://aloudapp.in/phpinfo.php to test it.

Secure the MySQL server

  • Start MySQL server.
sudo service mysqld start
  • Run mysql_secure_installation and set root password, remove anonymous user accounts, disable remote root login, remove test database, reload the privilege tables.
sudo mysql_secure_installation

Install phpMyAdmin

Run the following commands to setup phpMyAdmin.

sudo yum install php70-mbstring.x86_64 php70-zip.x86_64 -y
sudo service httpd restart
cd /var/www/html
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
tar -xvzf phpMyAdmin-latest-all-languages.tar.gz
mv phpMyAdmin-4.7.6-all-languages phpMyAdmin
sudo service mysqld start

Special thanks to Chetan Gulati who helped me set it up.

All done! Now your web server is up and running. We will cover configuration of YOURLS on this web server in the next story.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.