This is Part 3 of my tutorial for Flask Webserver Deployment. In the last section we prepared our server for serving a Flask application. We created a small Flask test application and finally started up the Flask development server. In this part we will use a more production ready server called Gunicorn to run the application.
Content of this Tutorial
- Part 1: Choosing the right webservice provider
- Part 2: Flask Development Server
- Part 3: Gunicorn WSGI Server
- Part 4: Nginx Proxy Server
Gunicorn
Installation
Gunincorn 'Green Unicorn' is a Python WSGI HTTP Server for Unix. It is ported from Ruby's Unicorn project and it is supposed to be "simply implemented", "light on server resources" and "fairly speedy".
We can easily install Gunicorn via Pythons package installer pip. Make sure to change to the virtual environment we created in the last part of the tutorial and install it:
$ cd /home/apps $ source /venv/bin/activate (venv) $ pip install gunicorn
WSGI Script
Gunicorn expects a Python module with a WSGI object in it. So we create an new Python module named wsgi.py containing the following line of code:
from app import app as application
This module only opens up our app module and imports Flasks WSGI app object.
Now we can start our server by calling:
(venv) $ gunicorn wsgi -b127.0.0.1:80 [2016-04-28 23:22:43 +0000] [1476] [INFO] Starting gunicorn 19.4.5 [2016-04-28 23:22:43 +0000] [1476] [INFO] Listening at: http://0.0.0.0:5000 (1476) [2016-04-28 23:22:43 +0000] [1476] [INFO] Using worker: sync [2016-04-28 23:22:43 +0000] [1479] [INFO] Booting worker with pid: 1479
Supervisor
Installation
We got our Gunicorn server working but it is a bit inconvenient. We need to manually activate our virtual environment and start up the Gunicorn server. Actually we want our server to startup automatically. To achieve this we will use a process control system called supervisor. It is a Python2 application so in order to use it we will leave our virtual environment. Make sure you have installed the Python2 packages python and python-pip.
(venv) $ deactivate $ apt-get install python python-pip ... $ pip install supervisor
Configuration
We need a startup script that does the following things for us:
- activate our virtual environment
- start the Gunicorn server
We create a new file called run_flaskapp.py in /home/apps with the following lines of code:
#!/bin/bash # activate virtualenv cd /home/apps source venv/bin/activate # run gunicorn exec gunicorn wsgi -b0.0.0.0:80
Supervisor comes with a config template which we will copy in our actual supervisord.conf file.
$ echo_supervisord_conf > /etc/supervisord.conf $ vim /etc/supervisord.conf
We add our flasktest app here by adding the following text at the bottom of /etc/supervisord.conf:
[program: flasktest] command=/home/flasktest/run_flasktest.sh directory=/home/flasktest user=apps autostart=true autorestart=true stdout_logfile=/tmp/flasktest.log stderr_logfile=/tmp/flasktest_error.log
Run it
We start the supervisor daemon by calling:
$ supervisord ...
This should automatically startup our flasktest app. Now we can use supervisorctl to start and stop our application:
$ supervisorctl start flasktest flasktest: started $ supervisorctl status flasktest flasktest RUNNING pid 1504, uptime 0:00:49 $ supervisorctl stop flasktest flasktest: stopped
Autostart
To automatically startup the supervisord daemon and with it our application on system start we need an init script. Luckily somebody had the idea of writing it for us and putting it on GIT. We can find init scripts for different Linux distributions on https://github.com/Supervisor/initscripts.git.
In my next post we will put our Gunicorn application server behind a Nginx proxy server for increased savety reasons.