The fastest way of providing a web interface to your Python project is, in my opinion, to use Flask (http://flask.pocoo.org/). But it’s built-in web server is good only for testing and development (in my case I’ve got some strange errors like broken pipes when I tried to put in production under moderate load). So the recommended option is to use nginx and uwsgi as a web server and flash as a backend.
1) In case of a fresh installation of Ubunty 14.04 first thing you should do is to install some packages: pip for installation of usefull Python modules, python-dev in order to enable pip to install uwsgi and nginx
sudo apt-get update sudo apt-get install python-pip python-dev nginx
2) Let’s also install virtualenv. Ubunty Trusty comes with python 2.7.6 which lacks ssl library. My previous idea was to install python 2.7.9 into separate directory and to use it, but later I found cool molude named requests (http://docs.python-requests.org/en/latest/) which deal with all ssl stuff, so now I’d rather use systemwide python. But in order to isolate it from other admins who like to mess with python modules it’s better to use virtualenv
sudo pip install virtualenv
3) Now let’s create our projects directories
sudo mkdir /opt/my_flask cd /opt/my_flask
4) We will store our virtualized python here with a command
sudo virtualenv my_flask_env
5) Now we have to activate it
sudo source my_flask_env /bin/activate
And the prompt would look like:
(my_flask_env)user@host:/opt my_flask$
6) Install flask and uwsgi
sudo pip install uwsgi flask
7) Create a sample application with flask
sudo vi /opt/my_flask/my_flask.py
Here we need to import Flask module and create a route of / which will return HTML code when requested
from flask import Flask application = Flask(__name__) @application.route("/") def hello(): return "<span>Hello world!</span>" if __name__ == "__main__": application.run(host='0.0.0.0')
8) Now we have to create uwsgi entry point, which will link uwsgi with our flaks application
sudo vi /opt/my_flask/wsgi.py
from my_flask import application if __name__ == "__main__": application.run()
9) It’s time to make a configuration file for uwsgi
sudo vi /opt/my_flask/my_flask.ini
[uwsgi] socket = /tmp/uwsgi.sock module = my_flask callable = application enable-threads = true chmod-socket = 666 vacuum = true die-on-term = true req-logger = file:/tmp/reqlog logger = file:/tmp/errlog
/tmp/uwsgi.sock – is a special socket used as a pipe between nginx and uwsgi process and uses special uwsgi protocol.
die-on-term – will help to start and stop our process with init scripts,
vacuum is needed for socket clean up
10) Now let’s create an upstart script and a separate user
sudo useradd --no-create-home nginx sudo vi /etc/init/my_flask.conf
description "uWSGI server of my_flask" start on runlevel [2345] stop on runlevel [!2345] setuid nginx setgid www-data env PATH=/opt/my_flask/my_flask_env/bin chdir /opt/my_flask exec uwsgi --ini my_flask.ini
11) Starting uwsgi is simple – just type
sudo start myproject
12) Now let’s configure nginx to connect to the socket
sudo vi /etc/nginx/sites-available/default
And inside server block paste this
server { listen 80; server_name server_domain_or_IP; location / { include uwsgi_params; uwsgi_pass unix=:/tmp/uwsgi.sock } }
13)Restart nginx with
sudo service nginx restart
And that’s it. Navigate to http://server_domain_or_IP and I’ll be able to see Hello world!
You can aslo find all logs in /tmp/reqlog and /tmp/errlog