# FastCGI

FastCGI es un protocolo para interconectar programas interactivos con un servidor web.
FastCGI es una variación de la ya conocida Common Gateway Interface (CGI o Interfaz Común de Entrada).
El principal objetivo de FastCGI es reducir la carga asociada con el hecho de interconectar el servidor web y los programas Common Gateway Interface, permitiéndole a un servidor atender más peticiones a la vez.

## Ventajas

* Independencia del lenguaje utilizado. Libertad de elección de la plataforma de desarrollo: C++, PHP, Python, Perl, Java, entre otros.
* Se utiliza un proceso separado. Libertad de elección del servidor web. Facilidad para el tratamiento de errores y depuración.
* Es posible la ejecución en host separado. Mayor libertad para configuración del sistema, tanto en el diseño de la red como en la elección de los sistemas operativos. Disminución de la carga de trabajo del servidor principal.
En resumen, la libertad de diseño de CGI a la velocidad de un módulo del servidor..

## Historia

CGI es un protocolo para interconectar aplicaciones externas con servidores web. Las aplicaciones CGI corren en un proceso separado que es creado al inicio de cada petición y es finalizado cuando termina su trabajo. Este modelo de "un nuevo proceso por cada petición" hace que los programas CGI sean muy fáciles de implementar, pero limita la eficiencia y la escalabilidad. En altas cargas, la sobrecarga en el sistema operativo por la creación y destrucción de procesos se torna significativa y limita la escalabilidad. Además, el modelo de procesos CGI limita las técnicas de reutilización de recursos (como ser la reutilización de conexiones a base de datos, caché en memoria, etc).
Para encarar el problema de escalabilidad del CGI, Open Market desarrolló FastCGI y lo introdujo por primera vez en su producto de servicio web a mediados de los 90'. Open Market originalmente desarrolló FastCGI en parte como una respuesta competitiva contra la, en aquel entonces en proceso, API propietaria de Netscape's, la NSAPI que servía para desarrollar aplicaciones Web.
Aunque inicialmente desarrollada por Open Market, FastCGI fue implementada por otros fabricantes de servicios web. FastCGI, sin embargo, compitió contra otras técnicas que también intentaban aumentar la velocidad y simplificar las comunicaciones del lado del servidor, pero sin seguir el paradigma CGI. Módulos para Apache tales como mod perl y mod php aparecieron aproximadamente por la misma fecha y parecían ser mejores reemplazos para CGI, permitiendo una integración muy próxima con la base del servidor web.

## Detalles de la implementación

En vez de crear procesos nuevos por cada petición, FastCGI puede usar un solo proceso persistente que maneja cualquier petición durante su período de vida. El hecho de procesar múltiples peticiones a la vez es logrado ya sea mediante la utilización de una sola conexión con un multiplexado interno (por ejemplo múltiples peticiones sobre una sola conexión) y/o utilizando múltiples conexiones. Varios de esos procesos pueden existir, y eso es algo que incrementa la escalabilidad y el rendimiento. FastCGI permite también a los programas hacer que el servidor web realice ciertas operaciones sencillas, como leer un archivo antes de que la petición sea procesada. Las variables de entorno y las peticiones de páginas son enviadas desde el servidor web hacia los procesos a través de una conexión TCP (para procesos remotos) o a través de zócalos de Unix (para procesos locales). Las respuestas son devueltas desde el proceso hacia el servidor web sobre la misma conexión. La conexión puede ser cerrada al final de una respuesta, pero el servidor web y el proceso se mantienen en ejecución.
Varios administradores y programadores de sitios web encontraron que la separación de las aplicaciones web con respecto al servidor web producto de FastCGI (y la simplicidad de SCGI) tenían muchas ventajas sobre los intérpretes incrustados (mod perl, mod php, etc). Esta separación permite a los procesos del servidor y de las aplicaciones ser reiniciados en forma independiente; una consideración importante a tomar en cuenta en sitios web muy ocupados. Esto también facilita la aplicación de políticas de seguridad por cada aplicación; cosa importante para los ISPs y para las compañías de alojamiento web.

## Servidores Web que implementan FastCGI

    Nota: a menos que se notifique lo contrario, hasta ahora no se sabe cuándo será completada la implementación FastCGI
* Abyss Web Server
* Apache HTTP Server (parcial)
** Implementado por mod_fcgid. Este módulo era de terceros, pero fue garantizado que sería un subproyecto de Apache en el 2009, liderado por Chris Darroch
** El módulo desactualizado de terceros mod_fastcgi también está siendo utilizado
** Multiplexado de peticiones a través de una sola conexión está prohibido por el diseño de Apache, así que no está soportado en Apache
* Cherokee HTTP Server
* Hiawatha webserver
** Soporte de balance de carga para FastCGI
** Soporte servidores FastCGI con jaula root
* Lighttpd
* Monkey Web Server
* LiteSpeed Web Server
* Microsoft IIS
* Kerio WebSTAR
* Nginx
* Open Market Web Server
* Resin Application Server
* Roxen Web Server
* Sun Java System Web Server
* Cualquier contenedor Servlet (como ser Apache Tomcat o Jetty), usando la biblioteca JFastCGI.
* Zeus Web Server
* My server project

## 'Bindings' de lenguajes para la API FastCGI

FastCGI puede ser implementado en cualquier lenguaje que soporte zócalos (sockets). La API existe para:
* Borland Delphi/FreePascal
* C
* C++
* Chicken Scheme
* Common Lisp: CLISP y CMUCL
* D
* Guile Scheme
* Eiffel
* Haskell
* HP BASIC for OpenVMS
* Java
* Lua
* OCaml
* Mono XSP
* Perl
* PHP
* Roadsend PHP
* Python
* Ruby
* SmallEiffel
* Smalltalk: FasTalk and Dolphin Smalltalk
* TCL
FastCGI permitió portabilidad a las aplicaciones web; en contraste, las aplicaciones que fueron desarrolladas para intérpretes embebidos (tales como mod python) están generalmente muy limitadas a la API de Apache. Frameworks recientes tales como Ruby on Rails, Kepler (etc...) permiten el uso de cualquiera de los intérpretes embebidos (mod ruby, mod perl, mod python o mod_lual, respectivamente), pero también FastCGI. Esta tendencia parece ser que va a continuar.

## Bibliotecas que incluyen soporte para FastCGI

* qDecoder
* GNU Cgicc