This article will cover creating a Scalable Python Web Application using Flask (microframework for Python) Gunicorn (Python WSGI HTTP Server for UNIX) and NGINX on Ubuntu 14.04. There are other more full featured Python web frameworks such as Django but if you need a light weight web app or API server this stack can be a nice solution.
ATTENTION! THERE IS AN UPDATED VERSION OF THIS BLOG AT THE LINK BELOW:
How to make a Python Web App in Virtualenv using Flask, Gunicorn, NGINX on Ubuntu 18.04
Step 0
Time Matters!
sudo apt-get update sudo ntpdate pool.ntp.org sudo apt-get install ntp |
Step 1
Install PIP
sudo apt-get install python-pip |
Step 2
Install Python Development
sudo apt-get install python-dev |
Step 3
Install Flask
sudo pip install Flask |
Step 4
Install Gunicorn
sudo pip install gunicorn |
Step 5
Create a Python Flask Application
cd ~ mkdir /home/ubuntu/FLASK cd /home/ubuntu/FLASK vim hello.py |
hello.py
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run() |
Step 6
Create a pre-fork Gunicorn startup script to run your Flask Application
cd /home/ubuntu/FLASK vim gunicorn.sh |
gunicorn.sh
#!/bin/bash NAME="hello" FLASKDIR=/home/ubuntu/FLASK SOCKFILE=/home/ubuntu/FLASK/sock USER=root GROUP=root NUM_WORKERS=3 echo "Starting $NAME" # Create the run directory if it doesn't exist RUNDIR=$(dirname $SOCKFILE) test -d $RUNDIR || mkdir -p $RUNDIR # Start your gunicorn exec gunicorn hello:app -b 0.0.0.0:8080 \ --name $NAME \ --workers $NUM_WORKERS \ --user=$USER --group=$GROUP \ --bind=unix:$SOCKFILE |
chmod 755 /home/ubuntu/FLASK/gunicorn.sh |
Step 7
Create a Gunicorn upstart script
cd /etc/init/ sudo vim gunicorn.conf |
#Upstart Script description "gunicorn" respawn respawn limit 15 5 start on runlevel [2345] stop on runlevel [06] env SCRIPTS_BIN=/home/ubuntu/FLASK script chdir $SCRIPTS_BIN exec ./gunicorn.sh end script |
Step 8
Install NGINX
sudo apt-get install nginx cd /etc/nginx/conf.d/ mkdir /home/ubuntu/www sudo vim flask.conf |
flask.conf *Make sure you change the server_name
upstream gunicorn_server { server localhost:8080 fail_timeout=0; } server { listen 80; server_name your-web-app-hostname-here.com; root /home/ubuntu/www; client_max_body_size 4G; keepalive_timeout 5; proxy_read_timeout 900; location / { try_files $uri @app; } location @app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_redirect off; # pass to the upstream gunicorn server mentioned above proxy_pass http://gunicorn_server; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } |
Step 9
Start Gunicorn and NGINX
sudo service gunicorn start sudo service nginx restart |
More Information: