Skip to content

Instantly share code, notes, and snippets.

@TimSC
Last active May 5, 2017 10:18
Show Gist options
  • Save TimSC/04993f1e3668d1decdfb to your computer and use it in GitHub Desktop.
Save TimSC/04993f1e3668d1decdfb to your computer and use it in GitHub Desktop.

deploying web.py with nginx, uwsgi service and linux

It is possible to deploy web.py with nginx using a uWSGI 2.0.11 or later. Note that earlier versions available in the repository (such as 1.9.17) may not work! uWSGI is available via python's pip installer. Nginx natively supports uWSGI since 0.8.40. The following is for python 2.7.

sudo apt-get install python-pip nginx python-webpy python-dev libpcre3-dev zlib1g-dev libssl-dev libjansson-dev
sudo apt-get remove uwsgi uwsgi-core
sudo pip install uwsgi

Create the folders and set ownership:

sudo mkdir -p /var/srv/www/mon/logs
sudo mkdir -p /var/srv/www/mon/public_html/static
sudo mkdir -p /var/srv/www/mon/app
sudo chown www-data:www-data -R /var/srv/www/mon

Add a file: /etc/nginx/sites-available/mon

server {
	    listen          80;
	    server_name     $hostname;
	    access_log /var/srv/www/mon/logs/access.log;
	    error_log /var/srv/www/mon/logs/error.log;

	    location / {
	        uwsgi_pass      unix:///run/uwsgi/app/mon/mon.socket;
	        include         uwsgi_params;
	        uwsgi_param     UWSGI_SCHEME $scheme;
	        uwsgi_param     SERVER_SOFTWARE    nginx/$nginx_version;

	    }

	    location /static {
	        root   /var/srv/www/mon/public_html/;
	        index  index.html index.htm;
	    }

}

Enable the site and disable the default nginx website:

sudo ln -s /etc/nginx/sites-available/mon /etc/nginx/sites-enabled/mon
sudo rm /etc/nginx/sites-enabled/default

Create file: /var/srv/www/mon/app/mon.xml

<uwsgi>
	<uid>www-data</uid>
	<gid>www-data</gid>
	<plugin>python</plugin>
	<socket>/run/uwsgi/app/mon/mon.socket</socket>
	<pythonpath>/var/srv/www/mon/app/</pythonpath>
	<module>mon</module>
	<master/>
	<processes>4</processes>
	<harakiri>60</harakiri>
	<reload-mercy>8</reload-mercy>
	<cpu-affinity>1</cpu-affinity>
	<stats>/tmp/stats.socket</stats>
	<max-requests>2000</max-requests>
	<limit-as>512</limit-as>
	<reload-on-as>256</reload-on-as>
	<reload-on-rss>192</reload-on-rss>
	<no-orphans/>
	<vacuum/>
</uwsgi>

Add "<py-autoreload>3</py-autoreload>" to enable automatic reloading of python code. Only this this in development as it hinders performance.

Create file: /var/srv/www/mon/app/mon.py

For standard python, the content of mon.py should be:

import os
import sys

sys.path.append('/var/srv/www/mon/app')

os.environ['PYTHON_EGG_CACHE'] = '/var/srv/www/mon/.python-egg'

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

Or for web.py:

import web

urls = (
    '/(.*)', 'hello'
)
app = web.application(urls, globals())

class hello:
    def GET(self, name):
        if not name:
            name = 'World'
        return 'Web.py: Hello, ' + name + '!'

application = app.wsgifunc()

If upstart, as used in Linux Mint 17.2, is available, create file: /etc/init/mon.conf

description "mon uwsgi"
author "TSC"

start on runlevel [2345]
stop on runlevel [016]

env DIR=/run/uwsgi/app/mon
env USER=www-data
env GROUP=www-data
env PERMS=0755

pre-start script
  mkdir -p $DIR              || true
  chmod $PERMS $DIR       || true
  chown $USER:$GROUP $DIR || true
end script

exec uwsgi /var/srv/www/mon/app/mon.xml --logto /var/srv/www/mon/logs/uwsgi.log

Restart nginx and start the new mon service. These commands on many linux systems:

sudo service nginx stop
sudo service mon start
sudo service nginx start

Open web browser and view:

http://localhost/

Errors are variously logged in:

/var/log/nginx/error.log
/var/srv/www/mon/logs/error.log
/var/log/upstart/mon.log
/var/srv/www/mon/logs/uwsgi.log

Helpful links:
nginx website
wiki page on Nginx support for uWSGI

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment