- •Оглавление
- •Практическое занятие 1. Адресация iPv4
- •1.1. Протокол ip версии 4
- •1.1.1. Понятие ip-адресации
- •1.1.2. Представление и структура адреса iPv4
- •1.1.3. Классовая адресация iPv4
- •1.1.4. Частные и публичные адреса iPv4
- •1.1.5. Формирование подсетей
- •1.1.6. Маски подсети переменной длины (vlsm)
- •1.1.7. Бесклассовая адресация iPv4
- •1.1.8. Общие функции классовой и бесклассовой адресации
- •1.2. Выделение адресов
- •1.3. Агрегирование маршрутов и суперсети
- •6.4. Способы конфигурации адреса iPv4
- •Практическое занятие 1. Задания
- •1.1. Преобразование десятичного формата представления числа в двоичный
- •1.2. Преобразование двоичного формата представления числа в десятичный
- •1.3. Преобразование ip-адреса из десятичного формата в двоичный
- •1.4. Преобразование ip-адреса из двоичного формата в десятичный
- •1.5. Определение классов ip-адресов
- •1.6. Определение допустимых для использования ip-адресов
- •1.7. Вычисление количества битов, необходимого для подсетей
- •1.8. Вычисление масок подсети
- •1.9. Разбиение сети на подсети с использованием маски подсети фиксированной длины
- •2.1. Формат заголовка iPv6
- •2.2. Представление и структура адреса iPv6
- •0:0:0:0:0:0:13.1.68.3 Или в сокращенном виде ::13.1.68.3
- •0:0:0:0:0:Ffff:129.144.52.38 или в сокращенном виде ::ffff:129.144.52.38
- •2.3. Типы адресов iPv6
- •2.4. Индивидуальные адреса
- •Идентификатор интерфейса
- •Глобальные индивидуальные адреса iPv6
- •Локально-используемые индивидуальные адреса iPv6
- •2.5. Альтернативные адреса
- •2.6. Групповые адреса
- •2.7. Способы конфигурации адреса iPv6
- •2.8. Планирование подсетей iPv6
- •3.2 Методика расчета времени двойного оборота и уменьшения межкадрового интервала
- •3.3 Пример расчета конфигурации сети
- •Практическое занятие 3. Задание
- •3.1. Произвести оценку конфигурации сети в соответствии с вариантом:
- •3.2. По результатам расчетов сделать вывод о корректности конфигурации сети Ethernet.
- •Практическое занятие 4. Система доменных имен
- •4.1. Пространство имен
- •4.1.1. Плоское пространство имен
- •4.1.2. Иерархическое пространство имен
- •4.1.5.1.2. Частично определенное имя домена
- •4.1.6. Домен
- •4.2. Распределение имен
- •4.2.1. Иерархия серверов имен
- •4.2.2. Зона
- •4.2.3. Корневой сервер
- •4.2.4. Первичные и вторичные серверы
- •4.3. Dns в Интернете
- •4.3.1. Родовой домен
- •4.3.2. Домены страны
- •4.3.3. Инверсный домен
- •4.4. Распознавание имен
- •4.4.1. Распознаватель (resolver)
- •4.4.2. Отображение имен в адреса
- •4.4.3. Отображение адресов в имена
- •4.4.4. Рекурсивное распознавание
- •4.4.5. Итерационное распознавание
- •4.4.6. Кэширование
- •4.5.1. Заголовок
- •4.6.2. Запись ресурса
- •4.7. Сжатие
- •Примеры
- •Пример 1
- •Пример 2
- •4.9. Инкапсуляция
- •Практическое занятие 4. Задания
- •Практическое занятие 5. Протокол snmp (Простой протокол управления сетью)
- •5.2. Концепция
- •5.3. Менеджеры и агенты
- •5.4. Компоненты управления
- •5.4.1. Задачи snmp
- •5.4.2. Задачи smi
- •5.4.3. Задачи mib
- •5.4.4. Аналогия
- •5.5. Общие замечания
- •5.6. Структура управляющей информации, версия 2 (smIv2)
- •5.6.2.1. Простой тип
- •5.6.2.2. Структурированный тип
- •5.7. Метод кодирования
- •5.7.1.2. Таблицы
- •Лексикографическое упорядочение
- •Ответ (Response)
- •Ловушка (Trap)
- •5.9. Формат
- •5.10. Сообщения
- •Пример 1
- •Практическое занятие 5. Задания
- •Практическое занятие 6. Гипертекстовый протокол http (часть 1)
- •6.1. Соглашения по нотации и общая грамматика. Расширенные bnf
- •6.2. Основные правила
- •6.2. Параметры протокола. Версия http
- •6.3. Универсальные идентификаторы ресурсов (uri)
- •6.4. Общий синтаксис
- •6.4.2. Сравнение uri
- •6.5. Форматы даты/времени. Полная дата
- •6.5.1. Интервалы времени в секундах
- •6.6. Наборы символов
- •Кодировки содержимого
- •Транспортное кодирование
- •Типы среды
- •Канонизация и текст по умолчанию
- •Составные типы
- •Лексемы (token) продукта
- •2.9. Значения качества (Quality values)
- •Языковые метки
- •Метки объектов
- •Структурные единицы
- •Http сообщение. Типы сообщений
- •Заголовки сообщений
- •Общие поля заголовка
- •Строка запроса
- •Uri запроса
- •Ресурс, идентифицируемый запросом
- •Поля заголовка запроса
- •Статусная строка
- •Статусный код и словесный комментарий
- •Поля заголовка отклика
- •Объект (Entity)
- •Поля заголовка объекта
- •Тело объекта
- •Соединения. Постоянные соединения. Цель
- •Общие процедуры
- •Согласование
- •Буферизация
- •Проксисерверы
- •Практические соображения
- •Требования к передаче сообщений
- •Метод определений
- •Безопасные и идемпотентные методы. Безопасные методы
- •Идемпотентные методы
- •Метод get
- •Метод head
- •Метод post
- •Метод put
- •Метод delete
- •Метод trace
- •Successful 2xx (Успешная доставка)
- •201 Created (Создано)
- •202 Accepted (Принято)
- •203 NonAuthoritative Information (Не надежная информация)
- •204 No Content (Никакого содержимого)
- •205 Reset Content (Сброс содержимого)
- •206 Partial Content (Частичное содержимое)
- •Redirection 3xx (Переадресация)
- •300 Multiple Choices (Множественный выбор)
- •301 Moved Permanently (Постоянно перемещен)
- •302 Moved Temporarily (Временно перемещен)
- •303 See Other (смотри другие)
- •304 Not Modified (Не модифицировано)
- •305 Use Proxy (Используйте прокси)
- •Client Error 4xx (Ошибка клиента)
- •400 Bad Request (Плохой запрос)
- •401 Unauthorized (Не авторизован)
- •402 Необходима оплата
- •403 Forbidden (Запрещено)
- •404 Not Found (Не найдено)
- •405 Method Not Allowed (Метод не разрешен)
- •406 Not Acceptable (Не приемлемо)
- •407 Proxy Authentication Required (Необходима идентификация прокси)
- •408 Request Timeout (Таймаут запроса)
- •409 Conflict (Конфликт)
- •410 Gone (Исчез)
- •415 Unsupported Media Type (Неподдерживаемый тип среды)
- •Server error 5xx (ошибка сервера)
- •Базовая схема идентификации (Authentication)
- •Краткое изложение схемы авторизации
- •Согласование содержимого
- •Согласование, управляемое сервером
- •Согласование, управляемое агентом (Agentdriven Negotiation)
- •Прозрачное согласование (Transparent Negotiation)
- •Кэширование в http
- •Корректность кэша
- •Предупреждения
- •Механизмы управления кэшем
- •Прямые предупреждения агента пользователя
- •Исключения для правил и предупреждений
- •Работа под управлением клиента
- •Модель истечения срока годности. Определение срока годности под управлением сервера
- •Эвристический контроль пригодности
- •Вычисление возраста
- •Вычисление времени жизни (Expiration)
- •Устранение неопределенности значений времени жизни
- •Неопределенность из-за множественных откликов
- •Модель проверки пригодности
- •Даты последней модификации
- •Валидаторы кэша для меток объектов (Entity Tag Cache Validators)
- •Слабые и сильные валидаторы
- •Правила того, когда использовать метки объекта и даты последней модификации
- •Условия пригодности
- •Кэшируемость отклика
- •Формирование откликов кэшей
- •Заголовки End-to-end (точкаточка) и Hop-by-hop (шагза-шагом)
- •Немодифицируемые заголовки
- •Комбинирование заголовков
- •Комбинирование байтовых фрагментов
- •Кэширование согласованных откликов
- •Кэши коллективного и индивидуального использования
- •Ошибки и поведение кэша при неполном отклике
- •Побочные эффекты методов get и head
- •Несоответствие после актуализации или стирания
- •Обязательная пропись (Write-Through Mandatory)
- •Замещения в кэше
- •Списки предыстории
- •Определения полей заголовка
- •Поле Accept
- •Поле Accept-Charset
- •Поле Accept-Encoding
- •Поле Accept-Language
- •Поле Accept-Ranges
- •Поле Age
- •Поле Allow
- •Авторизация
- •Поле Cache-Control
- •Что допускает кэширование?
- •Что может быть записано в память кэша?
- •Модификации базового механизма контроля времени жизни
- •Управление перепроверкой пригодности и перезагрузкой
- •Директива No-Transform
- •Расширения управления кэшем
- •Соединение
- •Кодирование содержимого
- •Язык содержимого
- •Длина содержимого
- •Поле Content-Location
- •Отрывок содержимого
- •Тип содержимого
- •Поле eTag
- •Поле Expires
- •Поле From
- •Поле Host
- •Поле If-Modified-Since
- •Поле If-Match
- •Поле If-None-Match
- •Заголовок If-Range
- •Поле If-Unmodified-Since
- •Поле Last-Modified
- •Поле Location
- •Поле Max-Forwards
- •Поле Pragma
- •Поле Proxy-Authenticate
- •Поле Proxy-Authorization
- •Поле Public
- •Фрагмент. Фрагменты байт
- •Запросы получения фрагментов
- •Поле Referer
- •Поле Retry-After
- •Поле Server
- •Поле Transfer-Encoding (Транспортное кодирование)
- •Заголовок Upgrade (Актуализация)
- •Поле User-Agent (Агент пользователя)
- •Поле Vary
- •Поле Via
- •Поле Warning (Предупреждение)
- •Поле www-Authenticate
- •Соображения безопасности
- •Аутентификация клиентов
- •Предложение выбора схемы идентификации
- •Злоупотребление служебными (Log) записями сервера
- •Передача конфиденциальной информации
- •Атаки, основанные на именах файлов и проходах
- •Персональная информация
- •Аспекты конфиденциальности, связанные с заголовками Accept
- •Фальсификация dns
- •Заголовки Location и мистификация
- •Приложения
- •1. Интернетовский тип среды message/http
- •2. Тип среды Интернет multipart/byteranges
- •3. Толерантные приложения
- •4. Различие между объектами http и mime
- •Преобразование к канонической форме
- •Введение кодирования содержимого
- •Поля заголовка в многофрагментных телах
- •Введение транспортного кодирования
- •Дополнительные методы запросов Метод patch
- •Метод link
- •Определения дополнительных полей заголовка Поле Alternates
- •Поле Content-Version
- •Поле Derived-From
- •Поле Link
- •Практическое занятие 8. Функционирование веб-приложений. Как работают веб-приложения
- •Краткие итоги
- •Протокол http/https
- •Краткие итоги
- •Что такое веб-сервер?
- •Краткие итоги
- •Контрольные вопросы
Краткие итоги
Все веб-приложения работают на основе протокола HTTP. Протокол HTTP передает текстовую информацию и работает в режиме "запрос-ответ". HTTP-запрос и HTTP-ответ имеют строго определенную структуру – привественная строка, заголовки и тело сообщения. Количество HTTP-заголовков переменное. HTTP-заголовки от тела сообщения отделяет пустая строка. Каждый HTTP-запрос отправляется на сервер в рамках HTTP-метода. HTTP-метод определяет семантику запроса (получить ресурс, добавить, изменить, удалить и т.д.). В HTTP-ответе кроме служебной информации и полезных данных, отправляется статус запроса, который информирует клиента об успешности выполнения запроса. Все статусные коды делятся на группы. Поскольку данные, передаваемые по протоколу HTTP можно перехватить, то он не обеспечивает конфиденциальности передаваемой информации. Если подобный уровень безопасности необходим, то нужно использовать протокол HTTPS, который обеспечивает шифрование передаваемой информации на основе комбинирования симметричного и ассиметричного алгоритмов шифрования.
Что такое веб-сервер?
Цель лекции: дать определение понятию "веб-сервер" и сформировать представление о работе этого механизма.
В предыдущей лекции мы разобрались с функционированием протокола HTTP. Теперь давайте рассмотрим, как работают инструменты, которые делают возможным описанные ранее взаимодействия. В основе функционирования веб-приложений лежит такое понятие как веб-сервер. Веб-сервер – это программа, которая принимает входящие HTTP-запросы, обрабатывает эти запросы, генерирует HTTP-ответ и отправляет его клиенту. Общий алгоритм работы веб-сервера можно представить следующим образом (зеленым цветом помечены действия, которые обрабатываются веб-сервером).
После того, как пользователь обратился к определенному ресурсу по протоколу HTTP, клиент (обычно браузер) формирует HTTP-запрос к веб-серверу. Обычно указывается символическое имя сервера (например, "http://www.microsoft.com") – в этом случае браузер предварительно преобразует это имя в IP-адрес при помощи сервисов DNS. После этого по протоколу HTTP на веб-сервер отправляется сформированное HTTP-сообщение. В этом сообщении браузер указывает какой ресурс необходимо загрузить и всю дополнительную информацию. Задача веб-сервера – прослушивать определенный TCP-порт (обычно порт 80) и принимать все входящие HTTP-сообщения. Если входящие данные не соответствуют формату сообщения HTTP, то такой запрос игнорируется, а клиенту возвращается сообщение об ошибке.
В простейшем случае при поступлении HTTP-запроса веб-сервер должен считать содержимое запрашиваемого файла с жесткого диска, упаковать его содержимое в HTTP-ответ и отправить клиенту. В случае если требуемый файл не найден на жестком диске, то веб-сервер сгенерирует ошибку с указанием статусного кода 404 и отправит это сообщение клиенту. Такой вариант работы веб-сервера принято называть статическими сайтами. В этом случае на стороне сервера не запускается никакой программный код, кроме программного кода самого веб-сервера. Однако подобные сценарии работы все чаще оказываются непригодными, а им на смену приходят полноценные веб-приложения. Отличие таких приложений состоит в том, что HTML-документы и другие ресурсы не хранятся на сервере в виде неизменяемых данных. Вместо этого, на сервере хранится программный код, который способен сгенерировать эти данные в момент обработки запроса. Разумеется, некоторые ресурсы (такие как файлы каскадных стилей, изображения и т.д.) могут храниться как статическое содержимое, но основные страницы HTML генерируют в процессе обработки. В таком случае веб-сервер при обработке запроса HTTP должен обращаться к программному коду, который должен сгенерировать содержимое. С учетом вышесказанного алгоритм работы веб-сервера будет выглядеть следующим образом.
Одной из наиболее важных задач, которые решаются при построении веб-сервера является задача обеспечения масштабируемости (т.е. возможности увеличения количества обслуживаемых пользователей) и защищенности от внешних атак. Поскольку веб-сервер работает в открытой среде – глобальной сети Интернет – то зачастую доступ к нему может осуществляться откуда угодно. Это делает веб-сервер подверженным большим нагрузкам и потенциальным атакам. Наиболее распространенными атаками на веб-сервер является обращение к веб-серверу с большим количеством запросов и их высокой частотой. В этом случае веб-сервер не сможет быстро обрабатывать все запросы, а это может сказаться на производительности веб-сервера для настоящих пользователей. Особенно остро подобным атакам подвержены веб-сервера, на которых исполняется какой-то внешний программный код за исключением программного кода самого веб-сервера. Обычно для борьбы с подобными атаками блокируются все запросы, которые приходят с определенного IP-адреса. Кроме того, в подобных случаях следует позаботится об оптимизации программного кода приложения, например, использовать кэширование – в этом случае при обработке каждого запроса нагрузка на центральный процессор будет меньше, что может существенно усложнить задачу атакующим.
Нередко на одном и том же веб-сервере располагается множество независимых веб-сайтов. Более того, все эти веб-сайты используют один и тот же IP-адрес. Т.е. веб-сервер, имеющий только один IP-адрес может размещать внутри себя несколько веб-сайтов и при этом каждый такой веб-сайт будет ассоциирован с собственным адресом (например, на одном веб-сервере могут располагаться веб-сайты: "microsoft.com", "gotdotnet.ru", "techdays.ru" и т.д.). Каким образом это становится возможным? Такое явление называется виртуальным хостингом. Для того чтобы понять как это работает, давайте еще раз обратимся к процессу взаимодействия клиента и сервера. Браузер отправляет HTTP-запрос на IP-адрес веб-сервера, который ассоциирован с доменным именем. Разрешение IP-адреса происходит с помощью служб DNS. Однако, несмотря на то, что запрос отправляется, используя полученный IP-адрес, клиент указывает дополнительный HTTP-заголовок "Host", в котором определяется оригинальное имя веб-сайта. Благодаря этой информации веб-сервер может разграничить доступ к нескольким веб-сайтам и при этом использовать один и тот же IP-адрес. Это очень важный момент, поскольку если бы для каждого доменного имени приходилось бы регистрировать отдельный IP-адрес, то адресное пространство протокола IP (v.4) очень быстро бы закончилось, а стоимость размещения веб-сайта в глобальной сети Интернет была бы намного выше. Для того, чтобы было более понятно давайте рассмотрим работу виртуального хостинга на примере. Предположим, имеется веб-сервер с IP-адресом 85.51.210.22. На этом сервере размещено несколько веб-сайтов: mysite1.com, mysite2.com, mysite3.com. Сервера DNS настроены таким образом, что каждое из этих доменных имен указывает на единственный IP-адрес85.51.219.22. Давайте посмотрим, какие HTTP-запросы браузер будет генерировать при обращении к каждому из сайтов. При обращении к сайту "mysite1.com" HTTP-запрос может выглядеть следующим образом.
При обращении к сайту "mysite2.com" HTTP-запрос будет выглядеть иначе.
При анализе HTTP-запросов хорошо видно, что HTTP-заголовок "Host" отличается в каждом из запросов. Таким образом, становится понятно, что веб-сервер анализирует этот заголовок и отправляет клиенту содержимое соответствующего сайта. Схематически этот процесс можно представить следующим образом.
Подобную схему виртуального хостинга использует большинство компаний, занимающихся размещением веб-сайтов в Интернет. Поскольку в этом случае на одном физическом сервере могут размещаться большое количество совершенно различных сайтов, то этот способ один из самых дешевых. Однако, в рамках виртуального хостинга обычно запрещено запускать различные службы и сервисы, а также существует ограничение по степени использования центрального процессора. Это означает, что в случае, когда веб-сайт потребляет слишком много серверных ресурсов, то владельцу сайта предлагается либо перейти на более дорогой тариф (с большим количеством выделенных ресурсов), либо при превышении допустимого порогового значения веб-сайт блокируется на некоторое время. Поскольку иногда от сервера требуется большое количество ресурсов или в рамках этого сервера необходимо запускать дополнительные приложения или службы, виртуальный хостинг можно использовать не всегда. В этом случае обычно арендуют выделенный сервер – физический или виртуальный. Однако, это более дорогой вид размещения веб-приложений в сети Интернет, поэтому зачастую используется именно виртуальный хостинг.
Как уже говорилось ранее, самый простой сценарий работы веб-сервера заключается в получении HTTP-запроса, его обработки, считывания нужного файла с жесткого диска, формирование HTTP-ответа и отправки его клиенту. Подобный сценарий является самым простым, однако, в реальности встречается все реже. Дело в том, что при подобном подходе, содержимое, которое передается клиенту, является статическим (т.е. не изменяется от запроса к запросу). Однако если требуется построить веб-приложение, то содержимое HTML-страницы, которое передается клиенту должно изменяться от различных внешних условий (параметров запроса, содержимого базы данных, времени обработки запроса, типа пользователя и т.д.). В этом случае требуется запускать внешний (по отношению к веб-серверу) программный код, реализующий логику веб-приложения. Этот код должен содержаться отдельно от программного кода самого веб-сервера, поскольку код приложения будет различным от одного приложения к другому, а веб-сервер будет один и тот же. Таким образом, программный код, обрабатывающий HTTP-запросы и генерирующий HTTP-ответы можно условно разделить на две части:
программный код, реализующий служебные функции по взаимодействию через протокол HTTP (программный код самого веб-сервера);
программный код, реализующий логику конкретного веб-приложения (бизнес-логика, обращение к СУБД и т.д.).
Поскольку программный код веб-приложения обычно упаковывается в отдельные модули и поставляется независимо, то требуются механизмы взаимодействия этих двух частей, т.е. интерфейс взаимодействия. В данном случае под интерфейсом взаимодействия понимается набор правил, по которым веб-сервер и приложение будут взаимодействовать друг с другом. Фактически, схема обработки запроса может выглядеть следующим образом.
Исторически сложилось так, что существует два главных типов интерфейс взаимодействия внешнего приложения и веб-сервера - CGI и ISAPI.
CGI (Common Gateway Interface) – наиболее ранний способ взаимодействия веб-сервера и веб-приложения. Основная идея, которая лежит в основе CGI заключается в том, что при поступлении очередного HTTP-запроса, веб-сервер инициирует создание нового процесса и передает ему все необходимые данные HTTP-запроса. После того, как этот процесс отработает, он завершается, передав при этом результат обратно веб-серверу. Поскольку веб-сервер и приложение – это разные процессы с точки зрения операционной системы, то для обмена информации между ними используются средства межпроцессного взаимодействия (IPC) – зачастую это переменные окружения, именованные каналы и т.д. Основным преимуществом CGI является то, что процесс веб-сервера и приложения изолированы друг от друга и в случае неполадок в веб-приложении, завершится с ошибкой именно процесс приложения, при этом процесс самого веб-сервера будет продолжать функционировать.
С другой стороны, необходимость создания каждый раз нового процесса влечет за собой дополнительные накладные расходы на создание процесса (создание процесса – дорогостоящая операция с точки зрения операционной системы) и передачи данных через границы процессов. Этот факт является серьезным недостатком и оказывает существенное влияние на масштабируемость веб-приложения (возможность обрабатывать большее количество поступающих запросов).
ISAPI (Internet Server API) – альтернативный способ взаимодействия веб-сервера и веб-приложения. В отличии от CGI, при взаимодействии в рамках интерфейса ISAPI, при поступлении очередного запроса, веб-сервер инициирует создание нового потока в рамках основного процесса, в котором работает веб-сервер. Поскольку с точки зрения операционной системы создание потока – это менее дорогостоящая операция, чем создание процесса, то такие приложения на практике оказываются более масштабируемыми. Кроме того, упрощается взаимодействие веб-сервера и веб-приложения, поскольку в этом случае используется единое адресное пространство в рамках операционной системы (поскольку весь код работает в одном и том же процессе). Однако, в случае серьезных неполадок в веб-приложении, которое взаимодействует с веб-сервером в рамках ISAPI, веб-сервер также потенциально подвергается риску быть завершенным. Поскольку веб-сервер и веб-приложение работают в одном и том же процессе, это действительно так. Поэтому разработчикам программного кода веб-сервера, поддерживающего ISAPI следует уделить этому вопросу особое внимание.
На сегодняшний день наиболее распространенным способом взаимодействия веб-сервера и веб-приложения является интерфейс ISAPI, поскольку обеспечивает наиболее оптимальные показатели по накладным расходам и масштабируемости. Однако, при работе нескольких веб-приложений на одном и том же веб-сервере, в этом случае существует потенциальная опасность влияния одного приложения на другое. Если говорить о компаниях, размещающих веб-приложения на своих серверах, то может случиться такая ситуация, что на одном и том же веб-сервере одновременно размещаются веб-сайты компаний-конкурентов. В этом случае теоретически одна из компаний может намеренно загрузить код, который будет завершать работу веб-сервера с ошибкой и, таким образом, все веб-сайты размещенные на этом веб-сервере окажутся недоступными. Для того, чтобы избежать подобной ситуации используется совмещенный подход – для каждого приложения может создаваться пул приложения (application pool), который представляет из себя отдельный процесс, в котором функционируют потоки для обработки входящих HTTP-запросов от пользователей. В этом случае, если какое-то из приложений будет содержать код, который завершает работу процесса с ошибкой, то будет завершаться процесс только этого приложения. Более того, каждый пул приложения содержит набор заранее созданных и подготовленных потоков. Это необходимо для того, чтобы не тратить время на создание потока в момент поступления входящего запроса. Такой набор заранее созданных потоков называется пулом потоков. Как правило, веб-сервер следит за каждым пулом приложения и если оно завершает свою работу с ошибкой, то веб-сервер перезапускает его процесс.
Кроме приведенных функций и механизмов веб-сервера, в его функции зачастую входят и сопутствующие дополнительные задачи. К этим задачам относится аутентфикация и авторизация пользователя, ведение серверного лога (для отладки работы веб-сервера), поддержка нескольких веб-сайтов на одном сервере (виртуальный хостинг), поддержка безопасных подключений по протоколу HTTPS и др. Эти функции в каждом конкретном случае зависят от реализации веб-сервера.
На сегодняшний день существует большое количество различных реализаций веб-серверов. Одним из наиболее популярных и универсальных веб-серверов является веб-сервер с открытым исходным кодом Apache. Он был создан для работе в среде Linux, также существует реализация для работы в рамках Windows. На его основе были построены другие различные вариации, например, Apache Tomcat для запуска веб-приложений на основе Java. Другим, наиболее серьезным продуктом в этой области является веб-сервер Microsoft Internet Information Services (IIS), который работает в рамках операционной системы Windows. Как правило, в рамках этого веб-сервера работают приложения на базе ASP.NET (и родственных технологий), а также приложения PHP и статические веб-сайты. При создании веб-приложений на базе ASP.NET мы будем использовать именно IIS 7. Наконец, существуют другие, менее масштабные проекты по разработке веб-серверов, например Nginx. Этот проект был разработан одним из разработчиков Rambler с целью оптимизации производительности этой поисковой системы. Впоследствии проект оказался настолько удачным, что нашел применение и для работы в других приложений. Обычно Nginx используют когда необходимо построить высоконагруженную инфраструктуру.
