How to Install Flask on Ubuntu 22.04 with Apache and WSGI

install flask on ubuntu 22.04

In this tutorial, we are going to show you how to install the Flask application on Ubuntu 22.04 with Apache Web server and mod WSGI.

Flask is a very popular web framework written in Python and used by many developers worldwide. The Apache is the Web server where requests are coming to the application, and the Mod WSGI is the Apache module that implements a WSGI-compliant interface for hosting Python-based web applications.

Installing Flask with Apache and WSGI on Ubuntu 22.04 is a process that may take up to 30 minutes. Let’s get started!

Prerequisites

  • A server with Ubuntu 22.04 as OS
  • User privileges: root or non-root user with sudo privileges

Step 1. Update the System

Before installing the software, we need to update the system packages to the latest versions available.

sudo apt-get update -y && sudo apt-get upgrade -y

Step 2. Install Apache Web Server

To install the Apache Web server execute the following command:

sudo apt install apache2 -y

Once installed, start and enable the service.

sudo systemctl enable apache2 && sudo systemctl start apache2

Check if the service is up and running:

sudo systemctl status apache2

You should receive the following output:

root@host:~# sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-11-07 13:30:41 CST; 1 week 0 days ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 747 (apache2)
      Tasks: 55 (limit: 4575)
     Memory: 11.3M
        CPU: 49.680s
     CGroup: /system.slice/apache2.service
             ├─  747 /usr/sbin/apache2 -k start
             ├─70464 /usr/sbin/apache2 -k start
             └─70465 /usr/sbin/apache2 -k start

Nov 13 00:00:02 host.test.vps systemd[1]: Reloading The Apache HTTP Server...

Step 3. Install Python

We need to install the latest version of python3 for Ubuntu 22.04 and the python package manager pip along with the python virtual environment. To achieve this execute the following commands:

sudo apt-get install python3 python3-pip python3-venv

To check the installed python version, execute the following command:

python3 -V

You should get the following output:

root@host:~# python3 -V
Python 3.10.6

Step 4. Install Flask Application

The next step is to install and deploy the flask application in the virtual environment.

To create the virtual environment in the opt directory, execute the following command:

cd /opt && mkdir flask-app

cd flask-app

python3 -m venv flask-venv

Once the virtual flask environment is created, you need to activate it using the following command:

source flask-venv/bin/activate

The command prompt will change and will look as described below:

root@host:/opt/flask-app# source flask-venv/bin/activate
(flask-venv) root@host:/opt/flask-app#

The next step is to install the flask application inside the virtual environment with the following command:

pip3 install flask

The successfully installed flask application will have the following output:

