CGI
CGI (Common Gateway Interface) — это древний стандарт взаимодействия веб-сервера с внешними программами и консольными скриптами.
Что даёт
Сейчас CGI интересует разработчиков преимущественно в историческом контексте — как пример того, как делать не надо в современном бэкенде.
Схема работы у него предельно топорная. Заходит посетитель на страницу, веб-сервер принимает HTTP-запрос и с помощью системного вызова fork() или exec() поднимает в операционной системе отдельный процесс (например, интерпретатор Perl или C-бинарник). Процесс считывает переменные окружения, выполняет код, сбрасывает результат в стандартный вывод stdout и моментально умирает.
Когда на сайт заходят три человека в день, схема работает. Но как только посещаемость растёт, начинается катастрофа.
Почему от CGI полностью отказались:
- Конский оверхед. Создание процесса в Linux — операция относительно недорогая, но подгрузка с диска тяжелого интерпретатора и инициализация кода на каждый чих съедает весь CPU и забивает оперативку.
- Отсутствие состояния (stateless). Нельзя переиспользовать постоянные соединения с базой данных (connection pooling) или держать кеш в памяти процессора — при каждом запросе всё инициализируется с нуля.
- Плохая безопасность. Скрипты часто запускались от имени того же пользователя, что и сам веб-сервер, или требовали поднятия SUID-битов, что при малейшей ошибке в коде давало злоумышленникам root-доступ к хосту.
Как использовать
В современном продакшене CGI не используют ни для CMS (WordPress, Bitrix), ни для фреймворков (Laravel, Django). Ему на смену давно пришли демон-процессы, работающие по протоколам FastCGI, WSGI, ASGI или встроенные HTTP-серверы внутри самих рантаймов (Node.js, Go).
Единственные места, где CGI ещё можно встретить:
- Древнее сетевое оборудование. Встроенные веб-интерфейсы старых роутеров, управляемых коммутаторов и IP-камер иногда пишут на C/C++ и запускают через легкие веб-серверы вроде BusyBox httpd по протоколу CGI.
- Учебные стенды. Понимание CGI полезно студентам и начинающим системным администраторам, чтобы на пальцах разобрать, как HTTP-заголовок превращается в переменные окружения (QUERY_STRING, REQUEST_METHOD) и передаётся в stdin/stdout.
При настройке современных серверов модуль mod_cgi в Apache отключают первым делом, чтобы случайно не открыть вектор атак на сервер через старые скрипты из директивы /cgi-bin/.