The introduction to servers I wish I'd had
Tags: servers, aws, ec2, cloud
Published: 2019-11-09 15:47:50

---
title: The introduction to servers I wish I'd had
published: true
description: In this post, I explain and demonstrate what a server is, and show you how to get and connect to a server, and host a simple web page on a server!
tags: servers, AWS, EC2, cloud
---

When I first learned to code, I had no idea what a server was, what one looked like or how I would ever end up using one.

In this guide, I'll try and provide the intro that I wish I'd had, and hopefully you'll end up with a better idea of what a server really is and how you can use one. These instructions should work whether you are on a Mac, Linux or Windows 10 machine.

### So, what is a server?

You might read all sorts of technical explanations of what a server is, but I like to describe it as *a computer that's always connected to the internet*. This is because it usually performs tasks that _need_ an internet connection, such as providing the files that make up a website. That's the scenario we'll work with for this article.

When someone uses their web browser to request a website, a request is made to a specific server for the files that make up that website, and that server is always connected to the internet and is always ready to provide those files.

![A request to a server](https://thepracticaldev.s3.amazonaws.com/i/mvt9fmc3aqzhn4d35oyc.png)

There is nothing special about that server apart from
- It's always connected to the internet
- It's always on
- It's been configured to "listen" for requests and provide the right files

Your own computer could be a server, if you really wanted.

In reality, when we need a server we tend to rent one, or part of one, that's stored with many others in a big warehouse.

![Racks of servers](https://thepracticaldev.s3.amazonaws.com/i/fs5b6g9ugj6l9e1lxolk.png)

Servers don't have screens because humans don't need to interact with them through a graphical user interface. So you tend to see a load of them all stored efficiently together in racks.

### So how do you get a server and configure it?

If you want a server, these days you tend to go to a provider such as [Amazon Web Services](https://aws.amazon.com/), [Google Cloud Platform](https://cloud.google.com/gcp/) or [Digital Ocean](http://digitalocean.com/) and "provision" yourself a server.

Let's do just that!

Most of these platforms have free tiers for new users, or generous allowances for low-use customers.

AWS allows new users a year of use of a small server, but even if you're not in your first year, we can create a server now and use it for a very short amount of time and it will only cost a few pennies.

### Sign up with AWS
If you haven't signed up for AWS before, [create an account](https://aws.amazon.com/) now! You will need an active credit/debit card to sign up but we won't be doing anything that costs money.

### Provision an instance
AWS calls servers "instances" because technically you're not getting a server of your own, you're renting "compute space" in the cloud, in other words, a virtual server which is just a small slice of space on a single piece of hardware.

But for all intents and purposes it feels like your own server. And it's much cheaper than buying a server just for yourself.

First, find the service called *EC2*:
![Select the EC2 Service](https://thepracticaldev.s3.amazonaws.com/i/0ob05bc5s8o7fw8c813h.png)

Then, choose the option to launch an instance:
 
![Launch an instance](https://thepracticaldev.s3.amazonaws.com/i/013qivbwobuxqzmafmho.png)

There are various types of instance you can choose, but only some are available in the free tier. Select the *Amazon Linux 2 AMI* type which is an instance running the latest version of Amazon's Linux operating system. Most servers run a version of the Linux Operating System.

![Selecting Amazon Linux 2 AMI](https://thepracticaldev.s3.amazonaws.com/i/9azga113c2vv5qat64kk.png)

On the next page, ensure the correct AMI type is still selected and press "Review and Launch":

![Review and Launch](https://thepracticaldev.s3.amazonaws.com/i/0fhfcu9792djnqy3c3sm.png)

When you are asked whether to use an existing Key Pair or create a new one, *create a new one* and *download it*.

![Download new key file](https://thepracticaldev.s3.amazonaws.com/i/s4mx1nvihv78jo9f31f1.png)

Your instance will then take a moment to provision, and when it does you'll be able to go to the EC2 dashboard and see a list of your running instances, probably only with 1 instance in it unless you already had some others running from before.

### Connect to your instance

We mentioned that instances don't have screens, so how can we operate them? We can remotely access and operate them from the command line, by connecting to them with a command called `ssh`. SSH (Secure Shell) is a protocol for remotely and securely connecting to and operating computers across a network.

When we use SSH to connect to our instance we will need to prove we actually have permission to take control of our instance. This is vital, or anyone could connect to our server and wreak havoc, especially since servers are usually doing business-critical, sensitive tasks such working with user data or payment details.

When creating your instance you will have downloaded a private key. This key matches a public key, stored by AWS. Only the owner of the private key will be able to connect to the instance. This is called Public Key Authentication and is a standard method for authenticating with remote servers.

First, maybe move this key file out of your Downloads directory to somewhere you'll know where to find it in the future, if you ever use it again.

Then, we need to change the permissions on the file to make them more secure:

`chmod 400 my-first-key-pair.pem`

This means that it can only be read by the owner of the file.

Finally, go to the AWS EC2 dashboard and find the public IP of the instance:

![Find the public IP](https://thepracticaldev.s3.amazonaws.com/i/fo1x1xtqd70y4memrcuq.png)

Then, use the IP to construct the below command, making sure you are providing the correct path to your .pem certificate file which you just modified, and substituting the IP address "34.244.187.6" for your instance's:

`ssh -i my-first-key-pair.pem ec2-user@34.244.187.6`

When asked whether you want to continue, type "yes" and hit enter.

You are now connected to your EC2 instance!

If you are using a Linux machine and you don't already have the `ssh` command enabled, you might need to run the following commands to enable it first:

`sudo apt update`

`sudo apt install openssh-server`

Now this command should work:

`ssh -i my-first-key-pair.pem ec2-user@34.244.187.6`

### Look around! Make some files!

Your terminal is now behaving as though it is the terminal connected to your EC2 instance. If you `ls` and `pwd` you will see that it is not your computer any more. Feel free to make some files, explore the file system.

There are no files in your home directory as it's a completely new instance but you will see plenty of standard linux files if you move to the root directory `cd /`.

### Making our instance serve a website

If we want to configure this instance to serve a website we have a do a few things:

1. Allow HTTP connections, as browsers request websites using the HTTP protocol and currently our instance only allows SSH connections
2. Configure some server software that will respond to HTTP requests by serving files
3. Create these files (or get them onto the machine somehow)

Let's do these three things...

### 1. Allow web traffic to your instance

To allow web traffic we need to configure the "security group" settings of the instance. Click on the link to "launch wizard" next to the "Security Groups" heading on the EC2 dashboard.

![Find the security group settings](https://thepracticaldev.s3.amazonaws.com/i/nwckamtjhtxyjyd595sb.png)

On the Security Groups page, ensure your security group is highlighted and then select the *Inbound* tab, and press *Edit*:

![Edit Inbound Traffic Rules](https://thepracticaldev.s3.amazonaws.com/i/3o25psl0lufrg6zxe334.png)

Add a new HTTP rule and leave the default settings that are provided. This will allow HTTP traffic into the instance from any IP address:

![Add a new rule](https://thepracticaldev.s3.amazonaws.com/i/cpaqkoj30zr84wzrkrd1.png)

Save this new rule.

### 2. Install Apache

Back in the terminal which has an SSH session established with your instance, run the following command to install a piece of software called Apache. Apache is a simple server software, and its default configuration allows it to serve static files for a single website when the instance receives HTTP requests on port 80, i.e. requests from browsers or other web clients.

We can use the `yum` package manager to install `httpd` which is the package name for Apache, weirdly.

`sudo yum install -y httpd`

### 3. Create some files

By default Apache will serve files that are created in the `/var/www/html/` directory.

`cd` into that directory and create an `index.html` file:

`cd /var/www/html`

`sudo touch index.html`

To edit this file we will have to use a command-line editor such as Vim, because we have no graphical user interface, therefore no VSCode etc!

`sudo vi index.html`

If you haven't used Vim before, you need to toggle insert/command mode using the key `i` to enter Insert mode and the Escape key to enter command mode.

Once in insert mode, create your HTML file, and when done, toggle to command mode and type `:wq` to save and quit.

![Creating a HTML file](https://thepracticaldev.s3.amazonaws.com/i/0bmvs676xazdtw530sb4.png)

### One final step: Start the server

We must start the Apache server software by running:

`sudo service httpd start`


### Visit the website

Finally, we should be able to go to our instance's public IP address in the browser and the website should be served!

![Visiting our website](https://thepracticaldev.s3.amazonaws.com/i/4ebcpm021tbnyhfq0hgc.png)

There are many more ways a server can be configured, and servers can do much more than serve a static web application - most of the time they run an application that performs some logic alongside serving static files, and often they are not used to serve an web application at all.

However, I hope this has been a useful insight into just one way that a server can be configured.

### Disconnect from your instance

To end your SSH session, hit they key combination `ctrl + D` in the terminal. You should be back on your own computer now.

### Terminate your instance

To avoid charges, don't forget to terminate your instance when you're done!

![Terminate your instance](https://thepracticaldev.s3.amazonaws.com/i/y2jrka9hfi9k3h5q50hh.png)

You can do this from AWS's EC2 dashboard. Terminating completely destroys the instance, or if you want to come back to it later you can "Stop" it and restart it again in the future. A stopped instance does not accrue charges.