Эта статья требует дополнительных ссылок для проверки . ( октябрь 2017 г. ) ( Узнайте, как и когда удалить это сообщение-шаблон ) |
Simple Common Gateway Interface ( SCGI ) представляет собой протокол для приложений для взаимодействия с HTTP серверами, в качестве альтернативы CGI протоколу. Он похож на FastCGI, но разработан для упрощения синтаксического анализа. В отличие от CGI, он позволяет длительному процессу обслуживания продолжать обслуживать запросы, тем самым избегая задержек в ответе на запросы из-за накладных расходов на настройку (например, при подключении к базе данных).
SCGI - это протокол, который определяет связь между веб-сервером и сервером приложений. Это контрастирует с CGI, который представляет собой более ранний интерфейс приложения ( шлюза ), разработанный, чтобы позволить программисту приложений избежать сложности сокетов и длительных процессов обслуживания, когда приемлемы низкая масштабируемость и высокие накладные расходы.
Протокол SCGI использует тот факт, что веб-сервер уже проанализировал и подтвердил HTTP-запрос, и канонически передает запрос на сервер SCGI, позволяя программисту приложений избежать синтаксического анализа неоднозначностей и пограничных случаев протокола. Это позволяет избежать сложных правил синтаксического анализа и объединения заголовков из RFC 2616 , что значительно снижает сложность процесса сервера SCGI.
История [ править ]
Нил Шеменауэр опубликовал оригинальную спецификацию протокола SCGI, датированную октябрем 2001 года. [1] Он разработал первые реализации SCGI и первоначально опубликовал их в апреле 2002 года. [2]
Спецификация [ править ]
Клиент подключается к серверу SCGI по надежному потоковому протоколу, позволяющему передавать 8-битные байты. Клиент начинает с отправки запроса. Когда сервер SCGI видит конец запроса, он отправляет ответ и закрывает соединение. Формат ответа специально не указан в этом протоколе, хотя обычно используются ответы HTTP, эквивалентные CGI. [примечание 1]
Формат запроса [ изменить ]
Запрос SCGI является конкатенацией из netstring закодированы заголовков и тела. Ответ SCGI - это обычный HTTP-ответ.
Каждый заголовок состоит из пары имя-значение , где и имя, и значение представляют собой строки с завершающим нулем ( строки C ). Значение может быть пустой строкой , и в этом случае завершающий нуль все равно остается. Ни имя, ни значение не могут содержать никаких встроенных нулевых байтов . Эти соображения являются стандартными для строк C, но часто сбивают с толку программистов, привыкших к другим стандартам обработки строк.
Все предоставленные заголовки объединяются в одну байтовую последовательность, затем кодируются netstring. Затем добавляется необработанное тело, если оно есть.
В заголовках запроса не допускаются повторяющиеся имена; Соответствующее RFC 2616 объединение заголовков [примечание 2] должно было уже иметь место. Первый заголовок запроса должен иметь имя «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 ОК» <0d 0a> "Content-Type: text / plain" <0d 0a> "" <0d 0a> «42»
Сервер SCGI закрывает соединение.
Веб-серверы, реализующие SCGI [ править ]
(этот список не полный)
- HTTP-сервер Apache
- Чероки
- Lighttpd
- Microsoft Internet Information Services с расширением ISAPI SCGI
- nginx
Привязки языков для SCGI API [ править ]
SCGI может быть реализован на любом языке, который поддерживает сетевые сокеты и сетевые строки . Ниже приведен неполный список языков с известными привязками SCGI:
- Кобра
- D с библиотекой arsd.cgi
- Haskell
- Java , с коннектором SCGI или с библиотекой [1]
- Лисп
- Perl с пакетом SCGI или фреймворком Plack
- PHP
- Python
- Ракетка с библиотекой scgi
- Рубин
- Ржавчина , с Tokio-SCGI обрешетке
- Схема
- Tcl
- Ним
См. Также [ править ]
Протоколы приложений / Gatway:
- Общий интерфейс шлюза (CGI) - запускает дочерний процесс по запросу
- FastCGI - попытки повысить масштабируемость за счет поддержки длительных процессов, подобных CGI.
- Протокол Apache JServ - двоичный протокол, предназначенный для прокси-запросов между веб-сервером и сервером приложений.
Хосты приложений (в зависимости от языка):
- Стойка - интерфейс веб-сервера Ruby
- PSGI - интерфейс шлюза веб-сервера Perl
- WSGI - интерфейс шлюза веб-сервера Python
- JSGI - интерфейс шлюза веб-сервера JavaScript
Заметки [ править ]
- 1. ^ Документ спецификации был размещен в открытом доступе Нилом Шеменауэром 12 января 2006 г.
- 2. ^ Информацию об объединении заголовков HTTP см. В разделе 4.2 RFC2616 .
Ссылки [ править ]
- ^ Schemenauer, Нил (30 октября 2001). «SCGI: простой альтернативный интерфейс общего шлюза» . Архивировано из оригинала на 2002-04-03.
- ^ "scgi-0.1.tar.gz" . Индекс / программное обеспечение / файлы / scgi. MNX: MEMS и обмен нанотехнологиями . 12 апреля, 2002. Архивировано из оригинала на 2002-10-20.
Внешние ссылки [ править ]
- Официальный веб-сайт
- Спецификация протокола SCGI