N.B. Se non si usa uWSGI per lo sviluppo in locale e' opportuno leggere l'introduzione a uWSGI prima di procedere con il deploy di Django
uWSGI e' molto versatile e di conseguenza ci sono molti modi di effettuare il deploy di una applicazione Django.
Ne vedremo alcuni:
Si utilizzera' una virtualenv (e' quindi necessario aver abilitato l'ssh) con tutti i moduli necessari, e verra' copiata all'interno del progetto django.
Il primo passo e' caricare la directory del progetto (che chiameremo 'pippo') nella docroot. (se il dominio e' pippo.it, il nostro progetto sara' dentro www/pippo.it/pippo)
Ora dovrete scegliere la versione di python che preferite.
Poniamo sia la 2.6.6 e creiamo la virtualenv
cd www/pippo.it/pippo virtualenv266 myvenv
se avessimo scelto python 2.7.2 il comando sarebbe stato
cd www/pippo.it/pippo virtualenv272 myvenv
ora istalliamo i moduli nella virtualenv (istalleremo solo django tramite pip)
./myvenv/bin/pip install django
A questo punto il nostro ambiente e' pronto, resta solo da configurare uWSGI. Prepariamo un file (qui useremo il formato .ini ma potete scegliere quello che preferite tra i supportati da uWSGI)
[uwsgi] plugins = python266 virtualenv = pippo/myvenv env = DJANGO_SETTINGS_MODULE=pippo.settings module = django.core.handlers.wsgi:WSGIHandler()
salviamolo nella docroot (quindi www/pippo.it) come myapp.ini e andiamo sul pannello di controllo Unbit nella sezione delle opzioni del dominio.
Spuntate il checkbox upstream e in upstream_cmd impostate
uwsgi myapp.ini
Attendete 30 secondi e visitate la url del dominio. Se tutto e' andato bene vedrete il vostro lavoro
Se vi siete affezionati a una particolare versione di django potete evitare di duplicarla per ogni applicazione. E' sufficiente creare una virtualenv in una directory della vostra home (e' preferibile sotto www per dare la possibilita' ad apache di accedere ai file statici dell'admin di django)
Potete ovviamente avere piu' virtualenv, l'importante e' che vi ricordiate di impostare il loro path nel file di configurazione.
Evitate di far servire a Django/uWSGI i file statici di un applicazione. Il webserver potra' farlo meglio di qualsiasi implementazione. Per 'sganciare' determinate uri (ad esempio /media) da uWSGI elencatele nel campo upstream_off sul pannello di controllo
Puoi mappare determinate uri a percorsi fisici usando l'opzione del pannello docroot_mountpoints. Ex.
/media /www/pippo.it/pippo/myvenv/lib/python2.6/site-packages/django/contrib/admin/media
(magari create qualche file simbolico per evitare percorsi kilometrici)
Se volete avere un maggiore controllo, indipendentemente dal webserver, potete usare la direttiva --static-map di uWSGI. Puo' essere efficiente quanto il webserver, l'unica differenza e' che consumera' le risorse del vostro account
[uwsgi] plugins = python266 virtualenv = pippo/myvenv env = DJANGO_SETTINGS_MODULE=pippo.settings module = django.core.handlers.wsgi:WSGIHandler() static-map = /media=%(virtualenv)/lib/python2.6/site-packages/django/contrib/admin/media
notate l'uso del placeholder (una feature di uWSGI) %(virtualenv) che richiama il valore di un'altra opzione (abusatene !!!)
Tenete a mente che i path di docroot_mountpoints sono relativi alla home dell'account, mentre quelli di static-map sono relativi alla docroot.
Django fornisce un sistema di caching integrato. Tra quelli disponibili il piu' famoso e' sicuramente memcached. Se hai un processo a disposizione (o spazio libero nel tuo container) puoi agganciare una istanza memcached ad uWSGI:
[uwsgi] plugins = python266 virtualenv = pippo/myvenv env = DJANGO_SETTINGS_MODULE=pippo.settings module = django.core.handlers.wsgi:WSGIHandler() static-map = /media=%(virtualenv)/lib/python2.6/site-packages/django/contrib/admin/media attach-daemon = memcached -s mc.socket -m 20
questo avviera' memcached in ascolto su un socket unix (i socket TCP/UDP vanno acquistati poiche' sono una risorsa limitata del server) e con una cache di 20 mega.
Per connettersi a un socket unix da Django si dovra' usare come indirizzo la forma 'unix:path', quindi nel nostro caso in settings.py scriveremo
(per django < 1.3)
CACHE_BACKEND = 'memcached://unix:mc.socket'
(per django >= 1.3)
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'unix:mc.socket',
}
}In alterantiva puoi usare redis o se proprio vuoi il massimo delle performance (al costo di un maggior consumo di memoria) puoi usare il motore di caching di uWSGI (consulta la documentazione ufficiale, che include un esempio per django)
Come specificato nelle Faq su ogni webserver e' disponibile un servizio SMTP su localhost 25 (senza SSL/TLS) che puoi utilizzare per inviare email dalle tue applicazioni. Attenzione, evita l'utilizzo di /usr/lib/sendmail al posto di smtp in quanto puo' occupare fino a 3 processi per un banale invio. E' importante che le mail inviate da django abbiano un mittente valido quindi imposta sempre correttamente i vari parametri sender/from. Se una mail inviata da Django non arriva e molto probabile che il problema sia li'.
Il parametro da impostare nel settings.py e' SERVER_EMAIL, di default e' impostato a root@localhost che ovviamente non e' un mittente valido.
Ogni volta che fai modifiche al codice della tua applicazione (o alle impostazioni di uWSGI) dovrai riavviarlo. Per farlo puoi inviare il segnale di KILL dalla sezione 'processi' del pannello di controllo o via ssh.
Se hai abilitato il processo master di uWSGI (se possibile fallo sempre) puoi inviare il segnale INT (o QUIT) per fare in modo che si occupi lui stesso di chiudere tutti i worker.
Se invii il segnale HUP al master, eventuali richieste in corso saranno prima completate e solo dopo il server sara' riavviato.
Prima di fiondarti sull'assistenza per qualsiasi problema. LEGGI I LOG !!!
Di default uWSGI scrive i suoi log nel file stderr_log nella home. Puoi cambiare questo path usando l'opzione logto
[uwsgi] plugins = python266 virtualenv = pippo/myvenv env = DJANGO_SETTINGS_MODULE=pippo.settings module = django.core.handlers.wsgi:WSGIHandler() static-map = /media=%(virtualenv)/lib/python2.6/site-packages/django/contrib/admin/media attach-daemon = memcached -s mc.socket -m 20 logto = myapp.log
HowtoDjango (l'ultima modifica รจ del 2011-09-28 10:26:14, fatta da RobertoDeIoris)