This is the 2nd part of the 3-part guide on Installing, Configuring and Deploying a Python Web/Flask application on an Ubuntu system that uses NGINX and uWSGI. For the installation part go here. For the configuration part go here.



  • Ubuntu 18.04
  • Python 3.x has been installed. For instructions see here.
  • Pip and Virtual Environment has been installed. For instructions see here.
  • Installed NGINX, uWSGI, and uWSGI-Emperor from previous guides.
  • Configured NGINX, uWSGI and uWSGI-Emperor from previous guides.


Deploy a Flask App/API using uWSGI and NGINX

Note: For this demo, we used the sample flask app and a python virtual environment. And it will be located under /var/www

01. Create the following directories and files

Directories and file structure

|__ /var/www

  |__ geek_flask_app

    |__ api

      |__ __init__.py

      |__ res

        |__ __init__.py

        |__ endpoints.py

    |__ app_wsgi.py

    |__ requirements.txt


Or create the files and directories using the following commands

$ cd /var/www

$ sudo mkdir -p geek_flask_app/api/res


/var/www/geek_flask_app/api/__init__.py content

from flask import Flask

application = Flask(__name__)

import api.res.endpoints



from api import application



# -*- coding: utf-8 -*-

from flask import jsonify
from api import application

@application.route('/', methods=['GET'])
def get_app_properties():
  name = 'geek-flask-api'
  version = '0.0.1'

  app_properties = \
    'name': name
    , 'version' : version

  return jsonify(app_properties)





02. Install python libraries that is required by your application.

Note: Since we are using a virtual environment, activate the virtual environment and install the python libraries. See the Setup the Python Virtual Environment section.

$ source ~/geek-venv/bin/activate

(geek-venv) [email protected]{host}:~$ cd /var/www/flask_app

(geek-venv) [email protected]{host}:~$ pip install -r requirements.txt

(geek-venv) [email protected]{host}:~$ deactivate


03. Reload the uwsgi-emperor service.

$ sudo service uwsgi-emperor reload


04. To verify if the flask app is deployed, test using the http-socket defined in uwsgi configuration.

$ curl


It should return a JSON structured response



05. Next is to verify if NGINX can communicate with our Python Flask app on uWSGI. Restart the NGINX server

$ sudo service nginx restart


06. Verify using cURL on the NGINX.

$ curl http://localhost


It should also show the same response



Next steps is to configure your DNS and map it to your NGINX configuration. And you should next configure the previously commented gid and uid to use the proper user, an example is “www-data”.

Click here for Part 01 and here for Part 02.

Previous Microsoft Build 2019 | DevOps – Where to start?
Next How To: Shutter Screenshot Tool For Ubuntu - Installation And Shortcuts