Progetto

Generale

Profilo

SupervisorPerDjango » Cronologia » Versione 1

Mark Caglienzi, 13-12-2013 17:47

1 1 Mark Caglienzi
h1. Uso di Supervisor per controllare più istanze di Django
2
3
"Supervisor":http://supervisord.org è presente in Debian, e permette il controllo (avvio, stop, riavvio automatico, logging, eccetera) di programmi che devono essere monitorati nel loro funzionamento. In questa guida si avvieranno e si gestiranno quattro istanze del devserver di un'applicazione Django in locale.
4
5
Per ogni approfondimento riguardo a supervisor, si rimanda alla "documentazione ufficiale":http://supervisord.org.
6
7
*NB*: Supervisor "non funziona con Python 3":http://supervisord.org/introduction.html#platform-requirements.
8
9
h2. Prerequisiti
10
11
* @# apt-get install supervisor@
12
* Progetto django in @/home/utente/projects/django/@
13
14
h2. Configurazione di supervisor
15
16
Debian installa supervisor e avvia il demone @supervisord@ con il file @/etc/supervisor/supervisord.conf@ che contiene queste direttive:
17
18
<pre>
19
; supervisor config file
20
21
[unix_http_server]
22
file=/var/run/supervisor.sock   ; (the path to the socket file)
23
chmod=0700                       ; sockef file mode (default 0700)
24
25
[supervisord]
26
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
27
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
28
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
29
30
; the below section must remain in the config file for RPC
31
; (supervisorctl/web interface) to work, additional interfaces may be
32
; added by defining them in separate rpcinterface: sections
33
[rpcinterface:supervisor]
34
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
35
36
[supervisorctl]
37
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket
38
39
; The [include] section can just contain the "files" setting.  This
40
; setting can list multiple files (separated by whitespace or
41
; newlines).  It can also contain wildcards.  The filenames are
42
; interpreted as relative to this file.  Included files *cannot*
43
; include files themselves.
44
45
[include]
46
files = /etc/supervisor/conf.d/*.conf
47
</pre>
48
49
e come si vede il demone risponde alla unix socket @/var/run/supervisor.sock@, e @supervisorctl@ (software che presenta una shell di controllo) usa questa socket per inviare comandi al demone (che serviranno per monitorare, avviare, riavviare, fermare i servizi configurati).
50
51
Grazie alla direttiva @[include]@ supervisor carica file di configurazione aggiuntivi dalla directory @/etc/supervisor/conf.d/@, quindi questo file può essere lasciato così (a meno di aver bisogno di settaggi particolari).
52
53
h3. Creazione del file @django.conf@
54
55
Come si vedrà, i file di configurazione di supervisor supportano la sintassi python per fare output di valori come se si scrivesse in una stringa ("qui":http://supervisord.org/configuration.html?highlight=python#configuration-file la pagina che spiega approfonditamente, con esempi, questa funzionalità).
56
Si crei il file @/etc/supervisor/conf.d/django.conf@ per la gestione delle istanze di django (in questo esempio si useranno i devserver):
57
58
<pre>
59
[program:django]
60
numprocs=4
61
directory=/home/utente/projects/django
62
command=python manage.py runserver 80%(process_num)02d
63
process_name=%(program_name)s_%(process_num)02d
64
user=utente
65
redirect_stderr=true
66
stdout_logfile=/home/utente/projects/django/supervisor_stdout_%(process_num)02d.log
67
stopsignal=KILL
68
stopasgroup=true
69
killasgroup=true
70
</pre>
71
72
La sezione @[program:django]@ contiene quindi le impostazioni di base per gestire 4 istanze di django. Le singole righe significano:
73
74
* Numero di processi da avviare.
75
* Directory in cui entrare prima di eseguire il comando.
76
* Comando da eseguire per ogni processo avviato (dato che @numprocs@ è stato specificato, ed è diverso da 1, bisogna che in @command@ sia presente @%(process_num)02d@ per differenziare le righe di comando). In questo esempio, con @numprocs@ che va da 0 a 3, verranno avviati 4 processi alle porte @8000@, @8001@, @8002@, @8003@.
77
* Nome del processo i-esimo. In questo esempio si chiameranno @django_00@, @django_01@, @django_02@, @django_03@.
78
* Utente da usare per lanciare i comandi. In questo esempio @supervisord@ tenta di passare all'utente @utente@, in modo da non lanciare i comandi come utente di @supervisord@ (che potrebbe essere @root@). Se questo tentativo fallisce, il comando non viene eseguito.
79
* Redirigere gli @stderr@ dei processi creati nei rispettivi @stdout@.
80
* File in cui loggare @stdout@.
81
* Le ultime tre righe sono necessarie per far sì che @supervisord@ riesca a killare correttamente i devserver di django senza lasciare processi orfani né bloccare le porte in caso di riavvio di un'istanza.
82
83
Di default i processi vengono avviati all'avvio di @supervisord@, ma si può impedire (@autostart=false@), si può richiedere che i processi siano sempre riavviati in caso di segnali di @KILL@ (@autorestart@), si possono configurare i timeout di attesa quando un processo cambia stato, il tipi di exit code attesi per discriminare quando un processo esce correttamente o per qualche errore/malfunzionamento (@exit_codes@), eccetera....
84
85
h2. Uso di @supervisorctl@
86
87
Questo è un programma che può essere usato per inviare comandi una tantum:
88
89
<pre>
90
# supervisorctl start all
91
</pre>
92
93
oppure avviato senza parametri perché fornisca una shell da cui poter interrogare @supervisord@:
94
95
<pre>
96
# supervisorctl 
97
django:django_00                   RUNNING    pid 9633, uptime 0:41:34
98
django:django_01                   RUNNING    pid 9634, uptime 0:41:34
99
django:django_02                   RUNNING    pid 9648, uptime 0:41:33
100
django:django_03                   RUNNING    pid 9659, uptime 0:41:32
101
supervisor> help
102
103
default commands (type help <topic>):
104
=====================================
105
add    clear  fg        open  quit    remove  restart   start   stop  update 
106
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version
107
108
supervisor> stop all
109
django_00: stopped
110
django_01: stopped
111
django_02: stopped
112
django_03: stopped
113
supervisor> start all
114
django_00: started
115
django_01: started
116
django_02: started
117
django_03: started
118
</pre>
119
120
Come si vede qui è possibile interrogare il demone e vedere i processi attivi, fermarli, avviarli, ed è anche presente un help in linea.
121
122
Se @supervisord@ è stato avviato da @root@, e nel file @supervisord.conf@ il setting @chmod@ è 0700, ovviamente un utente non privilegiato non potrà accedere alla socket di interrogazione, e @supervisorctl@ andrà lanciato da @root@ (come nell'esempio qui sopra).