Minimal Apache configuration for deploying a flask app (Ubuntu 18.04)
Introduction
Apache HTTP Server (usually just called Apache) is fast and secure and runs over half of all web servers around the globe.
Apache is a free software and is distributed by the Apache Software Foundation, which promotes various free and open-source advanced web technologies.
mod_wsgi is an Apache HTTP Server module by Graham Dumpleton that provides a WSGI compliant interface for hosting Python based web applications under Apache.
N.B: We would be using python3.6 for development so we should install mod_wsgi (py3)
Flask is a popular Python web framework, meaning it is a third-party Python library used for developing web applications.
Continue reading further, to learn integration of all 3 of them to achieve perks of Apache on your flask web app...
Requirements
- apache2
- mod_wsgi (for python3)
- flask
Installation Guide
- Install Apache
sudo apt update
sudo apt install apache2
- Install mod_wsgi
for python 3.6 (preferable)
sudo apt-get install libapache2-mod-wsgi-py3 python-dev
for python 2.7
sudo apt-get install libapache2-mod-wsgi-py python-dev
- Install flask or requirements.txt
(Assuming you have pip3.6 installed)
pip3.6 install flask
pip3.6 install -r requirements.txt # if you have multiple requirements to install
Check browser if it's running Apache
apache2 -f /etc/apache2/apache2.conf -k start
Let's Create our flask application
Let create a nested directory named as ExampleFlask
in home direcory (location could be anything)
mkdir -p ~/ExampleFlask/ExampleFlask
Add below 3 files in the inner ExampleFlask directory
-
__init__.py
Empty file -
my_flask_app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello world!"
if __name__ == "__main__":
app.run()
my_flask_app.wsgi
- The name of above wsgi file should be same as the flask application
- Add a shebang line to specify which interpreter to use
#! /usr/bin/python3.6
import logging
import sys
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, '/home/username/ExampleFlask/ExampleFlask')
from my_flask_app import app as application
application.secret_key = 'anything you wish'
Let's create the config file for our flask application
vim /etc/apache2/sites-available/ExampleFlask.conf
<VirtualHost *:80>
# Add machine's IP address (use ifconfig command)
ServerName 192.168.1.103
# Give an alias to to start your website url with
WSGIScriptAlias /testFlask /home/username/ExampleFlask/ExampleFlask/my_flask_app.wsgi
<Directory /home/username/ExampleFlask/ExampleFlask/>
# set permissions as per apache2.conf file
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Enable the file with a2ensite:
sudo a2ensite /etc/apache2/sites-available/ExampleFlask.conf
Restart apache2
So, the new changes could take effect.
apache2 -f /etc/apache2/apache2.conf -k stop
apache2 -f /etc/apache2/apache2.conf -k start
Check browser if it's running Apache at your machine IP address, provided in config
Check browser if it's running your flask app at your machine IP address with prefix /testFlask
url : http://192.168.1.103/testFlask/
Congratulations, we have successfully deployed a flask application on ubuntu 18.04
Hi Abhishake Gupta, thank you for the article.
I did all step by step and went very well, the problems is when the URL is SSL (HTTPS). Could you guide me please?
The instructions say to create
my_flask_app.wsgi
in the innerExampleFlask
directory – that is, at/home/username/ExampleFlask/ExampleFlask/my_flask_app.wsgi
, but the givenExampleFlask.conf
references the file at the outer directory, at/home/username/ExampleFlask/my_flask_app.wsgi
.Why is it so?
Unfortunately, this tutorial doesn’t include any troubleshooting information – so when it doesn’t works, readers are left stuck trying to figure things out for themselves.
Thank you for going through the tutorial and suggestions.
The article is updated now
Does my flask application need to have the same name as my domain?
No