Caricare un interprete Python

Come molti di voi sapranno è possibile customizzare diversi aspetti del proprio account sui sistemi Unbit. Un'opzione importante che viene fornita è la possibilità di caricare versioni custom di ambienti o degli interpreti preferiti senza dover essere vincolati alle librerie e ai binari già presenti sul server.

Nel corso di questo howto viene mostrato come caricare una versione specifica dell'interprete Python non presente nell'account standard. Successivamente viene utilizzata in fase di test con il sistema uWSGI. La guida si sviluppa in diversi punti che invito a leggere attentamente sopratutto per gli utenti meno esperti o per quelli esperti che non hanno mai avuto modo di modificare il proprio ambiente Unbit. Prima di effettuare qualsiasi modifica, inoltre, accertatevi di aver effettuato una copia di backup dei dati o delle configurazioni precedenti.

Come sistema di riferimento viene considerato uno del tipo Debian/Ubuntu, le motivazioni di questa scelta sono facilmente intuibili anche in analogia con l'offerta Unbit. Un requisito fondamentale per poter proseguire è l'accesso FTP al proprio spazio mentre è opzionale (e quindi non vincolante) l'accesso SSH.

Tutte le operazioni suggerite in questa guida sono da eseguire sul proprio sistema locale. Il server remoto è un ambiente condiviso tra tutti gli utenti e non è quindi ottimizzato per compilare di grandi quantità di codice. Per questo motivo generando tutto il necessario in locale si risparmia tempo e fatica.

Passo 1: Ottenere i binari

Per sviluppare questo howto è scelta l'ultima versione disponibile del ramo 2.6, questo, tuttavia, non è un requisito vincolante in quanto il sistema uWSGI offre il supporto a varie release dell'interprete (es. 2.5, 2.6, 3.0, ecc).

Per ottenere i binari è possibile percorrere due strade differenti:

  1. Scaricare i sorgenti dal sito ufficiale e compilare sulla propria macchina.
  2. Scaricare direttamente i binari dai repository ufficiali di una distrubuzione Debian/Ubuntu.

Indipendentemente dalla soluzione è bene fare chiarezza sull'archittettura (x86/x86_64) da scegliere. Se non si hanno particolari motivazioni per caricare un ambiente x86_64 (a 64bit) è consigliabile la più classica architettura x86 (a 32 bit) più parca nell'utilizzo dell'address space disponibile.

Per chi utilizza i repository è necessario porre attenzione alla scelta dei pacchetti che dovranno essere scaricati. Per chi sceglie invece di ottenere i binari tramite ricompilazione è opportuno considerare che una compilazione con target x86 sotto un sistema x86_64 non è la scelta di default: in particolare se non si è configurato il sistema per una cross-compilazione oppure con una jail a 32 bit.

Utilizzare i sorgenti:

E' possibile scaricare dal sito ufficiale i sorgenti della versione prescelta in uno dei due formati disponibili: tar.gz o tar.bz2:

17dcac33e4f3adb69a57c2607b6de246  13322131  Python-2.6.4.tgz
fee5408634a54e721a93531aba37f8c1  11249486  Python-2.6.4.tar.bz2

Prima di procedere con la build è opportuno assicurarsi di avere tutte le librerie e gli headers necessari alla corretta compilazione dell'interprete controllando il package manager della propria distrubuzione e marcando l'installazione delle opportune librerie.

Le opzioni di configurazione necessarie sono --enable-shared e --prefix=$DIR.

La prima permette di generare la libpython2.6.so necessaria per il funzionamento con uWSGI e la seconda specifica il prefix dove verranno installati i binari una volta generati. Infatti, $DIR è il path di una cartella che dovrà essere creata per accogliere i nuovi binari evitando così di sovrascriverli con quelli del sistema locale, tuttavia non è necessario utilizzare i diritti d'amministratore per compiere queste operazioni.

user@host:~$ wget http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tar.bz2
user@host:~$ tar xjf Python-2.6.4.tar.bz2
user@host:~$ cd Python-2.6.4

user@host:~/Python-2.6.4$ ./configure --enable-shared --prefix=$DIR
user@host:~/Python-2.6.4$ make
user@host:~/Python-2.6.4$ make install

Ottenuti i binari nella $DIR specificata è possibile saltare al passo successivo.

Utilizzare i repository:

Se non si è scelto di effettuare la ricompilazione dei sorgenti è possibile sfruttare i pacchetti binari messi a disposizione nei repository ufficiali Ubuntu. La versione prescelta (2.6.4) è disponibile nei repository della release Ubuntu Karmic (9.10) nel ramo karmic-updates. Per ottenere un ambiente completo è necessario scaricare i .deb dei tre pacchetti fondamentali: python2.6, python2.6-minimal e libpython2.6.

Ad esempio si puo' procedere in questa maniera, dove, come nel caso precedente, la variabile $DIR rappresenta una cartella creata per accogliere i binari estratti dagli archivi deb.

user@host:~$ wget http://de.archive.ubuntu.com/ubuntu/pool/main/p/python2.6/python2.6-minimal_2.6.4-0ubuntu3_i386.deb
user@host:~$ wget http://de.archive.ubuntu.com/ubuntu/pool/main/p/python2.6/python2.6_2.6.4-0ubuntu3_i386.deb
user@host:~$ wget http://de.archive.ubuntu.com/ubuntu/pool/main/p/python2.6/libpython2.6_2.6.4-0ubuntu3_i386.deb

