Cooking with Flask...
Cooking up some code with Flask to demonstrate Apache load-balancing.
The following is a little web environment I built to test out load balancing between Flask web apps. I need to clean up the VM hosting this and didn't want to lose the activity, so here it is in a nutshell for all to enjoy and replicate as needed. I'm not going into a lot of setup details as by the time you read this (possibly even now as I write it) the precise steps would have changed. Always consult your latest documentation.
The recipe is as follows:
- Linux host (pick your Tux)
- Apache web server (v2.4)
- Python3 with Flask modules
- Balance (https://balance.inlab.net/download/)
- Install Apache
- Install Balance module
- Configure httpd configs for Balance (see example below)
- Install Python3
- Install Flask
- Code you web apps
- Fire your web apps and see if it works!
Below are a couple of snippets from my HTTPD config file showing how the Balancer is configured and used...in this case with two nodes:
Note: I'm replacing angle brackets with regular brackets to because of how the code is rendering in my blog engine. Copy-pasters beware!
[VirtualHost *:80] DocumentRoot /var/www/html ServerName warybyte.com [Proxy balancer://mycluster] BalancerMember http://127.0.0.1:8090 BalancerMember http://127.0.0.1:8091 # Require ip 127.0.0.1 [/Proxy] # call hello app ProxyPass /hello http://127.0.0.1:8090/ ProxyPassReverse /hello https://127.0.0.1:8090/ # call howdy app ProxyPass /howdy http://127.0.0.1:8091 ProxyPassReverse /howdy http://127.0.0.1:8091/ # balance main over both ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ [/VirtualHost]
Below is one of the Flask apps...a very simple 'hello world' like app, nothing fancy, but lets me know what app I'm looking at when I'm testing the balancer
$ cat backend1.py from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Hello world!' $ cat backend2.py from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Howdy world!'
Below is the script I wrote to fire all my Flask apps together...nifty when you have a bunch or want to start them via Cron.
$ cat fireflasks.sh #$/bin/bash # clean up existing apps killall flask; echo "Proceeding with webapp start!"; # python app1 export FLASK_APP=backend1.py; flask run --port=8090 >/dev/null 2>&1 & ps -elf | grep "8090"; # python app2 export FLASK_APP=backend2.py; flask run --port=8091 >/dev/null 2>&1 & ps -elf | grep "8091"