Deploying Masonite To AWS
In this article we are going to walk through the steps of deploying your Masonite python project to an EC2 instance on AWS. We are going to be using Ubuntu 18.04 LTS, Nginx as a front-end reverse proxy and uWSGI as the application server.
Prerequisites
Before moving on there are a few prerequisites.
- An AWS account
- A Masonite project ready to be deployed
- All your dependencies should be inside your requirements.txt so we can easily install them.
- Some knowledge of AWS and EC2
Step 1 - Spin Up An EC2 Instance
Our first step is to get an EC2 instance up and running with Ubuntu 18.04 LTS. Let's go ahead and open up the AWS console and head over to the EC2 dashboard. Launch an instance and make sure to select the Ubuntu 18.04 image. You can choose any instance type but I chose a T2 Nano for this purpose. Be sure to edit the security group to allow HTTP traffic through port 80. You can leave everything else as is for now. Just go ahead and click Review & Launch. Don't forget to download the Key Pair so we can SSH into the instance.
Step 2 - Install Nginx
Once the EC2 instance is up and running, SSH into it so we can install Nginx.
sudo apt update
sudo apt install nginx
This will install Nginx and all the required dependencies. To confirm lets check the status of Nginx.
sudo systemctl status nginx
You should see something like this below
Output
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-04-06 18:32:37 UTC; 10s ago
Docs: man:nginx(8)
Main PID: 2417 (nginx)
Tasks: 2 (limit: 547)
CGroup: /system.slice/nginx.service
├─2417 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─2419 nginx: worker process
As you can see it looks as though Nginx is up and running. The best way to actually test this is to see if we can get Nginx to serve anything.
Open up a browser and visit:
http://your_ec2_ip_address
If all is working you should see the default Nginx screen
Now that we have Nginx installed and running we can move onto installing some necessary dependencies.
Step 3 - Installing System Dependencies
We need to install all the dependencies we need to get our Masonite project and uWSGI server working. We are going to install pip
and everything needed for uWSGI.
Run the following command
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools python3-venv git
Once this is done we can start setting up our python virtual environment.
Step 4 - Deploying Masonite Project
Now we need to get our Masonite project into the project folder we just created. There are a few ways to do this. We are going to use git to clone our repo.
mkdir ~/masoniteproject
cd ~/masoniteproject
git clone https://github.com/repoOwner/yourRepo .
This will install your project into our current directory. Once your project is on the EC2 instance we can move onto installing your project dependencies.
Step 4 - Virtual Environment
In order to isolate our Masonite application we need to create a Virtual Environment.
python3.6 -m venv venv
source venv/bin/activate
Those commands have created and activated our virtual environment allowing us to now install our python dependencies and our application server uWSGI
Step 6 - Installing Project Dependencies
Before we install any project dependencies we are going to install a few things we need. Make sure your virtual environment is still activated.
HINT: Please install using pip and not pip3.
Now lets install our application server uWSGI and wheels.
pip install wheel uwsgi
Finally, we can install all our project dependencies.
pip install -r requirements.txt
This will install our masonite dependencies along with any other dependencies you have placed in requirements.txt
We can now deactivate our virtual environment
deactivate
Step 7 - Creating a uWSGI configuration file
The next step is to configure uWSGI to serve our application. First we need to create a uWSGI configuration file.
nano ~/masoniteproject/project.ini
Add the following information into your project.ini
[uwsgi]
module = wsgi
callable = application
master = true
processes = 5
socket = project.sock
chmod-socket = 660
vacuum = true
die-on-term = true
Save your ini and let's move onto creating a service.
Step 8 - Creating Systemd service file
Creating a systemd unit file will allow Ubuntu to automatically start your uWSGI application server whenever it boots.
sudo nano /etc/systemd/system/project.service
Put the following information into your service file.
[Unit]
Description=uWSGI instance to serve your masonite project
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/masoniteproject
Environment="PATH=/home/ubuntu/masoniteproject/venv/bin"
ExecStart=/home/ubuntu/masoniteproject/venv/bin/uwsgi --ini project.ini
[Install]
WantedBy=multi-user.target
Save that file and now we have a service. We can now start our uWSGI server and enable it so it boots on startup.
sudo systemctl start project
sudo systemctl enable project
You can check the status of your project using this:
sudo systemctl status project
You should see something like this:
Output
● project.service - uWSGI instance to serve your masonite project
Loaded: loaded (/etc/systemd/system/project.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-04-06 18:45:27 UTC; 8s ago
Main PID: 8946 (uwsgi)
Tasks: 6 (limit: 547)
CGroup: /system.slice/project.service
├─8946 /home/ubuntu/masoniteproject/venv/bin/uwsgi --ini project.ini
├─8975 /home/ubuntu/masoniteproject/venv/bin/uwsgi --ini project.ini
├─8976 /home/ubuntu/masoniteproject/venv/bin/uwsgi --ini project.ini
├─8977 /home/ubuntu/masoniteproject/venv/bin/uwsgi --ini project.ini
├─8978 /home/ubuntu/masoniteproject/venv/bin/uwsgi --ini project.ini
└─8979 /home/ubuntu/masoniteproject/venv/bin/uwsgi --ini project.ini
If you see any errors, be sure to resolve them before continuing on to configure Nginx
Step 9 - Configuring Nginx
Let's start by creating an Nginx configuration file for our project
sudo nano /etc/nginx/sites-available/masoniteproject.conf
Put the following information into your conf file.
server {
listen 80;
server_name aws_ec2_ip_address;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/ubuntu/masoniteproject/project.sock;
}
}
To enable the Nginx server block configuration you’ve just created, link the file to the sites-enabled
directory:
sudo ln -s /etc/nginx/sites-available/masoniteproject.conf /etc/nginx/sites-enabled
Now lets restart Nginx to make our changes take effect.
sudo systemctl restart nginx
You should now be able to navigate to your EC2's IP address in your web browser:
http://aws_ec2_ip_address
You should see your masonite project in your browser.
Conclusion
Ta da! Your masonite project is now hosted on an AWS EC2 instance. Make sure you set up your .env
file. We are missing an important piece to all this though. And that is that database. I'm going to be writing another article soon about connecting your Masonite EC2 instance to an AWS RDS database. Please leave any comments or questions below and I will try to answer them the best I can.
Top comments (0)