Installare Django su Dreamhost utilizzando passenger (mod_rails)
In questo articolo spieghiamo come installare Django (nelle prove è stata utilizzata la versione 1.0) su Dreamhost attraverso il supporto a passenger (chiamato anche mod_rails).
Le ragioni di una configurazione simile sono diverse, ma le principali sono la maggiore velocità di passenger ed un uso meno intensivo delle risorse di sistema, che portano meno errori 500 causati dalla mancata produzione delle pagine entro il timeout. Inoltre questa configurazione è più semplice e più lineare (tutto risiede in una unica cartella) e quindi procura meno problemi nel deploy delle applicazioni django.
Nel pannello di Dreamhost -> Domains -> Manage Domains dovete cliccare sul dominio che volete utilizzare per la vostra applicazione django (nell’esempio sarà domain.com), ed attivare l’opzione “Ruby on Rails Passenger (mod_rails)” NB: questa impostazione cambia la modalità con la quale Apache pubblica le pagine ed i file, quindi dovete assicurarvi di settare questa opzione solo per il dominio o il sottodominio nel quale installerete il progetto Django.
SUl server entrate nella directory /home/user/domain.com e create la sottodirectory “public”:
cd /home/user/domain.com && mkdir public
Tutto quello che risiede in questa directory verrà pubblicato da Apache direttamente, a meno che lo stesso URL non venga intercettato dalle impostazioni degli URL del progetto django .
Ad esempio, se aggiungiamo un file robots.txt dentro /home/user/domain.com/public/ la sua URL sarà www.domain.com/robots.txt, e verrà visualizzato a meno che non sia presente una espressione regolare simile a ‘^robots.txt$’ nel file urls.py di django.
Scaricate il sorgente di django source e decomprimete la cartella django al suo interno nella directory /home/user/domain.com/django. Per assicurarvi di aver scelto correttamente le directory, controllate di avere la sottodirectory /home/user/domain.com/django/core .
Se avete bisogno di alcune librerie python esterne a django ed al vostro progetto, inseritele in /home/user/domain.com/libraries/. Metteremo questa directory nel PYTHONPATH per fare in modo che siano correttamente separate dal resto, rendendo più facili gli aggiornamenti.
Caricate il progetto su /home/user/domain.com/myproject. Se non ne avete ancora uno, potete creare lo scheletro con il comando
cd /home/user/domain.com/
/home/user/domain.com/django/bin/django-admin.py startproject myproject
Non avrete bisogno di nessun file .htaccess, perché la confugurazione di passenger funzionerà anche senza, trovando file e url dinamiche senza il nostro intervento.
A questo punto creato un file chiamato passenger_wsgi.py dentro /home/user/domain.com/:
vim /home/user/domain.com/passenger_wsgi.py
Con questo contenuto:
import sys,os
INTERP = "/usr/bin/python2.4"
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)
sys.path.append("/home/user/domain.com/")
sys.path.append("/home/user/domain.com/libraries")
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Dentro /home/user/domain.com/myproject/settings.py controllate le seguenti impostazioni:
MEDIA_ROOT = '/home/user/domain.com/public/media/'
MEDIA_URL = 'http://www.domain.com/media/'
ADMIN_MEDIA_PREFIX = '/admin_media/'
Come potete vedere, la stringa/directory, “public” viene mangiata da passenger, quindi è consigliabile creare una sottodirectory “media” per assicurarci che gli URL dei file statici non vengano oscurati dalle impostazioni del vostro urls.py
Se utilizzate l’admin create un link simbolico per i file css e js contenuti in admin_media:
cd /home/user/domain.com/public/
ln -s home/user/domain.com/django/contrib/admin/media/ admin_media
E’ tutto, ed è molto più semplice di quanto sembri. Una volta creato il progetto sarà molto facile aggiornarlo ed apportarvi modifiche, grazie alla corretta separazione nel deploy dell’applicazione dei file statici, di django, del progetto e delle librerie python.
Dopo ogni modifica al codice, se volete controllarlo potete eseguire un
pkill python
che obbligherà il server a ricopilare e ricaricare i file python (con un piccolo prezzo in termini di tempo, necessario al primo avvio).
Potete approfondire questo tema su:
Passenger WSGI
Dreamhost Passenger
Django on Dreamhost with FCGI