Uwsgi

From wiki
Jump to navigation Jump to search

Lots of confusion going around on the net about installing and using uwsgi. Here my notes.

Used documentation

https://github.com/unbit/uwsgi/issues/1688

https://www.digitalocean.com/community/tutorials/how-to-deploy-python-wsgi-applications-using-uwsgi-web-server-with-nginx

https://stackoverflow.com/questions/35262299/uwsgi-emperor-mode-not-working-outside-of-virtualenv

Installing

  • pip3 install uwsgi
  • pip3 install flask

Configuration

/etc/uwsgi-emperor/emperor.ini

[uwsgi]
 autoload = true
 no-orphan = true
 emperor = /etc/uwsgi-emperor/vassals
 master = true
 emperor-nofollow = true
 processes = 1
 workers = 2
 uid = www-data
 gid = www-data
 pidfile = /run/uwsgi/pid
 socket = /tmp/%n.sock
 chmod-socket = 666
 chown-socket = www-data
 log-date = false

For all applications you can use this configuration file in /etc/uwsgi-emperor/vassels/app1.ini. uwsgi is installed using pip so no loading of a python module is needed.

[uwsgi]
 master = false
 processes = 1
 pidfile = /run/uwsgi/%n.pid
 vaccum = true
 chmod-socket = 666
 socket = /tmp/%n.sock
 uid = www-data
 gid = www-data
 pythonpath = /opt/flask/%n
 module = %n

The %n will be replaced by the first part of the file-name (app1 in this example). In /opt/flask/app1 you can put your code.

Raspberry pi

On my raspberry pi uwsgi was installed with some extensions to ease configuration. E.g. to use .sml file for configuration

/etc/uwsgi/apps-available/emperor.xml

 <uwsgi>
  <autoload>true</autoload>
  <no-orphan>true</no-orphan>
  <emperor>/etc/uwsgi/vassals-enabled</emperor>
  <master>true</master>
  <emperor-nofollow>true</emperor-nofollow>
  <processes>1</processes>
  <uid>www-data</uid>
  <gid>www-data</gid>
 </uwsgi>

/etc/uwsgi/apps-available/apps.xml

 <uwsgi>
  <plugins>python3</plugins>
  <master>false</master>
  <processes>1</processes>
  <vaccum>true</vaccum>
  <chmod-socket>666</chmod-socket>
  <socket>/tmp/%n.sock</socket>
  <uid>www-data</uid>
  <gid>www-data</gid>
  <pythonpath>/var/www/flask/%n</pythonpath>
  <module>%n</module>
 </uwsgi>

Make them available

cd /etc/uwsgi/apps-enabled
ln -s ../apps-available/emperror.xml
cd /etc/uwsgi/vassals-enabled
ln -s ../apps-available/apps.xml app1.xml
ln -s ../apps-available/apps.xml app2.xml

Daemon management

/usr/local/bin/uwsgi -d --ini /etc/uwsgi-emperor/emperor.ini --log-syslog
Start with logging to rsysog, add following line to the rsyslogd configuration
:programname, contains, "uwsgi" /var/log/uwsgi/uwsgi.log
kill `pidof uwsgi`
This works for stopping all processes.
uwsgi --stop /run/uwsgi/pid
This looks cleaner but does not work on my system
uwsgi --reload /run/uwsgi/app1.pid
Restart a vassel (application)


From the skeleton coming with Ubuntu below start/stop script can be made. It allows you to do the usual services things (start/stop/restart) and a reload of individual application instances by:

service uwsgi reload <app>

#!/bin/sh
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ x${1} != xreload ]
 then
  if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
      set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
  fi
fi
### BEGIN INIT INFO
# Provides:          uwsgi
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start uwsgi deamon
# Description:       Start uwsgi deamon
#                    This script starts a
#                    single forking daemon capable of writing a pid
#                    file.  
### END INIT INFO

# Author: Me
#

DESC="uWSGI server"
DAEMON="/usr/local/bin/uwsgi"
case "$1" in 
	start)
		DAEMON_ARGS="-d --ini /etc/uwsgi-emperor/emperor.ini --log-syslog"
	;;
	reload)
		${DAEMON} --reload /run/uwsgi/${2}.pid
	;;
esac