Перейти к содержимому

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 ещё можно встретить:

  1. Древнее сетевое оборудование. Встроенные веб-интерфейсы старых роутеров, управляемых коммутаторов и IP-камер иногда пишут на C/C++ и запускают через легкие веб-серверы вроде BusyBox httpd по протоколу CGI.
  2. Учебные стенды. Понимание CGI полезно студентам и начинающим системным администраторам, чтобы на пальцах разобрать, как HTTP-заголовок превращается в переменные окружения (QUERY_STRING, REQUEST_METHOD) и передаётся в stdin/stdout.

При настройке современных серверов модуль mod_cgi в Apache отключают первым делом, чтобы случайно не открыть вектор атак на сервер через старые скрипты из директивы /cgi-bin/.

  • Хостинг для сайта

    Хостинг для сайта

    Мощный и надежный виртуальный хостинг для сайта с поддержкой 24/7
    Подробнее
  • Почта на домене

    Почта на домене

    Позволяет создавать и использовать адреса электронной почты, привязанные к вашему доменному имени, улучшая профессиональный имидж.
    Подробнее
  • Конструктор сайтов

    Конструктор сайтов

    Генерация сайта за считанные минуты
    Подробнее