Deploying Flask App's with Apache and mod_wsgi

Friday, January 19, 2018

Deploying Flask applications with mod_wsgi can be tricky. I hope this post makes it clear for you!

Getting started:

Let's suppose you just want to develop, and proof-of-concept your application with mod_wsgi. One of the core developers of mod_wsgi has put together a set of potentially "production ready" Dockerfile's. Whether or not these are production ready, it certainly removes the substantial overhead of learning how to configure apache and mod_wsgi.

How to use these Dockerfile's:

Create a Dockerfile something like this:

FROM grahamdumpleton/mod-wsgi-docker:python-3.5-onbuild USER
$MOD_WSGI_USER:$MOD_WSGI_GROUP CMD [ "/app/wsgi.py" ]

Create a wsgi.py file something like this:

import os from myapp_module import create_app

application = create_app(os.environ.get('APP_MODE'))

As far as I have been able to tell the only thing you really need is a Python module, that has an application object defined in it.

Then to build and run this Dockerfile:

$ docker image build -t modwsgi .  $ docker container run -it --rm -p 8000:80 -d
--name modwsgi modwsgi

Visit localhost:8000, and profit💰. Don't forget to stop the container when you are done (docker container stop).

Deploying elsewhere:

What if you can't use Docker, no problem! It requires a bit more work, but don't worry. This documentation on virtualenv is important. Also the Flask docs have a section on mod_wsgi that is very relevant.

In a nutshell:

This wsgi.py file becomes this for Python 3 (for Python):

import os

activate_this = '/path/to/env/bin/activate_this.py' with open(activate_this) as file_:
exec(file_.read(), dict(__file__=activate_this))

from myapp_module import create_app

application = create_app(os.environ.get('APP_MODE'))

What is activate_this.py?

It is a file that virtualenv sets up for you. Note: python3.5 -m venv venv does not create this file!

Recall that creating a virtual environment goes like this:

$ virtualenv -p python3 venv $ virtualenv -p python2 venv

If you look in the venv/bin/ directory you'll see activate_this.py.

Wrapping up Deploying elsewhere..

I'm taking the easy way out here. I'm not going to explain how to set up Apache and mod_wsgi. I don't know how to :) right now. There are plenty of tutorials out there for that.

But eventually mod_wsgi will be looking for wsgi.py set up as above.

Note: mod_wsgi can read from .py files, but it seems to be a standard to read from .wsgi files (but they are just Python files AFAICT).