Django applicatie hosten met UWSGI

Ik ben recent met Django aan het spelen geweest, en daardoor ben ik ook aan het kijken hoe ik zo’n applicatie kan uitrollen. Ik heb uWSGI gekozen omdat het het eenvoudigste leek om te doen. Ik zal de installatie doen op Debian, aangezien ik dit draai op mijn server.

uWSGI installeren

Binnen Debian zijn er 2 manieren om uwsgi te installeren: het normale uwsgi pakket, waar je 1 service per app draait, of me uwsgi-emperor, waar er 1 master service is met per site een configuratie site. Ik raad de “uwsgi-emperor” manier aan omdat dit een pak eenvoudiger is. We kunnen dit installeren met

sudo apt install uwsgi-emperor uwsgi-plugin-python3

Vervolgens moeten we de configuratie een beetje aanpassen, aangezien ik apps meestal draai onder hun eigen gebruiker. Vervang de inhoud van ‘/etc/uwsgi-emperor/emperor.ini’ met het volgende:

[uwsgi]
emperor=/etc/uwsgi-emperor/vassals
emperor-procname=uWSGI (Emperor)

Vervolgens maken we een .ini bestand in de /etc/uwsgi-emperor/vassals map voor onze applicatie, zo heb ik bijvoorbeeld ‘skyz.ini’ voor Skyz), pas de inhoud aan naar jouw specifieke omgeving:

[uwsgi]
chdir=/var/www/skyz.be
module=skyz.wsgi:application
socket=/run/uwsgi-skyz.sock
uid=www-skyz
gid=www-skyz
chown-socket=www-data:www-data
workers=5
harakiri=30
max-requests=5000
vacuum=true
home=/var/www/skyz.be/.venv
procname=uWSGI: %n
procname-master=uWSGI: %n (master)
plugins=python3

Dit zal de applicatie starten met als gebruiker de Skyz gebruiker. Het aantal workers wil je wellicht aanpassen naar jouw specifieke omgeving, maar het aantal cores * 2 +1 is een goed startpunt.

Vervolgens moeten we de uwsgi-emperor service herstarten, en kunnen we doorgaan naar het configureren van de webserver.

Nginx

Met nginx, moeten we enkel het volgende toevoegen aan ons server blok:

location /media/ {
    root /path/to/media
}

location /static/ {
    root /path/to/static
}

location / {
    uwsgi_pass unix:///run/uwsgi-skyz.sock;
    include uwsgi_params;
}

Apache

Voor apache kunnen we mod_proxy en mod_proxy_uwsgi inschakelen als volgt:

sudo a2enmod proxy proxy_uwsgi

Vervolgens kunnen we het volgende toevoegen aan onze vhost:

Alias /static /var/www/skyz/staticfiles
ProxyPass "/static" !
ProxyPreserveHost On
ProxyPass "/" "unix:/run/uwsgi-skyz.sock|uwsgi://localhost:3030/"

Als we apache nu herstarten zou de applicatie draaiende moeten zijn.