How to upload your Django Website on AWS, DIgital Ocean or VPS in just 10 minutes

Upload your Django app to AWS Ubuntu with GUNICORN and NGINX

WOLFx 5 minutes
Originally Published on: Sept. 8, 2021 Last Updated on: Sept. 12, 2022
How to upload your Django Website on AWS, DIgital Ocean or VPS in just 10 minutes

Step by Step: How to upload Django app on any Ubuntu server


Django is a powerful, but complex web development framework. Django makes it easy to build good sites without changing code, but getting started can be tough. After you have successfully create the app and tested it in your local development setup, it's time to go LIVE!


If you are looking for a stable solution that is going to work no matter what, when you try to deploy your Django Project on AWS/DIgital Ocean/Any other VPC, then this is a great place. 

This article will teach you everything you need to know about setting up Django Application in AWS/DIgital Ocean/Any other VPC Ubuntu. We will walk you through all the steps necessary for installing and deploying your Django application in AWS/DIgital Ocean/Any other VPC Ubuntu based server. You will learn how to deploy Django app in AWS/DIgital Ocean/Any other VPS Ubuntu or any Virtual Private Cloud (VPC) with shell access.

Follow this article if you have questions or phrases similar to these: How to upload my django app on nginx? how to make my django app live for production? How to upload Django on server? Upload Django on Ubuntu Server. Is it safe to just python runserver for production?

To solve all the above problems follow these steps.

Stage 1: Binding Gunicorn to Django app and checking if the upstream gunicorn is working fine.

Please note the deployment is incomplete without other stages

You have to login as Ubuntu user and NOT sudo su/root

1. sudo apt-get update

2. sudo apt-get upgrade

3. Optional - If it shows a popup/options then just select the pkg maintainer version.

4. python3 -m venv env

5. sudo apt-get install python3-venv

6. source env/bin/activate

7. pip3 install django

8. git clone <your-repo-url>

9. pip3 install gunicorn

10. sudo apt-get install -y nginx

11. cd to your project directory where, db.sqlite3 and all those files of your project is stored.

12. pip3 install -r requirements.txt

13. gunicorn --bind <project_name>.wsgi:application
Note: your project name is the main app name which you created in the beginning with django-admin startproject <project_name> command

14. You will see

[2021-09-08 15:20:17 +0000] [12789] [INFO] Starting gunicorn 20.1.0 
[2021-09-08 15:20:17 +0000] [12789] [INFO] Listening at: (12789) 
[2021-09-08 15:20:17 +0000] [12789] [INFO] Using worker: sync 
[2021-09-08 15:20:17 +0000] [12791] [INFO] Booting worker with pid: 12791 

which means you have successfully bonded your gunicorn to run your Django app and your Django app is now ready to get linked with a webserver (NGINX in our case). This marks the completion of Stage 1. To test out Stage 1 success you can type in your IP with port :8000 and see your application run (make sure your AWS security policy is allowing port 8000 else you will see a 404) but the above Booting worker with pid confirms that it's working.



Stage 2: Setting up supervisor so that your Gunicorn autostarts your Django app on reboot and after first boot.

1. sudo apt-get install -y supervisor

2. cd /etc/supervisor/conf.d/

3. sudo touch gunicorn.conf

4. sudo nano gunicorn.conf This will open up an editor where you have to type in the script for gunicorn (The bind which we did in Stage 1 but now we are telling supervisor to bind gunicorn every time the server/instance start)

directory = /home/ubuntu/<path to>
command = /home/ubuntu/env/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/<App Directory>/app.sock <App Name>.wsgi:application
autostart = true
autorestart = true
stderr_logfile = /var/log/gunicorn/gunicorn.err.log
stdout_logfile = /var/log/gunicorn/gunicorn.out.log


5. sudo mkdir /var/log/gunicorn, here we are creating the log folder for our gunicorn out and error logs.

6. sudo supervisorctl reread

7. If you see guni:available here it means your supervisor is all set and you have properly done everything till now.

8. sudo supervisorctl update

9. if you see guni: added process group this is another marker that you have properly done the steps.

10. sudo supervisorctl status

11. If you see guni:gunicorn RUNNING this is the third and final indicator that your gunicorn is now properly set up. After all these steps it is confirmed that your gunicorn is now bi-directionally communicating to an app.sock file which is automatically created inside your project directory.



Stage 3: Final step to link your Gunicorn upstream server with your NGINX

1. cd /etc/nginx/sites-available

2. sudo touch django.conf

3. sudo nano django.conf This will open up your nano editor where you have to type in these exact server settings.

server {
    listen 80;
    server_name <ipaddress or domain name> ;
    #server_name; this is how you can add multiple hosts. Do not add any comma just separate it with spaces

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/Appdir/app.sock;

4. sudo nginx -t (This will test the syntax of your config file)

5. sudo ln django.conf /etc/nginx/sites-enabled/ <---- this is a very crucial step make sure there is not typing mistake here, it creates a symlink

6. sudo nginx -t

7. sudo service nginx restart

With this you now have linked your Nginx to your gunicorn upstream on app.sock so head on to your browser and type in the IP address of your instance and you will see your app live.

If you can see your website without any CSS then you have followed everything properly, follow this article on how to serve static files of your Django app in Nginx.


Hope you found this article helpful, please do share it on your social media, it will allow us to reach out to more people who are in need for help.

Contact Us

Let's have a cup of coffee

Let's Connect

Please enter your full name
We'll never share your email with anyone else
We'll never share your phone with anyone else

Cookie Consent

Our website uses cookies to provide your browsing experience and relavent informations. Before continuing to use our website, you agree & accept of our Cookie Policy & Privacy