FastCGI - это двоичный протокол для взаимодействия интерактивных программ с веб-сервером. Это разновидность более ранней версии Common Gateway Interface (CGI). Основная цель FastCGI - снизить накладные расходы, связанные с взаимодействием между веб-сервером и программами CGI, позволяя серверу обрабатывать больше запросов веб-страниц в единицу времени.
Общий интерфейс шлюза (CGI) - это протокол для взаимодействия внешних приложений с веб-серверами. Приложения CGI запускаются в отдельных процессах, которые создаются в начале каждого запроса и прерываются в конце. Эта модель «один новый процесс на запрос» делает программы CGI очень простыми для реализации, но ограничивает эффективность и масштабируемость. При высоких нагрузках накладные расходы операционной системы на создание и уничтожение процессов становятся значительными. Кроме того, модель процесса CGI ограничивает методы повторного использования ресурсов, такие как повторное использование соединений с базой данных, кэширование в памяти и т. Д.
Чтобы устранить недостатки масштабируемости CGI, Open Market разработал FastCGI и сначала представили его в своем продукте веб-сервера в середине 1990-х годов. Первоначально Open Market разработал FastCGI отчасти как конкурентный ответ на проприетарные, внутрипроцессные программные интерфейсы приложений (API) от Netscape (Интерфейс прикладного программирования сервера Netscape (NSAPI)) для разработки веб-приложений.
Будучи сначала разработанной Open Market, FastCGI затем был реализован несколькими другими производителями веб-серверов. Однако его подход конкурировал с другими методами для ускорения и упрощения взаимодействия сервер-подпрограмма. Модули HTTP-сервера Apache, такие как mod_perl и mod_php, появились примерно в то же время и быстро завоевали популярность. По состоянию на 2020 год все эти различные методы, включая CGI, остаются в общем использовании.
Вместо создания нового процесса для каждого запроса FastCGI использует постоянные процессы для обработки серии запросов. Эти процессы принадлежат серверу FastCGI, а не веб-серверу.
Для обслуживания входящего запроса веб-сервер отправляет информацию о переменной среды и запрос страницы в процесс FastCGI через любой сокет домена Unix, именованный канал или соединение протокола управления передачей (TCP). Ответы передаются от процесса на веб-сервер по тому же соединению, и затем веб-сервер доставляет этот ответ конечному пользователю . Соединение может быть закрыто в конце ответа, но и веб-сервер, и сервисные процессы FastCGI сохраняются.
Каждый отдельный процесс FastCGI может обрабатывать множество запросов в течение своего времени жизни, тем самым избегая накладных расходов на создание процесса для каждого запроса и прекращение. Одновременная обработка нескольких запросов может выполняться несколькими способами: с использованием одного соединения с внутренним мультиплексированием (т. Е. Несколько запросов по одному соединению); с помощью нескольких подключений; или сочетанием этих методов. Можно настроить несколько серверов FastCGI, что повысит стабильность и масштабируемость.
Администраторы и программисты веб-сайтов могут обнаружить, что отделение веб-приложений от веб-сервера в FastCGI имеет много преимуществ перед встроенными интерпретаторами (mod_perl, mod_php и т. Д.). Такое разделение позволяет перезапускать процессы сервера и приложения независимо - это важное соображение для загруженных веб-сайтов. Он также позволяет реализовать политики безопасности услуг хостинга для каждого приложения, что является важным требованием для интернет-провайдеров и компаний, предоставляющих веб-хостинг. Различные типы входящих запросов могут быть распределены на определенные серверы FastCGI, которые были оборудованы для эффективной обработки этих типов запросов.
FastCGI может быть реализован на любом языке, который поддерживает сетевые сокеты. Поскольку «FastCGI - это протокол, а не реализация», он не привязан к одному языку. Интерфейсы прикладного программирования (API) существуют для:
Последние фреймворки, такие как поскольку Ruby on Rails, Catalyst, Django, Kepler и Plack разрешают использование со встроенными интерпретаторами ( mod_ruby, mod_perl, mod_python или mod_lua, например) или FastCGI.