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)@. |