Difference between revisions of "Uwsgi"

From wiki
Jump to navigation Jump to search
Line 48: Line 48:
  
 
===Raspberry pi===
 
===Raspberry pi===
On my raspberry pi uwsgi was installed with some extensions to ease configuration. E.g. to use .sml file for configuration
+
On my raspberry pi uwsgi was installed with some extensions to ease configuration. E.g. to use .sml file for configuration. It was also not installed by pip so the uwsgi-plugin-python3 needed to be installed too.
  
 
/etc/uwsgi/apps-available/emperor.xml
 
/etc/uwsgi/apps-available/emperor.xml

Revision as of 17:24, 19 July 2021

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. It was also not installed by pip so the uwsgi-plugin-python3 needed to be installed too.

/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