http://techarena51.com/index.php/deploy-flask-on-ubuntu
![Launching your Flask web application on Linux with Gunicorn and Nginx]()
Flask is a web framework for python, Flask tackles Routing, HTML template rendering, Sessions etc. If you are building web applications on Linux then I highly recommend using Flask, here’s how quickly you can build an app with it on Linux.
The inbuilt server with Flask is good for development, but sooner or later you will want to serve hundreds or even thousands of request, hence in this post I will describe how you can deploy your flask application on a production Linux servver with Gunicorn and Nginx.
Gunicorn is a WSGI HTTP server written in Python and used to serve Python files, it uses a pre-fork worker model in which it forks worker processes to handle requests. Although Gunicorn can serve as a standalone server it is recommended to use Nginx as a frontend and reverse proxy Python requests to Gunicorn.
Software versions
Ubuntu 14.04
Python 2.7.6
Linux kernel 3.13.0-24-generic
Flask 0.10.1
Gunicorn 19.2.1
Nginx 1.4.6
Installing Nginx and Gunicorn
Write some application code
![install gunicorn on ubuntu]()
Daemon-izing Gunicorn with Supervisor
Supervisor allows you to control and monitor processes on Linux. With Supervisor you can start/stop/restart Gunicorn via the command line just like an init process and view it’s logs in “/var/log/supervisor/”. One of the key benefits of Supervisor is it’s simple configuration.
Optimize
One way to speed up your app is to serve static files like Javascript and Images directly through Nginx.
![deploy flask with Gunicorn]()
Have fun

Flask is a web framework for python, Flask tackles Routing, HTML template rendering, Sessions etc. If you are building web applications on Linux then I highly recommend using Flask, here’s how quickly you can build an app with it on Linux.
The inbuilt server with Flask is good for development, but sooner or later you will want to serve hundreds or even thousands of request, hence in this post I will describe how you can deploy your flask application on a production Linux servver with Gunicorn and Nginx.
Gunicorn is a WSGI HTTP server written in Python and used to serve Python files, it uses a pre-fork worker model in which it forks worker processes to handle requests. Although Gunicorn can serve as a standalone server it is recommended to use Nginx as a frontend and reverse proxy Python requests to Gunicorn.
Software versions
Ubuntu 14.04
Python 2.7.6
Linux kernel 3.13.0-24-generic
Flask 0.10.1
Gunicorn 19.2.1
Nginx 1.4.6
Installing Nginx and Gunicorn
leo@flask:~$ sudo apt-get install python-pip python-virtualenv nginx supervisorI have installed Gunicorn in a Virtual Environment via “pip” so I can use the latest version, you can install it via “apt” as well but it does not have the latest version.
leo@flask:~$ mkdir myapp
leo@flask:~$ cd myapp
leo@flask:~/myapp$ virtualenv venv
leo@flask:~/myapp$ source venv/bin/activate
(venv)leo@flask:~/myapp$ pip install flask gunicorn
Write some application code
(venv)leo@flask:~/myapp$ vim app.pyStart Gunicorn
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Houston we have lift off'
if __name__ == '__main__':
app.run()
(venv)leo@flask:~/myapp$ gunicorn app:app -b localhost:5000You should see “Houston we have lift off” when you resolve http://localhost:5000
[2015-03-06 09:59:28 +0000] [12794] [INFO] Starting gunicorn 19.2.1
[2015-03-06 09:59:28 +0000] [12794] [INFO] Listening at: http://127.0.0.1:5000 (12794)
[2015-03-06 09:59:28 +0000] [12794] [INFO] Using worker: sync
[2015-03-06 09:59:28 +0000] [12799] [INFO] Booting worker with pid: 12799

Daemon-izing Gunicorn with Supervisor
Supervisor allows you to control and monitor processes on Linux. With Supervisor you can start/stop/restart Gunicorn via the command line just like an init process and view it’s logs in “/var/log/supervisor/”. One of the key benefits of Supervisor is it’s simple configuration.
#Add the Gunicorn configuration to SupervisorEnsure you add the complete path to the “gunicorn” command else you will get a “Error: File not found” message.
(venv)leo@flask:~/myapp$ sudo vim /etc/supervisor/conf.d/myapp
#name of the process
[program:myapp]
#command to run
command = /complete/path/to/venv/bin/gunicorn app:app -b localhost:5000
#complete path to your application directory
directory = /path/to/myapp/
#User to run the process with
user = username
#Start process at system boot
autostart=true
(venv)leo@flask:~/myapp$ sudo supervisorctl rereadTo stop or restart Gunicorn you can use
(venv)leo@flask:~/myapp$ sudo supervisorctl update
(venv)leo@flask:~/myapp$ sudo supervisorctl start myapp
(venv)leo@flask:~/myapp$ sudo supervisorctl stop myappConfigure and Start Nginx
(venv)leo@flask:~/myapp$ sudo supervisorctl restart myapp
(venv)leo@flask:~/myapp$ mv /etc/nginx/sites-enabled/default /tmp/nginx.bakYou should be able to successfully resolve localhost and view “Houston we have lift off” if everything went ok.
(venv)leo@flask:~/myapp$ vim /etc/nginx/sites-enabled/myapp
server {
location / {
proxy_pass http://127.0.0.1:5000;
}
}
(venv)leo@flask:~/myapp$ sudo service nginx start
Optimize
One way to speed up your app is to serve static files like Javascript and Images directly through Nginx.
(venv)leo@flask:~/myapp$ sudo vim /etc/nginx/sites-enabled/myappCreate a directory static and add an image file to it.
server {
location / {
proxy_pass http://127.0.0.1:5000;
}
#Serve all static files including js and css directly
location ~\.(jpg|png|gif|js|css)${
root /myapp/static/;
}
}
(venv)leo@flask:~/myapp$ sudo service nginx restart
(venv)leo@flask:~/myapp$ mkdir staticAdd some HTML code to your app to serve images
(venv)leo@flask:~/myapp/static$ll
-rw-r--r-- 1 leo_g leo_g 130868 Mar 6 18:24 myimage.jpg
(venv)leo@flask:~/myapp$ vim app.pyNow restart Gunicorn
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '''
Houston we have lift off
'''
if __name__ == '__main__':
app.run()
(venv)leo@flask:~/myapp$ sudo supervisorctl restart myapp

Have fun
