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 broader goals.

  • Setup an 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 up to setting up the LAMP web server.

Create an 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 an EC2 instance

Click on Launch Instanceto create a new instance.

Run a Linux machine

Choose Amazon Linuxfrom the listed options for machine images.

Choose an Instance Type

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

Review your EC2 instance

All done! 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.

Add a custom rule

Take a look at this post if you want to SSH into your EC2 instance programmatically.

How to SSH into an EC2 instance using Boto3

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.

Setup Your Domain

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

Edit Namespace for your Domain

Once you have created a Hosted zone, you will be able to see associated namespace records for it. Edit these NSrecords 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.

Add a A Record

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

That’s it. Your Hosted Zone is now set up. You can also set up a subdomain in 4 easy steps by following this step by step guide.

How to Create a Subdomain in Amazon Route 53?

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.

Follow the wizard to complete the Load Balancer settings.

Define Load Balancer Properties

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

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.

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.

Map with an EC2 instance

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

Create tags

Tags are optional and help to identify your resources.

All done! Your load balancer is now set up.

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.

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 an 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.

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


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 {} \;

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 the 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 the configuration of YOURLS on this web server in the next story.

You can buy me a coffee if this post really helped you learn something or fix a nagging issue!

Written on December 3, 2017 by Vivek Maskara.

Originally published on Medium

Vivek Maskara
Vivek Maskara
SDE @ Remitly

SDE @ Remitly | Graduated from MS CS @ ASU | Ex-Morgan, Amazon, Zeta