Тема 8 World Wide Web Обработка запросов на стороне сервера Обзор web-серверов • • • • • Apache IIS – Internet Information Server (Microsoft) lighttpd tux (Red Hat) сервера, встроенные в платформы webприложений (Zope) Взаимодействие web-приложений с web-серверами • CGI – Common Gateway Interface • FastCGI / PCGI (web-приложение – отдельный процесс) • Подключаемые модули (использющие API web-сервера) примеры API: Apache API, isapi, nsapi примеры модулей: mod_perl, mod_php, mod_python, • Использование CGI как шлюза для подключения к внешним приложениям и сервисам Преимущества CGI • Прозрачность использования; • "Языковая" независимость - CGI-программы могут быть написаны на любом языке программирования или командном языке, имеющим средства работы со строками; • Процессная изолированность - при запуске CGIпрограмы на сервере порождается отдельный процесс и ошибочный CGI-скрипт не может сломать Web-сервер или получить доступ к закрытой информации; • Открытость стандарта - CGI интерфейс применим на каждом Web-сервере; • Архитектурная независимость - CGI не зависит от особенностей реализации архитектуры сервера (однопоточности, многопоточности и т.д.); Недостатки CGI • Большое время отклика, т.к. ко времени выполнения CGI-приложения добавляется время на старт процесса • Не подходит для использования при интенсивной обработки запросов, т.к. создаёт большую нагрузку на сервер (накладные расходы на старт процессов, большой расход памяти при одновременном запуске множества скриптов) • CGI-программы не могут быть использованы на этапах HTTP-аутентификации пользователя и проверки прав доступа к ресурсу. Преимущества FastCGI • • • • Быстродействие, увеличенная пропускная способность Простота применения и легкость миграции из CGI. "Языковая" независимость Изолированность процессов - "неисправные" FastCGIпрограммы не могут разрушить ядро сервера, нельзя получить служебную информацию сервера. • Совместимость – поддерживается рядом web-серверов. • Архитектурная независимость - интерфейс не зависит от особенностей реализации серверной архитектуры и прикладные программы могут быть как одно-, так и многопоточными. • Распределённость - FastCGI обеспечивает возможность выполнять приложения удаленно, что используется для распределенной загрузки и управления внешними Webсайтами. Недостатки FastCGI • Нестабильная работа (при подвисании обслуживающих процессов) • Необходимость жёстко следить за освобождением ресурсов (возможны утечки памяти и т.п.) Преимущества API • Максимальное быстродействие • Возможность тесного взаимодействия с сервером, обработки запроса на любой стадии Недостатки API • Неизолированность процесса –снижение общей надёжности, т.к. стабильность всего web-сервера зависит от стабильности webприложения • "Языковая" зависимость • Ограниченность применения – написанные программы в соответствии с данным API могут использоваться только на данном сервере • Повышенный расход памяти процесса webсервера (каждый процесс web-сервера содержит в том числе код web-приложения) Основные переменные окружения в CGI-запросах QUERY_STRING Строка запроса REMOTE_ADDR IP-адрес клиента REMOTE_USER Имя клиента (если он был авторизован) SCRIPT_NAME Имя скрипта SCRIPT_FILENAME Имя файла со скриптом SERVER_NAME Имя сервера HTTP_USER_AGENT Название браузера клиента REQUEST_URI Строка запроса (URI) CONTENT_TYPE Тип контента (для запросов POST) CONTENT_LENGTH Длина контента (для запросов POST) Пример CGI-скрипта #!/usr/bin/perl -w use strict; use CGI qw(:standard); print print print print header; start_html; ‘<H1>Hello, World!</H1>'; end_html; Пример FastCGI-скрипта #!/usr/bin/perl –w use CGI::Fast qw(:standard); $COUNTER = 0; while (new CGI::Fast) { print header; print h1("Fast CGI Rocks"), "Invocation number ",b($COUNTER++), " PID ",b($$),".", hr; } Отделение логики от представления • Отделение бизнес-логики от контента • Отделение контента от дизайна Преимущества: • Упрощение разработки – Разделение сложного целого на составные части – Стимулирует бóльшую степень абстракции и структуризации • Разделение труда – Программист – Верстальщик – Дизайнер Web-шаблоны • Шаблоны служат для отделения логики (программной части) динамического webсайта от представления (вёрстки, дизайна) Виды шаблонов: • Статические – страница генерируется перед публикацией на сервере • Функционирующие на стороне сервера (server-side) – страница генерируется сервером «на лету» • Функционирующие на стороне клиента (client-side) – страница формируется на стороне клиента Виды шаблонов по набору возможностей • Простые – только подстановка переменных. Примеры: команда print в Perl, echo в PHP "Hello $x“ • С поддержкой итерации – возможности простых шаблонов + возможность повторения блоков с разными наборами данных. Примеры: HTML::Template (Perl), phpBBшаблоны • Сложные – поддержка логики, параметризация блоков, циклы, выражения. Примеры: XSL, Template::Toolkit (Perl), Smarty (PHP) Процессор шаблонов Template::Toolkit • Подстановка переменных: [% variable %], [% var.subvar %] • Вызов процедур и методов: [% function() %], [% password.length %] • Выражения: [% discount / 100 + 1 %] • Итераторы: [% FOREACH r = rows %] <li>[% r %] [% END %] • Условные конструкции: [% IF condition %]истина[% ELSE %]ложь[% END %] [% UNLESS condition %]ложь[% END %] • Операция выбора: [% SWITCH code %] [% CASE ‘a’ %]Выбран вариант A [% CASE %]Выбран неизвестный вариант [% END %] • Подстановка шаблонов: [% INCLUDE header.inc %], [% PROCESS header.inc %] • Фильтры: [% content | html %] [% INCLUDE myfile | trim %] Пример шаблона Template::Toolkit [% INCLUDE header title = 'This is an example' %] <h1>Some Interesting Links</h1> [% webpages = [ { url => 'http://foo.org', title => 'The Foo Organisation' }, { url => 'http://bar.org', title => 'The Bar Organisation' } ]%] Links: <ul> [% FOREACH link = webpages %] <li><a href="[% link.url %]">[% link.title %]</a> [% END %] </ul> [% INCLUDE footer %] Схема работы web-приложения Входные параметры Шаблон Template processor Готовая HTMLстраница Данные Бизнеслогика БД Архитектура MVC (Model View Controller) Архитектура MVC и классическая архитуктура domain/UI View Пользовательский интерфейс (UI) Бизнес-логика предметной области (domain logic) Controller Model Преимущества отделения пользовательского интерфейса от логики предметной области: • это наиболее простой путь облегчить решение сложных задач •возможно создание нескольких различных интерфейсов, не изменяя логику предметной области Компоненты архитектуры MVC Шаблон MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента • Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контролера), изменяя свое состояние . • Представление (View). Отвечает за отображение информации (пользовательский интерфейс). • Контролер (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции. Уточнённая схема работы web-приложения Вх. параметры Шаблон Template processor Готовая HTMLстраница Данные V БД Web-каркасы Web-сервер Сессии БД Каркас web-приложения Процессор шаблонов Web-приложение (бизнес-логика) Функции каркаса • Работа с сессией • Взаимодействие с web-сервером (раз-бор параметров, Cookie и т.п.) • Взаимодействие с БД • Обработка шаблонов • Обработка ошибок • Базовая архитектура приложения (MVC и т.п.) • Журналирование • Вызов обработчиков страниц, поддержка переадресации между обработчиками Примеры каркасов • • • • • • Catalyst (Perl) ASP.NET (C#, VB.NET) Zope (Python) Ruby On Rails (Ruby) Spring, GRails (Java) Cold Fusion (CFML) Web-сервер apache Команды запуска/остановки/перезапуска: /etc/init.d/httpd start|stop|restart|reload apachectl start|stop|restart|reload Файлы конфигурации: /etc/httpd/ /etc/httpd/conf/httpd.conf Файл конфигурации Apache Listen 80 ServerAdmin [email protected] ErrorLog logs/error_log DirectoryIndex index.php index.shtml index.html index.htm AddHandler cgi-script .cgi AddHandler cgi-script .pl AddType text/html .shtml AddDefaultCharset windows-1251 NameVirtualHost *:80 Пример секции VirtualHost <VirtualHost *:80> ServerName site.ru ServerAlias www.site.ru DocumentRoot /www/site.ru ErrorLog /var/log/httpd/site.ru-errors CustomLog /var/log/httpd/site.ru-access combined <Directory "/www/site.ru"> AllowOverride All </Directory> <LocationMatch "^/$"> DirectoryIndex /cgi-bin/index.fcgi </LocationMatch> Redirect /icons/ http://www.icons.ru/ ScriptAlias /cgi-bin/ /www/site.ru/perl/ AddHandler cgi-script .cgi </VirtualHost> Увеличение производительности web-решений • Модернизация аппаратного обеспечения • Оптимизация настройки ОС и webсервера (введение кэширования, отключение лишних модулей и т.п.) • Модернизация web-приложения – оптимизация узких мест – уменьшение объема требуемой памяти (отказ от лишних библиотек и т.п.) – кэширование данных из БД • Распределение нагрузки Распределение нагрузки. Кластеры Виды кластеров • Кластеры высокой надежности (HA) • Кластеры повышенной производительности (HPC) • Кластеры распределения нагрузки (Load Balancing) Серверные фермы (server farms) Способы распределения нагрузки • Без использования посредников (Round robin DNS, использование разных доменов/поддоменов) • IP-level (transparent proxy, layer 4 router) • Web-server level (reverse proxy, caching HTTP proxy) • Web-приложение делегирует выполнение определённых операций другим машинам – Распределённые базы данных – Выполнение сложных вычислений и обработки с привлечением дополнительных серверов Эти способы могут произвольно комбинироваться. Без использования посредников Сервер 1 (IP 1) Сервер 2 (IP 2) Сервер 3 (IP 3) Layer 4 router / transparent IP proxy Сервер 1 Сервер 2 Transparent IP proxy (real IP) Сервер 3 Reverse HTTP proxy Сервер 1 Сервер 2 Reverse HTTP proxy (real IP) Сервер 3 Функции reverse proxy • • • • Обеспечение безопасности (Security) Шифрование (Encryption) Компрессия (Compression) Распределение нагрузки (load distribution) • Кэширование (caching) • Работа с медленными клиентами (spoon feeding) Делегирование отдельных задач / распределение нагрузки между БД Application server 1 БД 1 Web server (real IP) БД 2 Application server 2 Литература • Протокол CGI http://python.onego.ru/course/lect8.html • Модуль CGI http://search.cpan.org/~lds/CGI.pm-3.25/CGI.pm • Модуль CGI::Fast http://search.cpan.org/author/LDS/CGI.pm-3.25/CGI/Fast.pm • Архитектура MVC http://en.wikipedia.org/wiki/Model-view-controller http://ru.wikipedia.org/wiki/Model_View_Controller • Распределение нагрузки http://en.wikipedia.org/wiki/Reverse_proxy http://en.wikipedia.org/wiki/Load_balancing_%28computing%29 http://en.wikipedia.org/wiki/Layer_4_router