user@host:~$ dpkg -X python2.6-minimal_2.6.4-0ubuntu3_i386.deb $DIR
user@host:~$ dpkg -X python2.6_2.6.4-0ubuntu3_i386.deb $DIR
user@host:~$ dpkg -X libpython2.6_2.6.4-0ubuntu3_i386.deb $DIR

Ottenuti i binari nella $DIR specificata è possibile proseguire al passo successivo.

Passo 2: Upload sul server

I binari generati sono disponibili nella $DIR indicata nel punto precedente: dell'intero albero contenuto in $DIR è necessario copiare tutti i file e subdirectory presenti in $DIR/usr/lib nella directory remota /accounts/<user>/lib. <user> rappresenta il nome del proprio account.

Se si effettua questa l'operazione tramite accesso FTP il path assoluto /accounts/<user>/lib viene indicato dal client come relativo a /accounts/<user>: è sufficiente quindi operare sulla cartella: /lib. Se quest'ultima non dovesse essere presente nell'account è buona norma creara prima di effettuare il caricamento.

Terminate le operazioni di upload nella directory remota lib sono presenti almeno due elementi: la directory python2.6 e il file libpython.2.6.so.1.0 che rappresentano rispettivamente l'interprete e la shared library utilizzabile da uWSGI. Per utilizzare altri moduli non contenuti nella standard library Python è possibile caricare i relativi binari nella cartella /accounts/<user>/lib/python2.6/site-packages.

Passo 3: Configurazione uWSGI

Dopo aver effettuato l'upload della versione custom sul server è possibile testarla sfruttando uWSGI. Si utilizza per questo scopo una semplice applicazione WSGI che, invocata tramite uWSGI, fornirà informazioni sull'ambiente di esecuzione:

   1 import sys
   2 import os
   3 
   4 def tester(environ, start_response):
   5     status = b'200 OK'
   6     headers = [(b'Content-Type:', b'text/plain')]
   7     start_response(status, headers)
   8 
   9     yield 'SYS.PATH:\n'
  10     for s in sys.path:
  11         yield '  {0}\n'.format(s)
  12     else:
  13         yield '\n'
  14     yield 'OS.ENVIRON:\n'
  15     for k,v in os.environ.items():
  16         yield '  {0}:\t{1}\n'.format(k,v)
  17     else:
  18         yield '\n'

Assumendo di aver scritto l'applicazione in un file dal nome noto come testapp.py è possibile procede alla configurazione dell'account per servire richieste WSGI.

Dal panello di controllo è necessario abilitare la checkbox uWSGI, successivamente sotto la voce wsgi_mountpoints bisogna specificare mount path, modulo python e applicazione con cui servire le richieste. In modulo python bisogna inserire il nome del file senza specificare l'estensione .py in questo caso: testapp.

/test testapp tester

Non rimane quindi che richiamare l'applicazione appena configurata (http://<nomedominio>/test) e se tutto è stato configurato in modo corretto si ottiene un output simile al seguente:

SYS.PATH:
  .
  /accounts/<user>/lib/python2.6
  /accounts/<user>/www/default
  /accounts/<user>/lib/python2.6/site-packages
  /accounts/<user>/lib/python
  /accounts/<user>/lib/python2.6/plat-linux2
  /accounts/<user>/lib/python2.6/lib-tk
  /accounts/<user>/lib/python2.6/lib-old
  /accounts/<user>/lib/python2.6/lib-dynload
  /accounts/<user>/lib/python2.6/dist-packages

OS.ENVIRON:
  LANG: C
  PYTHONPATH: /accounts/<user>/lib/python2.6:/accounts/<user>/www/default:/accounts/<user>/lib/python2.6/site-packages:/accounts/<user>/lib/python
  APACHE_RUN_USER: www-data
  APACHE_PID_FILE: /var/run/apache2.pid
  PWD: /etc/apache2
  APACHE_RUN_GROUP: www-data
  HOME: /accounts/<user>
  PATH: /accounts/<user>/bin:/bin:/usr/bin
  LD_LIBRARY_PATH: /accounts/<user>/lib:/accounts/<user>/lib

In caso di errore, invece, bisognerà controllare il file stderr_log nella root del proprio account Unbit e ricercare la possibile causa del malfunzionamento. Se tutto ha funzionato correttamente l'ambiente custom Python è pronto da utilizzare con nuove e più corpose applicazioni.

Conclusioni:

Per eventuali dubbi o chiarimenti è possibile postare nella mailing list unbit-dev oppure, dopo aver ricontrollato tutti i log d'errore e le configurazioni, scrivere via email all'assistenza tecnica Unbit.

Note:

Per ottenere le dipendende di compilazione dell'interprete Python (2.6.x) in un ambiente Debian/Ubuntu è sufficente installare le build-dep dei pacchetti: python2.6 e libpython2.6. Terminata l'installazione delle librerie di sviluppo è possibile procedere con la compilazione manuale.

user@host:~$ sudo apt-get build-dep python2.6 libpython2.6

Per ottenere invece i sorgenti delle versioni binarie rilasciate in ambiente Debian/Ubuntu è sufficente utilizzare il gestore dei pacchetti. In questo caso è necessario installare (come per il caso precedente) le build-dep associate presenti negli stessi repository.

user@host:~$ sudo apt-get source python2.6
user@host:~$ sudo apt-get build-dep python2.6 libpython2.6

Per ulteriori informazioni sul deploy di applicazioni uWSGI è possibile consultare la pagina riguardante uWSGI.

Riferimenti:

HowtoCustomPython (l'ultima modifica è del 2010-02-07 18:48:39, fatta da ValerioDeCarolis)