ApacheWsgiSetup » Cronologia » Versione 3
Simone Piccardi, 28-03-2014 12:25
1 | 1 | Simone Piccardi | h1. Configurare Apache/WSGI per Django e affini |
---|---|---|---|
2 | |||
3 | 2 | Simone Piccardi | L'uso di @mod_wsgi@ per eseguire applicazione web in Python (prima fra tutte Django) può risultare molto problematico con la configurazione standard, dato che questa è pensata per applicazioni PHP e le modalità di funzionamento di quelle Phyton è totalmente diversa. Quanto indicato qui deriva dalle indicazioni date dall'autore di @mod_wsgi@ (Graham Dumpleton, vedi http://www.slideshare.net/GrahamDumpleton/pycon-us-2013-making-apache-suck-less-for-hosting-python-web-applications). |
4 | 1 | Simone Piccardi | |
5 | In particolare dovendo caricare tutta l'applicazione in un colpo solo all'avvio, la creazione e distruzione di processi tipica dell'MPM prefork rischia di avere un impatto molto pesante sulle prestazioni. E' pertanto opportuno utilizzare sempre l'MPM worker, cosa che su Debian si fa installando: |
||
6 | |||
7 | <pre> |
||
8 | apt-get install apache2-mpm-worker |
||
9 | </pre> |
||
10 | |||
11 | 3 | Simone Piccardi | Occorre inoltre una configurazione iniziale adeguata, dato che la memoria è condivisa infatti non conviene far partire troppi processi ed evitare di tenerne attivi troppi, in quanto l'occupazione di memoria verrà aumentata, in particolare poi è importante la direttiva MaxMemFree, che indica la quantità di memoria che il thread pool può allocare senza chiamare un free per liberare quella inusata. Questo su Apache 2.2 è illimitato, ma in realtà questa non serve ed è opportuna ridurla. Inoltre la creazione di processi nuovi, come accennato è onerosa per cui conviene tenerli al minimo. |
12 | 1 | Simone Piccardi | |
13 | 3 | Simone Piccardi | Questo comporta modificare i default di @/etc/apache2/apache2.conf@, una scelta consigliata è la seguente, un cui, scelta l'unità base di 25 thread per processo (di cui si dovranno usare multipli), si parte da un minimo (@MinSpareThreads@) di 25, corrispondenti ad un processo attivo per lasciarne un massimo (@MinSpareThreads@) di 73, corrispondenti a tre processi, il numero massimo di processi viene fissato da @MaxClients@ che con un valore di 100 (e l'equivalenza fra un client ed un thread) significa 4 processi massimo: |
14 | |||
15 | <pre> |
||
16 | <IfModule mpm_worker_module> |
||
17 | StartServers 2 |
||
18 | MinSpareThreads 25 |
||
19 | MaxSpareThreads 75 |
||
20 | ThreadLimit 64 |
||
21 | ThreadsPerChild 25 |
||
22 | MaxClients 100 |
||
23 | MaxRequestsPerChild 0 |
||
24 | MaxMemFree 256 |
||
25 | </IfModule> |
||
26 | </pre> |
||
27 | |||
28 | Ma la ottimizzazione principale si ottiene utilizzando @mod_wsgi@ in modalità demone, in questo caso i processi dedicati vengono stabiliti direttamente dalle configurazioni relative al modulo, che li fa partire in maniera indipendente, con un numero fisso di processi e thread che rende le cose molto più prevedibili, i processi di apache in questo caso fanno da proxy verso i processi gestiti da @mod_wsgi@. |
||
29 | In tal caso questo deve essere fatto inserendo nel ''virtal host'' che gestisce ''django'' (o affine) le direttive: |
||
30 | |||
31 | <pre> |
||
32 | WSGIDaemonProcess nomeidentificativo processes=3 threads=25 display-name=%{GROUP} |
||
33 | WSGIProcessGroup nomeidentificativo |
||
34 | </pre> |
||
35 | |||
36 | che nel caso lancia 3 processi (direttiva @processes@ che usano 25 thread ciascuno (direttiva @threads@), e imposta il nome dei processi (direttiva @display-name@) che verrà mostrato da @ps@ nella forma standard a @(wsgi:nomeidentificativo)@. |