Средства доступа к базам данных на стороне сервера
Средства доступа к базам данных
на стороне сервера
CGI
Common Gateway Interface - это спецификация
интерфейса взаимодействия
Web-сервера с внешними прикладными
программами. Главное назначение CGI -
обеспечение единообразного потока
данных между сервером и работающим
на нем приложением. CGI определяет:
- порядок взаимодействия
сервера с прикладной
программой, в котором сервер
выступает инициирующей
стороной;
- механизм реального обмена
данными и управляющими
командами в этом
взаимодействии, что не
определено в протоколе HTTP.
Такие понятия, как метод
доступа, переменные заголовка,
MIME, типы данных, заимствованы
из HTTP и делают спецификацию
прозрачной для тех, кто знаком
с самим протоколом.
Обычно гипертекстовые документы,
возвращаемые по запросу клиента WWW
сервером, содержат статические
данные. CGI обеспечивает средства
создания динамических Web-страниц на
основе данных, полученных от
пользователя. Программы,
написанные в соответствии со
спецификацией CGI, называются
CGI-скриптами или шлюзами. Шлюз - это
CGI-скрипт, который используется для
обмена данными с другими
информационными ресурсами Internet или
приложениями-демонами такими, как,
например, система управления
базами данных. Обычная CGI-программа
запускается Web-сервером для
выполнения некоторой работы,
возвращает результаты серверу и
завершает свое выполнение (рис. 1).
Рис. 1. Схема взаимодействия
CGI-скрипта.
Шлюз выполняется точно также,
только, фактически, он инициирует
взаимодействие в качестве клиента
с третьей программой (рис. 2). Если
эта третья программа является
сервером БД, то шлюз становится
клиентом СУБД, который посылает
запрос по определенному порту
соединения с системой управления
базами данных, а после получения
ответа пересылает его WWW-серверу.
Рис.2. Схема взаимодействия
CGI-шлюза.
Обмен данными по спецификации CGI
реализуется обычно через
переменные окружения и стандартный
ввод/вывод. Выбор механизма
передачи параметров определяется
методом доступа, который
указывается в форме в атрибуте METHOD.
Если используется метод GET, то
передача параметров происходит с
помощью переменных окружения,
которые сервер создает при запуске
внешней программы. Через них
передается приложению как
служебная информация (версия
программного обеспечения, доменное
имя сервера и др.), так сами данные (в
переменной QUERY_STRING). При методе POST
для передачи используется
стандартный ввод. А в переменных
окружения фиксируется тип и длина
передаваемой информации (CONTENT_TYPE и
CONTENT_LENGTH).
Стандартный вывод используется
скриптом для возврата данных
серверу. При этом вывод состоит из
заголовка и собственно данных.
Результат работы скрипта может
передаваться клиенту без
каких-либо преобразований со
стороны сервера, если скрипт
обеспечивает построение полного
HTTP-заголовка, в противном случае
сервер модифицирует заголовок в
соответствии со спецификацией HTTP.
Обязательным для скриптов при
генерировании документов "на
лету", когда реального документа
в файловой системе сервера не
остается является только
HTTP-заголовок Content-type, в котором
указывается тип возвращаемого
документа для правильной
интерпретации браузером. Обычно в
Content-type указывают текстовые типы
text/plain и text/html. При использовании
такого вида скриптов следует
учитывать, что не все серверы и
клиенты отрабатывают так, как
представляется разработчику
скрипта. Так, при указании Content-type:
text/html, некоторые клиенты не
реализуют сканирования
полученного текста на предмет
наличия в нем встроенной графики
При применение спецификаци CGI для
обмена данными с внешними
прикладными программами можно
выделить следующие преимущества:
- Прозрачность использования;
- "Языковая" независимость -
CGI-программы могут быть
написаны на любом языке
программирования или
командном языке, имеющим
средства работы со строками;
- Процессная изолированность -
при запуске CGI-програмы на
сервере порождается отдельный
процесс и ошибочный CGI-скрипт
не может сломать Web-сервер или
получить доступ к закрытой
информации;
- Открытость стандарта - CGI
интерфейс применим на каждом
Web-сервере;
- Архитектурная независимость -
CGI не зависит от особенностей
реализации архитектуры
сервера (однопоточности,
многопоточности и т.д.);
Но CGI имеет также и существенные
недостатки. Главная проблема
заключается в затратах на
выполнение CGI-приложений: поскольку
на сервере для каждого очередного
запроса порождается новый процесс,
который завершается после его
выполнения, то это приводит к
невысокому быстродействию
CGI-скрипта и снижает эффективность
работы сервера. При использовании
CGI-программ для доступа к базам
данных из-за неподдержки
непрерывного соединения Web-сервера
и соответствующей СУБД очень
сложно произвести процесс
"ведения" пользователя базой
данных, так как каждый раз при
генерации очередного запроса
требуется новое подключение. Но в
то же время закрытие соединения
после обработки каждого запроса
сильно осложняет деятельность
хакеров, так как при отсутствии
постоянного подключения к БД
проникнуть в нее гораздо сложнее.
Другое достоинство этого
"недостатка" состоит в том, что
связь с Web-сервером устанавливается
только на короткий промежуток
времени, в результате чего он не
перегружается и может выполнять
другие задачи.
CGI`также ограничен по способности
функционирования - спецификация
предусматривает только простую
"ответную" роль скрипта при
генерации результата на запрос
пользователя. CGI-программы не имеют
взаимосвязей с установлением
аутентификации пользователя и
проверки его входных данных.
API
В ответ на ограничения и
недостатки спецификации CGI была
разработана спецификация
прикладных модулей API, встроенных в
сервер. Данное расширение
Web-сервера запускается как
динамическая библиотека и
выполняет обработку каждого вызова
сервера по отдельной структуре
памяти, что значительно проще, чем
создание отдельного процесса для
каждого клиентского запроса.
Наиболее известны два API-интерфейса
- NSAPI компании Netscape и ISAPI компании
Microsoft. Свободно распространяемый
популярный Unix-сервер Apache также
имеет модуль PHP, реализующий данный
интерфейс. Приложения, работающие
через API, соединяются с сервером
значительно быстрее, чем
CGI-программы, так как API выполняется
в основном процессе сервера и
постоянно находится в состоянии
ожидания запросов, поэтому время на
запуск программы и порождения
нового процесса не требуется.
API-интерфейс предоставляет и
большую функциональность, чем CGI -
можно написать дополнительные
процедуры, осуществляющие контроль
доступа к файлам, получающие доступ
к log-файлам сервера и связывающиеся
с другими этапами обработки
запроса сервером.
Тем не менее спецификация API не
имеет преимуществ CGI-интерфейса и
поставщики API-модулей тоже
сталкиваются с целым рядом проблем:
- "Языковая" зависимость -
прикладные программы могут
быть написаны только на языках,
поддерживаемых в данном API
(обычно это С/C++); Perl, наиболее
популярный язык для
CGI-скриптов, как правило, не
используется в существующих
поставляемых API-модулях.
- Неизолированность процесса -
так как приложения выполняются
в адресном пространстве
сервера, то ошибочные
программы могут "уронить"
сервер или какое-либо
приложение. Таким образом
вполне возможно (намеренно или
нет) сломать систему
безопасности сервера.
- Ограниченность применения -
написанные программы в
соответствии с данным API могут
использоваться только на
данном сервере.
- Архитектурная зависимость -
API-приложения зависимы от
архитектуры сервера: если
сервер поддерживает
однопоточность, то
многопотоковые приложения не
получают никакого
преимущества в быстродействии
при выполнении. Также при
изменении производителем
архитектуры сервера, модуль API
обычно тоже подвергается
изменениям, и прикладные
программы соответственно тоже
требуют переделки или даже
могут быть написаны заново.
FastCGI Интерфейс FastCGI сочетает в
себе наилучшие аспекты
спецификаций CGI и API. Взаимодействие
в соответствии с FastCGI происходит
сходным образом с CGI.
FastCGI-приложения запускаются
отдельными изолированными
процессами. Отличие состоит в том,
что эти процессы являются
постоянно работающими и после
выполнения запроса не завершаются,
а ожидают новых запросов. Вместо
использования переменных
окружения операционной системы и
стандартных потоков ввода/вывода
протокол FastCGI объединяет
информацию среды, стандартный ввод,
вывод и сообщения об ошибках в
единственное дуплексное
соединение. Это позволяет
FastCGI-программам выполняться на
удаленных машинах, используя
TCP-соединения между Web-сервером и
FasstCGI-модулем.
Таким образом, преимущества FastCGI
состоят в следующем:
- Быстродействие - благодаря
постоянному функционированию
FsatCGI-процессов обеспечивается
обслуживание одним процессом
многих запросов, что решает
задачу и связанные с ней
проблемы порождения нового
процесса на отдельный
клиентский запрос.
- Простота применения и легкость
миграции из CGI.
- "Языковая" независимость -
как и CGI, FastCGI-приложения могут
быть написаны на любых языках
программирования или
командных языках.
- Изолированность процессов -
"неисправные"
FastCGI-программы не могут
разрушить ядро сервера или
какие-либо другие приложения, а
также получить секретную
служебную информацию.
- Совместимость - FastCGI
поддерживается во всех
открытых продуктах, включая
коммерческие серверы Netscape и
Microsoft, NCSA сервер и свободно
распространяемый Apache.
- Архитектурная независимость -
FastCGI интерфейс не зависит от
особенностей реализации
серверной архитектуры и
прикладные программы могут
быть как одно-, так и
многопоточными.
- Распределенность - FastCGI
обеспечивает возможность
выполнять приложения удаленно,
что используется для
распределенной загрузки и
управления внешними Web-сайтами.
[Содержание] [Вперед]
|