Difference between revisions of "Uwsgi"
(7 intermediate revisions by the same user not shown) | |||
Line 10: | Line 10: | ||
==Installing== | ==Installing== | ||
* pip3 install uwsgi | * 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 .xml 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 | ||
+ | <syntaxhighlight lang=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> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | /etc/uwsgi/apps-available/apps.xml | ||
+ | <syntaxhighlight lang=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> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Make them available | ||
+ | <syntaxhighlight lang=bash> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Daemon management== | ||
+ | ;<code>/usr/local/bin/uwsgi -d --ini /etc/uwsgi-emperor/emperor.ini --log-syslog</code> | ||
+ | :Start with logging to [[rsyslog]], add following line to the rsyslogd configuration | ||
+ | :<code>:programname, contains, "uwsgi" /var/log/uwsgi/uwsgi.log</code> | ||
+ | |||
+ | ;<code>kill `pidof uwsgi`</code> | ||
+ | :This works for stopping all processes. | ||
+ | |||
+ | ;<code>uwsgi --stop /run/uwsgi/pid</code> | ||
+ | :This looks cleaner but does not work on my system | ||
+ | |||
+ | ;<code>uwsgi --reload /run/uwsgi/app1.pid</code> | ||
+ | :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: | ||
+ | |||
+ | <code>service uwsgi reload <app></code> | ||
+ | |||
+ | <syntaxhighlight lang=bash> | ||
+ | #!/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 | ||
+ | </syntaxhighlight> |
Latest revision as of 19:22, 31 October 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://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 .xml 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 rsyslog, 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