How-To: Deploy Python Flask applications using NGINX and uWSGI – Deployment (Part 3 of 3)

This is the last part of the 3-part guide on setting up a Python/API application on Ubuntu 22.04 with NGINX as the web server and uWSGI and uWSGI Emperor which is responsible for loading the application. 

If you’ve missed the installation part, see here. If you’ve finished the installation but not the configuration go here.


  • Ubuntu 22.04
  • Installed NGINX, uWSGI, and uWSGI-Emperor.
  • Performed basic configuration of NGINX, uWSGI and uWSGI-Emperor from the 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
            |__ res
        |__ requirements.txt

Or create the files and directories using the following commands

$ cd /var/www
$ sudo mkdir -p geek_flask_app/api/res

02. Create the init file

$ sudo nano /var/www/geek_flask_app/api/

Set the content as follows

from flask import Flask
application = Flask(__name__)

import api.res.endpoints

03.Create the WSGI python file

$ sudo nano /var/www/geek_flask_app/

Set the content as follows

from api import application

04. Create the endpoints python module. This will contain the exposed application service endpoints.

$ sudo nano /var/www/geek_flask_app/api/res/

Set the content as follows

# -*- 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)

04. Setup the requirements text file. It contains the required python libraries. In this example, we only need flask.

$ sudo nano /var/www/geek_flask_app/requirements.txt

Set the content as follows


05. Install python libraries that are 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/geek_flask_app
(geek-venv) [email protected]{host}:~$ pip install -r requirements.txt
(geek-venv) [email protected]{host}:~$ deactivate

03. Restart the uwsgi-emperor service.

$ sudo service uwsgi-emperor restart

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. We now have to remove the default NGINX configuration.

$ sudo rm /etc/nginx/sites-enabled/default

06. Restart the NGINX server

$ sudo service nginx restart

07. Verify using cURL on the NGINX. 

$ curl http://localhost

It should also show the same response when communicating with the port defined in uWSGI.


Next step 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”.

Previous Article

Upskill For In-Demand Cloud Roles With No-Cost Training On Coursera

Next Article

Securing Cloud Run Deployments With Binary Authorization

Related Posts