
UFCGI e' una implementazione dei protocolli FastCGI/SCGI per apache2 scritta in mod_perl. A differenza delle controparti in c (mod_fastcgi, mod_fcgid) e' molto piu' snella e permette la configurazione a runtime di molti aspetti.
Il motivo principale che ci ha spinto alla sua realizzazione e' il fatto che non c'e' una giusta configurazione per tutte le applicazioni dei nostri clienti (cosa che viene imposta da mod_fastcgi/mod_fcgid) e che la maggior parte degli utenti ha bisogno di chiari messaggi di errore a schermo piuttosto che un criptico "Internal Server Error".
La versione 0.2 e' una revisione dedicata alle sole ottimizzazioni. Grazie alle nuove patch dei kernel unbit (febbraio/marzo 2008) e' stato possibile rimuovere oltre il 30% di codice dall'implementazione. Inoltre non si e' piu' reso necessario un sistema di locking complesso che nella versione precedente non offriva una sensibile riduzione della latenza rispetto a mod_fastcgi e mod_fcgid.
Il ciclo di una richiesta ufcgi e' il seguente (indipendentemente dal protocollo fastcgi o scgi):
1) richiesta riconosciuta come ufcgi 2) collegamento diretto al socket (senza fare verifiche o effettuare locking come nella versione 0.1)
in caso il punto 2 dia errore:
3) verifica tramite syscall 319 (per fastcgi) o 320 (per scgi) che l'applicazione sia in esecuzione
se il punto 3 restituisce 0 viene lanciata l'applicazione (utilizzando un semplice un file di lock per evitare che due richeiste concorrenti generino il doppio dei processi), altrimenti si tenta per 3 volte a intervalli di 1,2 e 3 secondi di ricollegarsi al socket. Se si continuano a ricevere errori la richiesta viene chiusa e se configurato dall'utente si restituisce un redirect alla url impostata in fastcgi_failover_url/scgi_failover_url
Se il punto 2 ha dato esito positivo, si costruisce la richiesta, la si invia al socket e si lancia una recv() con timeout impostato a fastcgi_socket_timeout/scgi_socket_timeout
In caso di timeout viene restituito un errore UFCGI o (se configurato) si effettua il redirect di failover.
Per ridurre al minimo la curva di apprendimento rispetto alle vecchie implementazioni fastcgi, abbiamo mantenuto gli stessi nomi ai parametri e ci siamo limitati ad aggiungerne di nuovi:
fastcgi_cmd => nome dell'applicazione fastcgi (estensione .fcg o .fcgi)
fastcgi_mode => tipo di redirect da utilizzare, dipende dall'applicazione, impostandolo a 0 (nessun redirect) e' possibile usare il mod_rewrite e costruire modelli di redirect piu' complessi
fastcgi_off => elenco di directory in cui disabilitare il protocollo fastcgi
fastcgi_socket_timeout => e' la prima opzione specifica di UFCGI, permette di definire con un intervallo dai 5 ai 30 secondi, il tempo massimo che una richiesta fastcgi puo' impiegare senza avere nessun tipo di risposta dall'applicazione (default: 10 secondi)
fastcgi_nfork => numero di processi da avviare per una stessa applicazione (da 1 a 3, default 1). Opzione specifica di UFCGI, nel caso di applicazioni multithread (flup,mono,zope3...) e' necessario impostare 1
fastcgi_send_script_name => Opzione specifica di UFCGI, permette di inviare le variabili SCRIPT_NAME e SCRIPT_FILENAME all'applicazione. Per adesso solo MONO sembra averne bisogno.
Un'applicazione ufcgi restituira' un errore sul browser (solo se non si e' impostato il fastcgi_failover_url/scgi_failover_url) in questi casi:
* L'applicazione non si e' avviata
* Si e' superato il (fastcgi|scgi)_socket_timeout
* L'applicazione ha restituito una risposta vuota
* L'applicazione ha chiuso il socket unix di comunicazione
UFCGI (l'ultima modifica รจ del 2008-03-19 12:39:43, fatta da RobertoDeIoris)