CGI, o Common Gateway Interface, es un estándar de interfaz que permite a los servidores web interactuar con programas externos (scripts o ejecutables) para generar contenido dinámico. Define un método estandarizado para que el servidor web pase información de la solicitud HTTP (como parámetros de URL, datos de formulario, cabeceras) al programa externo a través de variables de entorno y entrada estándar (stdin), y para que el programa devuelva su salida (generalmente HTML, pero puede ser cualquier tipo MIME) al servidor web a través de la salida estándar (stdout). Cada solicitud que invoca un script CGI típicamente inicia un nuevo proceso, lo que garantiza el aislamiento pero puede ser ineficiente a gran escala.
Aunque su uso ha disminuido en favor de alternativas más eficientes, CGI fue fundamental en los primeros días de la web dinámica. Ejemplos de su implementación incluyen scripts Perl, Python o C/C++ ejecutados directamente por el servidor web Apache o Nginx (a través de módulos como `mod_cgi`). Sistemas más modernos como FastCGI, SCGI o WSGI surgieron como evoluciones para abordar las limitaciones de rendimiento de CGI, manteniendo la separación entre el servidor web y la lógica de la aplicación, pero reutilizando procesos para reducir la sobrecarga de inicio. Frameworks web tempranos a menudo utilizaban CGI o sus derivados para servir aplicaciones.
Para un arquitecto, comprender CGI es crucial para entender la evolución de la web dinámica y los trade-offs de rendimiento. Aunque CGI puro rara vez se usa en arquitecturas modernas de alto rendimiento, sus principios subyacen en interfaces como FastCGI, que sí son relevantes. La principal consideración es el rendimiento: el modelo de 'un proceso por solicitud' de CGI introduce una sobrecarga significativa de CPU y memoria debido a la creación y destrucción constante de procesos. Esto lo hace inadecuado para aplicaciones de alto tráfico. Sin embargo, su simplicidad y el aislamiento de procesos pueden ser ventajosos para scripts de administración o tareas de bajo volumen donde la robustez y la facilidad de desarrollo superan la necesidad de un rendimiento extremo. Un arquitecto debe evaluar si la simplicidad de la interfaz justifica la penalización de rendimiento o si es preferible una solución como FastCGI o un servidor de aplicaciones integrado.