Лонгрид • Веб-разработка на C
Сайт на языке C — звучит как безумие. Но это работает.
Когда скорость важнее удобства, а полный контроль над железом — не прихоть, а требование, язык C возвращается в веб. Разбираемся, как CGI и FastCGI превращают программу на C в полноценный сайт — от «Hello, World» до обработки форм.
1

Зачем вообще делать сайт на C

В мире, где правят PHP, Python и Node.js, идея писать веб-приложения на языке 1972 года выглядит странно. Однако есть ниши, где C не просто уместен — он выигрывает с отрывом в разы:

⚡
Экстремальная скорость
Микросекунды на запрос, минимальное потребление памяти. Highload-сервисы и API-шлюзы ценят каждую инструкцию процессора.
🔌
Встраиваемые системы
Веб-интерфейсы роутеров, промышленных контроллеров и IoT-устройств, где вся система уже написана на C.
🔐
Полный контроль
Никаких фреймворков и «чёрных ящиков»: каждый байт памяти и каждый системный вызов — под рукой разработчика.
«Малоизвестный факт: серверы, обслуживающие миллионы веб-запросов, часто сами написаны на C. Nginx, Apache, Redis — весь этот фундамент интернета говорит на языке K&R.»
— Ирония индустрии
2

Два пути: CGI против FastCGI

Веб-сервер не умеет исполнять C-код напрямую — ему нужен посредник. Исторически первым стал протокол CGI, затем на смену пришёл более эффективный FastCGI. Сравните их самостоятельно:

Как это работает
📨 HTTP-запрос → 🖥️ веб-сервер
🖥️ сервер запускает НОВЫЙ процесс (fork + exec)
⚙️ C-программа читает переменные окружения → печатает ответ
💀 процесс умирает после каждого запроса
✅ Плюсы
Простота, изоляция сбоев, поддержка любым сервером
❌ Минусы
Накладные расходы на запуск процесса при каждом запросе
📊 Запросов в секунду (условный бенчмарк простого ответа)
Проведите мышью или нажмите на столбцы, чтобы увидеть детали
CGI на C
PHP-FPM
FastCGI на C
Цифры иллюстративные: зависят от железа, сервера и логики запроса. Порядок соотношения при этом стабилен.
3

Первый CGI-скрипт на C

Всё гениальное просто: CGI-программа печатает HTTP-заголовки, пустую строку, а затем содержимое страницы в стандартный вывод. Веб-сервер пересылает это браузеру.

hello.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // 1. Заголовок Content-Type — обязателен!
    printf("Content-Type: text/html; charset=utf-8\r\n");
    printf("\r\n");  // пустая строка = конец заголовков

    // 2. Тело ответа — обычный HTML
    printf("<html><body><h1>Привет из C!</h1>"
           "<p>QUERY_STRING: %s</p></body></html>",
           getenv("QUERY_STRING"));

    return 0;
}
⬇
Компиляция одной командой
⬇
$ gcc -O2 -o hello.cgi hello.c
💡 Ключевой момент: если забыть пустую строку после заголовков, сервер ответит ошибкой «500 Internal Server Error» — самая частая причина первых терзаний новичков в CGI.
4

Настройка веб-сервера

Apache поддерживает CGI «из коробки» через модуль mod_cgi. Достаточно трёх строк в конфигурации:
# /etc/apache2/sites-enabled/000-default.conf
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
  Options +ExecCGI
  Require all granted
</Directory>
Затем положить hello.cgi в /var/www/cgi-bin/ и дать права на исполнение: chmod +x hello.cgi. Сайт доступен по адресу /cgi-bin/hello.cgi.
5

Обработка форм: GET и POST

Сервер передаёт данные C-программе двумя путями. GET-параметры — в переменной окружения QUERY_STRING, а тело POST-запроса — в стандартном вводе stdin (его длина — в CONTENT_LENGTH).

GET
// QUERY_STRING = "name=Ivan&age=30"
char *qs = getenv("QUERY_STRING");
// дальше разбор по '&' и '='
Данные видны в адресной строке. Подходит для поиска и фильтров.
POST
int len = atoi(getenv("CONTENT_LENGTH"));
char *buf = malloc(len + 1);
fread(buf, 1, len, stdin);
Данные идут в теле запроса. Подходит для паролей и больших текстов.
🔑 Важные переменные окружения CGI
REQUEST_METHOD QUERY_STRING CONTENT_LENGTH REMOTE_ADDR HTTP_USER_AGENT HTTP_COOKIE
6

Безопасность: цена ручного управления памятью

C прощает мало. В вебе, где входные данные приходят от незнакомцев, классические уязвимости языка превращаются в удалённый доступ к серверу. Чек-лист выживания:

Прогресс проверки безопасности
0% — проверка ещё впереди
7

Когда сайт на C — разумный выбор

✔ Оправдано
  • Встраиваемые устройства и IoT
  • Узкие горячие точки highload-сервиса
  • Микросервисы с жёсткими SLA по задержке
  • Код, которому уже 20 лет и он работает
  • Образовательные и исследовательские проекты
✖ Избыточно
  • Корпоративные сайты и лендинги
  • Блоги, форумы, интернет-магазины
  • Проекты без требований к миллисекундам
  • Команды без опыта системной разработки
  • Всё, где скорость разработки важнее скорости исполнения
Итог
Создание сайта на C — это не дань ретро, а инженерный инструмент. Там, где каждый запрос стоит электричества, а каждая миллисекунда — денег, прямая работа с памятью и системными вызовами окупает сложность разработки. CGI открывает дверь за один вечер, FastCGI и libfcgi дают промышленную производительность, а дисциплина в вопросах безопасности отделяет работающий сервис от уязвимого. Сайт на C — это сайт, где не осталось ничего лишнего.