Простой общий интерфейс шлюза (SCGI ) - это протокол для приложений для взаимодействия с серверами HTTP в качестве альтернативы протоколу CGI. Он похож на FastCGI, но разработан таким образом, чтобы его было проще анализировать. В отличие от CGI, он позволяет длительному процессу обслуживания продолжать обслуживать запросы, тем самым избегая задержек в ответе на запросы из-за накладных расходов на установку (таких как подключение к базе данных).
SCGI - это протокол, который определяет связь между веб-сервером и сервером приложений. Это контрастирует с CGI, который представляет собой более ранний интерфейс приложения (шлюз ), разработанный, чтобы позволить программисту приложений избежать сложности сокетов и длительных процессов обслуживания, когда приемлемы низкая масштабируемость и высокие накладные расходы.
Протокол SCGI использует тот факт, что клиент уже проанализировал и проверил HTTP-запрос, и канонически передает запрос на сервер SCGI, позволяя программисту приложений избежать синтаксического анализа неоднозначностей и пограничных случаев протокола. Это позволяет избежать сложных правил синтаксического анализа и объединения заголовков из RFC2616, что значительно снижает сложность процесса сервера SCGI.
Нил Шеменауэр опубликовал оригинальную спецификацию протокола SCGI, датированную октябрем 2001 г. Он разработал первые реализации SCGI и первоначально опубликовал их в Апрель 2002 г.
Клиент подключается к серверу SCGI по надежному потоковому протоколу, позволяющему передавать 8-битные байты. Клиент начинает с отправки запроса. Когда сервер SCGI видит конец запроса, он отправляет ответ и закрывает соединение. Формат ответа специально не указан в этом протоколе, хотя обычно используются ответы HTTP, эквивалентные CGI.
Запрос SCGI представляет собой конкатенацию netstring -кодированные заголовки и тело. Ответ SCGI - это обычный HTTP-ответ.
Каждый заголовок состоит из пары имя-значение, где и имя, и значение являются строками с завершающим нулем (строками C ). Значением может быть пустая строка, и в этом случае завершающий нуль все равно остается. Ни имя, ни значение не могут содержать никаких встроенных нулевых байтов. Эти соображения являются стандартными для строк C, но часто сбивают с толку программистов, привыкших к другим стандартам обработки строк.
Все предоставленные заголовки объединяются для формирования единой байтовой последовательности, затем кодируются netstring. Затем добавляется необработанное тело, если оно есть.
Повторяющиеся имена не допускаются в заголовках запроса; RFC2616 -совместимое объединение заголовков должно быть уже выполнено. Первый заголовок запроса должен иметь имя «CONTENT_LENGTH» и значение, которое представляет собой длину тела в десятичном формате. Заголовок запроса «CONTENT_LENGTH» должен присутствовать всегда, даже если его значение равно «0». Также всегда должен быть заголовок запроса с именем «SCGI» и значением «1». Стандартные переменные среды CGI должны быть указаны в заголовках SCGI для совместимости при преобразовании старых программ CGI в SCGI. Тело запроса (если таковое имеется) следует за заголовками; его длина определяется заголовком запроса «CONTENT_LENGTH».
Хотя протокол SCGI изолирует программиста службы от некоторых соображений HTTP, различных деталей (таких как интерпретация октетов тела сообщения в соответствии с заголовком Transfer-Encoding, CONTENT_LENGTH - это количество октетов после того, как тело были закодированы для передачи и т. д.) по-прежнему требуют знания спецификации протокола HTTP.
Веб-сервер (клиент SCGI) открывает соединение и отправляет конкатенацию следующих строк процессу службы (серверу SCGI):
"70 : "" CONTENT_LENGTH "<00>" 27 "<00>" SCGI "<00>" 1 "<00>" REQUEST_METHOD "<00>" POST "<00>" REQUEST_URI "<00>" / глубокая мысль "<00>"," "Каков ответ жизни?"
Сервер SCGI отправляет веб-серверу следующий ответ:
«Статус: 200 OK» <0d 0a>«Content-Type: text / plain» <0d 0a>«» <0d 0a>"42"
Сервер SCGI закрывает соединение.
(этот список не полный)
SCGI могут быть реализованы на любом языке, который поддерживает сетевые сокеты и netstrings. Ниже приведен неполный список языков с известными привязками SCGI:
Протоколы приложений / Gatway:
Хосты приложений (зависит от языка):