So in this blog, we will be hosting a django application with a postgreSQL database on an Amazon EC2 instance. So let's get the basics right!
What is server and client?
In simple terms, A program that gives you some kind of service is known as a server, and the one who takes the service is called a client.
For eg. You are a web developer and you have built a website that is now only available locally but you need to make it public, To make it public you need a program, that renders you that specific service, we can call that program a server. The main user case here is to serve the web pages so the server is called a web server. When it is public and somebody visits the website they are called a client. This kind of architecture is called client-server architecture. The protocol the client uses here is HTTP(Hyper Text Transfer Protocol)
How to configure a web server?
I have created a thumb rule, which we can use to configure any server in this world which am going to share here. It is 3 steps process. If you follow this process your server will be configured. Before saying the 3-step process, lemme give you an example. You guys know the VLC player, the audio video player, think that VLC is one kind of server, why? because they are giving service to you. we are the client for the VLC player. If you want to use the vlc player, what all we have to do? first, we need to download it, then after you need to set and change the look and feel, you need to set some shortcuts, in short, you need to configure it and lastly if you want you want to double click the video/audio to play, it means you need to execute. These same steps you can use to configure any web server.
Three steps are:
- Install Software
- Configure
- Execute/Run
Configuring web server on Amazon EC2
Now you guys know how things are working behind the scenes and that is enough theory, let’s get our hands dirty.
I hope you guys know how to start an instance in AWS, which is a couple of button clicks, and you're familiar with django concepts. The instance I am configuring here is Ubuntu 20.4. As it is Ubuntu, amazon allows us to connect through a browser, so connect it and follow along with me.
1. Install Apache
Let’s start by updating the local package index with the following command.
sudo apt update
sudo apt upgrade
Install the Apache2 package from the Ubuntu repository.
sudo apt install apache2
This will install apache2
all required dependencies.
So the apache2 is installed, and the first step is finished. Installation of software!
Now we proceed to the next step, which is configuring part!yeeesss!
2. Setup firewall
Now you can set up an Uncomplicated Firewall (UFW) with Apache to allow public access on default web ports for HTTP
and HTTPS
sudo ufw app list
You will see all listed applications.
Output
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
- Apache: This profile opens the port
80
(normal, unencrypted web traffic) - Apache Full: This profile opens both ports
80
(normal, unencrypted web traffic) and port443
(TLS/SSL encrypted traffic)If you are not going to use SSL you need to enable only the Apache profile. - Now we will enable Apache Full.
sudo ufw allow 'Apache Full'
sudo ufw allow 'OpenSSH'
- If you allow OpenSSH after your restart you will be able to connect to the server
- Apache Secure: This profile opens only port
443
(TLS/SSL encrypted traffic) - OpenSSH: This profile opens the port
22
for SSH access.
With this command, you can view the status of UFW.
sudo ufw status
You will see the output as follows.
Output
Status: active
To Action From
-- ------ ----
Apache Full ALLOW Anywhere
OpenSSH ALLOW Anywhere
Apache Full (v6) ALLOW Anywhere (v6)
OpenSSH (v6) ALLOW Anywhere (v6)
If you didn’t see active and seeing inactive, type this command
sudo ufw enable
Once Apache is installed it is started automatically and already up and running.
Every process in Apache is managed with the systemctl
command. Check the status of Apache with the following command.
sudo systemctl status apache2Output
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Tue 2020-01-06 03:59:34 UTC; 5min ago
Main PID: 10617 (apache2)
Tasks: 55 (limit: 667)
CGroup: /system.slice/apache2.service
├─10617 /usr/sbin/apache2 -k start
├─10619 /usr/sbin/apache2 -k start
└─10620 /usr/sbin/apache2 -k start
Jan 06 03:59:34 apache systemd[1]: Starting The Apache HTTP Server…
Jan 06 03:59:34 apache systemd[1]: Started The Apache HTTP Serve
Now visit the External IP address of your VM instance, you will see the default Apache welcome page.
Cloning the django application on the server
We need to first download all the Python packages and configure our webserver
sudo apt install python3
This command will install the required packages for creating our virtual environment.
Next am going to create a django project directory on /srv
cd /srv/
mkdir django
cd django
mkdir projectname
After that create a virtualenv and clone the project file there.
python3 -m venv venv
git clone <repository code>
After we clone our repository, we need to configure the postgreSQL database.
sudo apt update
sudo apt install postgresql postgresql-contrib
After that create a db according to the database configured on the settings.py or create a new database and user and mention it on the settings.py file
sudo su postgres
Then I created the database and user
psql
Enter into the Postgres shell and permit the user to access the database.
grand all privileges on database <database name> to <database user>;
GRANT- This message will be shown,if it is successful.
So after that, you can migrate all your tables and run the application. The application will run on the local server, but to access this app publically we need to configure Apache
Configuring Apache
To get everything we need, update your server’s local package index and then install the appropriate packages
sudo apt-get update
sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3
sudo a2enmod wsgi
Then mention the IP address in the allowed host in settings.py
ALLOWED_HOSTS = ["server_domain_or_IP"]
next, we need to configure the Apache config file.
sudo nano /etc/apache2/sites-available/bescareer.conf
If you are running on IP, you need to disable the default Apache config file or edit “/etc/apache2/sites-available/000-default.conf” instead of “/etc/apache2/sites-available/bescareer.conf”.
a2dissite 000-default.conf # for disable
next specify the project directory root addresses, here am using mine as an example
<VirtualHost *:80>
. . .
Alias /static /srv/django/bestcareer/src/bescareer/static
<Directory srv/django/bestcareer/src/bescareer/static>
Require all granted
</Directory>
<Directory srv/django/bestcareer/src/bescareer/bestcareer>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess myproject python-home=/ srv/django/bestcareer/venv python-path=/srv/django/bestcareer/src/bestcareer
WSGIProcessGroup myproject
WSGIScriptAlias / /srv/django/bestcareer/src/bestcareer/bestcareer/wsgi.py
</VirtualHost>
After this, save the file and
a2ensite name.conf
Run a config test to verify every syntax is clear. To check that use the command
sudo apache2ctl configtest
If it returns syntax ok, then the syntax is okay, if not, check for syntax and clear the mistakes.
Then,
service apache2 restart
So by doing this you have successfully configured a webserver and hosted your first application on AWS.
Cheers!