(flask-venv) root@host:/opt/flask-app# pip3 install flask
Collecting flask
  Downloading Flask-2.2.2-py3-none-any.whl (101 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 101.5/101.5 KB 2.4 MB/s eta 0:00:00
Collecting click>=8.0
  Downloading click-8.1.3-py3-none-any.whl (96 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 96.6/96.6 KB 4.3 MB/s eta 0:00:00
Collecting itsdangerous>=2.0
  Downloading itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting Werkzeug>=2.2.2
  Downloading Werkzeug-2.2.2-py3-none-any.whl (232 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 232.7/232.7 KB 4.8 MB/s eta 0:00:00
Collecting Jinja2>=3.0
  Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.1/133.1 KB 4.0 MB/s eta 0:00:00
Collecting MarkupSafe>=2.0
  Downloading MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25 kB)
Installing collected packages: MarkupSafe, itsdangerous, click, Werkzeug, Jinja2, flask
Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.2.2 click-8.1.3 flask-2.2.2 itsdangerous-2.1.2

Next is to create a sample flask application python file:

sudo nano app.py

Insert the following lines of code:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World'

Save the file, close it and set up the FLASK_APP environment variable.

export FLASK_APP=app.py

Now, we can test the application by running the following command:

flask run --host=0.0.0.0

You will receive the following output:

(flask-venv) root@host:/opt/flask-app# flask run --host=0.0.0.0
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://YourServerIP:5000
Press CTRL+C to quit
Hello World
YourServerIP - - [15/Nov/2022 07:37:13] "GET / HTTP/1.1" 200 -

As you can see in the output, this is a development server and is not recommended in a production deployment. We need to use the WSGI server instead. You can quit the running process with the CTRL+C command and deactivate the environment with the deactivate command for now. In the next step, we will configure the Apache Web server with mod WSGI.

(flask-venv) root@host:/opt/flask-app# deactivate
root@host:/opt/flask-app#

Step 5. Create WSGI file

Before we create a wsgi file in the virtual flask environment, we first need to install some packages on the server level. To install the required libraries, execute the following command:

sudo apt-get install libapache2-mod-wsgi-py3

Once installed, create the file:

sudo nano /opt/flask-app/flask-app.wsgi

Paste the following lines of code, save and close the file.

import sys
sys.path.insert(0,'/opt/flask-app')

from app import app as application

We are done with this part. Let’s go to the next step.

Step 6. Create Apache Virtual Host File

Now, in the last step, we will create an Apache virtual host file and will configure it to work with the Mod WSGI parameters and flask-app.wsgi file.

touch /etc/apache2/sites-available/flask.conf

Open the file, and paste the following lines of code:

<VirtualHost *:80>
ServerName yourdomain.com
DocumentRoot /opt/flask-app/

WSGIDaemonProcess app user=www-data group=www-data threads=5 python-home=/opt/flask-app/flask-venv
WSGIScriptAlias / /opt/flask-app/flask-app.wsgi

ErrorLog ${APACHE_LOG_DIR}/flask-error.log
CustomLog ${APACHE_LOG_DIR}/flask-access.log combined

<Directory /opt/flask-app>
WSGIProcessGroup app
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Require all granted
</Directory>
</VirtualHost>

Enable the Apache2 configuration file:

sudo a2ensite flask.conf

Check the syntax of the Apache2 configuration.

apachectl -t

You should receive the following output:

root@host:~# apachectl -t
Syntax OK

If you receive this output, you can restart the Apache service safely.

sudo systemctl restart apache2

Now, you can access the Flask Web interface via your domain at http://YourDomain.com.

That’s it. Congratulations, you successfully installed and configured Flask Application on Ubuntu 22.04 with Apache and WSGI. If you find this process difficult, you can always contact our technical support, who will help you with any aspect of this configuration. Feel free to contact us anytime you want. We are available 24/7.

If you liked this post about installing Flask on Ubuntu 22.04 with Apache and WSGI, please share it with your friends on social networks or simply leave a reply below.

4 thoughts on “How to Install Flask on Ubuntu 22.04 with Apache and WSGI”

    • You can follow our blogpost at https://www.rosehosting.com/blog/how-to-install-lets-encrypt-with-apache-on-ubuntu-22-04/ to install a free SSL certificate from Let’s Encrypt

      Reply
  1. Very clear and complete tutorial. I’m migrating from Perl DBI / CGI.pm to Python SQL Alchemy and Flask / Apache and this was a great jumpstart. One thing I would mention is that if you need an SSL connection change the first line in the flask.conf to read:

    Reply
  2. Great article, but a few missing steps. I was able to figure out after much extra reading, hopes this helps someone (or myself next time I use this article).
    1. You need to make sure the permissions/file ownership in the /opt/flask-app isn’t root but the logged in user. This is done using the chown command. -R is recursive so changes ownership of all subfolders and $USER:$USER means that linux replaces with the currently logged in username (no need to change this, leave as $USER)
    sudo chown -R $USER:$USER /opt/flask-app

    2. Under step #6, create Apache Virtual Host File, in the pasted code you need to change user=www-data group=www-data from www-data to whatever your username and groupname is. In my case I was ubuntu as both.

    3. You need to add the following lines to the main apache config file. In my case it was called apache2.conf but has also been called httpd.conf and is located in /etc/apache2/:

    WSGIScriptAlias / /opt/flask-app/flask-app.wsgi

    4. The default path for apache2 to pull up is 000-default.conf. You want to disable this using the:
    sudo a2dissite 000-default. This is so your sudo a2ensite flask.conf will run and not the 000-default.conf path. Not completely sure if this step is necessary.

    Reply

Leave a Comment