Home > Guides > Alpine Server > Setting up uWSGI

Setting up uWSGI

Installation

Install uWSGI:

apk add python3 py3-pip py3-virtualenv uwsgi uwsgi-python3

Configuration

Start the service:

/etc/init.d/uwsgi start
rc-update add uwsgi

Per-Application Setup

Add a user for the Python application:

useradd -m flask

Log in as the user:

su flask
cd ~

Create the virtual environment for the application:

virtualenv env

Activate the virtual environment:

source env/bin/activate

Install Flask;

pip install flask

Edit ~/app.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

Deactivate the virtual environment:

deactivate

Press Ctrl+D or type exit to log out of the flask user.

To test our uWSGI installation, we can first run uwsgi from the command line:

uwsgi --socket 127.0.0.1:5000 --protocol=http --plugins python --uid flask --chdir /home/flask --virtualenv /home/flask/env -w app:app

Forward the port using SSH:

ssh -L 5000:localhost:5000 example.com

Point your browser to http://localhost:5000 to test the Python application.

uWSGI Emperor

Create a directory for the uWSGI application sockets:

mkdir /var/run/uwsgi-apps
chown -hR uwsgi: /var/run/uwsgi-apps

Edit /etc/uwsgi/conf.d/flask:

[uwsgi]
uid = flask
gid = flask
chown-socket = nginx
socket = /var/run/uwsgi-apps/flask.sock
chdir = /home/flask/app
virtualenv = /home/flask/app
module = app:app
plugin = python

Correct the permissions for /etc/uwsgi:

chown -R uwsgi: /etc/uwsgi

Reload uWSGI emperor:

/etc/init.d/uwsgi reload

Nginx

If you want to add the application to a subdirectory, edit your configuration as follows:

	location /flask {
		try_files $uri @flask;
	}

	location @flask {
		rewrite /foo/(.*)$ /$1 break;
		include uwsgi_params;
		uwsgi_pass unix:/var/run/uwsgi-apps/flask.sock;
	}

Otherwise, you can also host your application as part of a (sub)domain:

	location / {
		try_files $uri @flask;
	}

	location @flask {
		include uwsgi_params;
		uwsgi_pass unix:/var/run/uwsgi-apps/flask.sock;
	}