Веб-сервер — это специальная программа, которая принимает запросы пользователей, обрабатывает их и отправляет ответ обратно по протоколу прикладного уровня HTTP.
Для современных приложений часто применяют клиент-серверную архитектуру. В такой архитектуре один сервер обслуживает много клиентов. Сервером выступает сетевой сервис (подробнее об этом в статье о настройке сети). Клиентом — программа пользователя, например, браузер.
Веб-приложения — это набор текстовых файлов, которые пересылаются пользователю специальной программой — веб-сервером. Понятие веб-сервер появилось в 1991 году с появлением первой такой программы.
Веб-сервер работает по следующей схеме:

Сервер получает запросы от клиентов и отправляет им ответы. В основе работы веб-сервера лежит протокол HTTP.
- Протокол HTTP
- Стартовая строка
- Тело сообщения
- Модули и расширения
- Сжатие данных
- Шифрование данных
- Проксирование
- Аутентификация и авторизация
- Советует
- Если надо больше
- Что такое веб-сервер
- Для чего нужен веб-сервер?
- Принципы работы веб-сервера
- Основные типы веб-серверов
- Рейтинг веб-серверов
- Как настроить веб-сервер
- Подбираем оборудование
- Что делает веб-сервер
- Что нужно для веб-сервера
- Самые распространенные сервера
- Apache
- NGNIX
- IIS
- Установочные пакеты
- Что такое веб-сервер?
- Краткие итоги
Протокол HTTP
Протокол HTTP (HyperText Transfer Protocol — протокол передачи гипертекста) работает с текстовыми сообщениями, которые пересылаются от клиента к серверу (HTTP-запрос) и обратно (HTTP-ответ). Структура сообщения следующая:
- Стартовая строка (Starting line) говорит нам, запрос или ответ содержит сообщение;
- Заголовки (Headers) описывают тело сообщения, параметры передачи и прочие сведения;
- Тело сообщения (Message Body) содержит данные.
Стартовая строка
В стартовой строке запроса указывается метод, ссылка и версия протокола, разделённые пробелом, например:
GET /tools/web-server HTTP/2.0
- Метод запроса;
- Путь на сайте (тот, что указывается после доменного имени);
- Протокол, который используется.
Методы HTTP-запроса устанавливают назначение запроса. Среди наиболее используемых GET, POST и OPTIONS. Когда вы набираете адрес в адресной строке браузера и переходите по ссылке, обычно вы пользуетесь методом GET, то есть методом для получения запрашиваемой информации. POST часто используется для отправки данных из форм, а OPTIONS — для определения набора методов на сервере, доступных по адресу.
Адрес, который вы вводите в адресной строке браузера, в протоколе HTTP определяется как URI (Uniform Resource Identifier), то есть последовательность символов, идентифицирующая абстрактный или физический ресурс.
Версия протокола обязательно указывается в запросе, поскольку от неё зависит способ передачи данных и набор доступных методов.
Стартовая строка HTTP-ответа содержит:
- информацию о версии протокола, как в запросе;
- код состояния (Status Code), который однозначно определяет реакцию сервера на запрос;
- пояснение (Reason Phrase) к коду ответа для пользователя (является необязательным).
Во время отладки веб-приложений вы часто будете встречать коды ответов 200, 404 и 500. Коды ответов, которые начинаются на 2xx, сервер возвращает, если запрос клиента был удачным. Запросы 4xx сообщают клиенту об ошибке, а 5xx — о том, что веб-сервер не справился с запросом клиента.
В заголовках содержится информация о домене, о сжатии, шифровании и формате данных, кодировке и прочая важная информация, которая используется для запроса или ответа. Каждый заголовок в HTTP-сообщении представляется отдельной строкой с параметром и значением, разделёнными двоеточием.
Пример заголовков запроса:
Accept-Encoding: gzip, deflate, br
gzip, deflate, br
Пример заголовков ответа:
Тело сообщения
В теле сообщения содержатся данные, которые требуется передать. Тело всегда отделяется от заголовков хотя бы одной пустой строкой. В теле, например, может передаваться HTML-документ или JSON с данными. Пример:
Модули и расширения
Первые веб-серверы могли передавать только текстовую информацию. Современные веб-серверы работают с файлами различных форматов, позволяют предварительно сжимать и шифровать передаваемые данные, исполнять код на различных языках и привязывать его к контексту запросов и ответов. Вся эта богатая функциональность реализуется с помощью модулей и плагинов.
Сжатие данных
Загрузка страниц будет происходить быстрее, если размер ответа сервера будет маленьким. Поэтому любой современный сервер содержит модуль сжатия. Перед отправкой клиенту данные запаковываются, а на стороне клиента распаковываются с помощью одного из алгоритмов сжатия. Долгое время для этого использовался формат сжатия gzip, и все популярные браузеры его поддерживают.
В последние годы браузеры стали поддерживать ещё два формата: zopfli и brotli. Наиболее перспективным и эффективным является brotli, он поддерживается всеми современными браузерами.
С помощью сжатия можно оптимизировать загрузку страниц для текстовой части данных: HTML, CSS и JavaScript. Остальные ресурсы, как правило, уже подготовлены для загрузки в браузере. Например, для картинок должны быть найдены оптимальное соотношение визуального качества и степени сжатия, подходящие размеры и плотность пикселей.
Шифрование данных
При передаче данных пользователей важно их шифровать. Интернет построен так, что пакеты данных пользователей проходят множество сетевых узлов, прежде чем окажутся на целевом устройстве. Если данные не зашифрованы, то каждый из промежуточных узлов может просматривать их в открытом виде. Подробнее о безопасности использования Интернета написано в статье «Безопасность веб-приложений и распространённые атаки».
Современные веб-серверы поддерживают несколько способов шифрования данных. Самым распространённым является использование сертификатов. Вы наверняка видели замочек слева от адреса сайта в браузере, который является индикатором того, что сайт безопасен. Специальная организация выдаёт сайту сертификат, на котором ставит свою электронную цифровую подпись. Браузер может запросить, действует ли эта подпись на данный момент, кем и кому она выдана. Сертификат позволяет понять, можно ли доверять данному сайту или нет.
После проверки сертификата браузер (клиент) и веб-сервер «договариваются» о ключах шифрования (открытом и закрытом). С помощью открытого ключа можно зашифровать данные пользователя на стороне клиента перед отправкой на сервер. Веб-сервер содержит закрытый ключ, с помощью которого эти данные можно расшифровать. Поддерживается схема шифрования с открытым ключом. Точно такая же схема используется и для шифрования на веб-сервере перед отправкой данных клиенту. Просто используется другая пара открытого и закрытого ключа.
Подключение сертификата настраивается на стороне веб-сервера, поскольку владелец сайта должен позаботиться о своих пользователях.
Проксирование
Современные веб-серверы способны не только отправлять файлы по запросу пользователя, но и перенаправлять запросы клиентов другой программе. Например, можно передать данные другому веб-серверу, который будет специализироваться на определённом типе файлов, или программе-интерпретатору, которая будет исполнять код, получать нужные данные, отдавать их веб-серверу с целью передать их, в конечном счёте, клиенту. Само перенаправление запросов и ответов называется проксированием.
В статье «Виды веб-приложений» рассказывается о статических и динамических сайтах. Один из способов реализации динамического сайта — отдельная программа, которой веб-сервер передаёт HTTP-запрос. Программа обрабатывает запрос и формирует ответ, который отдаётся веб-серверу. Веб-сервер сформированный ответ передаёт клиенту.
Веб-сервер не только отдаёт данные. Например, можно получить доступ к кукам браузера пользователя со стороны веб-сервера. Это позволяет сохранять промежуточные данные, которые могут помочь улучшению пользовательского опыта. Существуют и проблемы такой модели, которые связаны с приватностью пользователей в Интернете и их безопасностью.
Аутентификация и авторизация
С помощью заголовков в HTTP-сообщениях можно осуществлять аутентификацию и авторизацию пользователей. В современных системах всё чаще применяют более сложные способы аутентификации и авторизации, а этот способ называют базовым (basic auth).
Для аутентификации пользователей нужно отдать веб-серверу учётные данные пользователя, то есть представиться и предъявить пару имени пользователя и пароля в качестве доказательства, что это тот самый пользователь.
Веб-сервер может самостоятельно обработать запрос или передать их приложению, в котором реализуется процедура аутентификации. В случае успешной аутентификации приложение посылает клиенту ответ с уникальным ключом через веб-сервер (токеном), который определяет сессию пользователя. То есть в этот момент происходит процедура авторизации. С этого момента и до окончании сессии (до выхода из аккаунта) во все запросы клиента встраивается специальный заголовок. Ключ обозначает наличие у пользователя определённых прав. Согласно этим правам пользователю и предоставляются данные, предназначенные только ему.
Вы наверняка видели на сайтах аутентификацию через социальные сети или сторонний сервис. Аутентификация при этом происходит не на сервере, а на стороннем ресурсе. В результате аутентификации формируется токен, который передаётся серверу. После подтверждения личности, пользователю предоставляются определённые права (процедура авторизации), назначается специальный токен сессии, который также передаётся в заголовках вместе с запросами от клиента.
Пример заголовка для авторизации клиента на сервере:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
При использовании кук на клиенте создаётся отдельная запись, в которой указывается уникальный токен сессии. Веб-сервер имеет доступ к этому токену, что позволяет всегда проверить факт авторизации.
Есть и другие способы аутентификации и авторизации, которые поддерживаются веб-сервером.
Веб-сервер проводит мониторинг и кэширует ответы клиентам. Это происходит автоматически. Если запросы совпадают, то веб-сервер формирует обновляемый кэш, из которого он сразу отдаёт ответ клиенту, не выполняя обработку запроса. Время обновления актуальности ответа и стратегия кэширования устанавливается в настройках веб-сервера.
Веб-серверы могут обеспечить кэширование и на стороне клиента, чтобы снизить нагрузку на сеть. Для работы с кэшированием используются специальные заголовки. Например, сервер может передать заголовок клиенту:
Cache-Control: public, max-age=31536000
Такой заголовок сообщит клиенту, что запрошенные данные можно не обновлять целый год (в параметре max-age указывается количество секунд). Для статического контента, который редко обновляется или не обновляется вовсе, такой подход позволяет сэкономить массу трафика в сети.
Советует
Самый простой способ запустить веб-сервер, если уже уставлена платформа Node.js, использовать http-server. Достаточно установить этот веб-сервер глобально:
npm install —global http-server
http-server
Теперь, нужно зайти в любую директорию, в которой находится собранный сайт или отдельный HTML-файл, и запустить веб-сервер командой:
В браузере вы можете видеть свой сайт по адресу http://localhost:8080 или http://127.0.0.1:8080. Это специальный адрес локального сервера на вашем компьютере.
Available on:
http://127.0.0.1:8080
http://192.168.1.56:8080
Первый адрес доступен только для компьютера с сервером, второй — для всех устройств сети.
Если надо больше
browser-sync удобно использовать и при разработке, и при тестировании проектов, потому что это избавляет разработчиков от необходимости повторять рутинные действия вручную на нескольких экранах или устройствах. При взаимодействии пользователя с сайтом на одном из устройств все действия будут немедленно воспроизводиться и на других устройствах. Например, если вы прокрутили страницу на смартфоне, она прокрутится и на других устройствах в сети. То же случится, если вы перейдёте на другую страницу сайта или будете взаимодействовать с формами.
browser-sync устанавливается глобально командой:
npm install —global browser-sync
browser-sync
После установки необходимо перейти в директории, где находится сайт, и выполнить команду:
browser-sync start —server
browser-sync start
Но эти веб-серверы используются для локальной разработки. Сайты и сервисы используют веб-серверы, которые способны выдерживать большие нагрузки (большое количество запросов, сессий соединения, потоков данных и так далее) и модули для обработки различных запросов. О наиболее известных написаны статьи на сайте:
Файлы, которые требуются для работы сайтов требуется как-то хранить. Доступ и функциональность сетевых приложений обеспечивается серверами приложений и веб-серверами.
- Что такое веб-сервер
- Для чего нужен веб-сервер?
- Принципы работы веб-сервера
- Основные типы веб-серверов
- Рейтинг веб-серверов
- Как настроить веб-сервер
- Подбираем оборудование
Что такое веб-сервер
Понятие веб-сервер описывает как программы, отвечающие за работу веб-приложения или сайта, так и аппаратуру, которая требуется для хранения данных.
- Оборудование – физические память, процессор и прочие составляющие компьютера. Все в совокупности также именуют хостом. Организовать сервер можно дома, в компании или арендовать.
- Программы – отреагировать на пришедшее сообщение способны специальные приложения. Задача ПО на сервере принимать, отправлять, а при необходимости перенаправлять запросы. От серверных приложений требуется максимальная производительность, чтобы все клиенты получили доступ к сайту без задержек.
Веб-сервер работает с HTTP запросами. Такой формат подходит для передачи страниц.
Для чего нужен веб-сервер?
Для работы веб сайта нужна основа. Ее задача хранить и отдавать файлы по запросу. Сервер использует для работы протокол HTTP. В конце 20 века было достаточно хранить любую страницу в виде неизменного документа. Но по мере разрастания сети такой подход стал неудобен.
Чтобы добавить или обновить ссылку, пришлось бы переписывать файл. С развитием технологий статичные веб страницы перестали соответствовать потребностям компаний. Им на замену пришли сервера приложений.
Чтобы ссылки и другая информация могли обновляться автоматически на всех страницах, сервер дополняют специальными программами. Веб приложения позволяют собирать документ из нескольких частей. Распространенными языками для создания веб-приложений являются PHP, Perl и другие.
Таким образом можно выделить два типа веб-серверов:
- Статический – отправляет заготовленный документ. Такой формат удобен, когда не требуется вносить изменения в контент, размещенный на странице.
- Динамический применяют многие сайты, так или иначе формируя итог, что позволяет изменять заголовки или ссылки на страницах.
Принципы работы веб-сервера
Чтобы получить файлы для отрисовки страницы, браузер посылает HTTP запрос. На стороне сервера работает программа, которая в ответ на пришедшее сообщение формирует документ. Он выглядит следующим образом:
- По первой строке можно определить тип сообщения. Здесь содержится тип сообщения, например GET для запроса. В качестве ответа будет указан код, например 200, если все прошло успешно.
- Далее идут заголовки. Здесь может содержаться информация о формате сжатия, языке, длине содержимого и прочем. По типу также можно выделить сквозные, которые передаются неизменными даже через прокси, и хоп-хоп. Последние могут быть изменены в промежуточной точке, поскольку содержат информацию, относящуюся к транспортному уровню соединения.
- Завершает сообщение текст формата html. Его браузер преобразует в веб-страницу, с которой уже будет взаимодействовать пользователь.
В дополнение к веб-серверу можно использовать другие опции. Приняв запрос программа способна отправить заранее заготовленный ответ или передать информацию другому приложению. Интерфейс CGI был разработан именно с этой целью.
Запущенный на хосте скрипт формирует страницу. Такие программы называют сервером приложений или веб-приложением. Обмен данными осуществляется через стандартные потоки ввода и вывода (stdin и stdout).
Плагины и приложения могут:
- Использовать архивы. Чтобы быстрей передавать данные файлы можно приводить в более компактный формат. Архивы подходят не только для хранения данных, но и для уменьшения трафика. В заголовке HTTP браузер сообщает серверу, какие форматы сжатия он поддерживает. Примером архивов являются: gzip, brotli и zopfli.
- Шифровать данные. В сети для защиты данных применяются специальные алгоритмы, которые требуют установить на хост сертификат. Таким способом соединение защищают от посторонних, в промежуточных узлах злоумышленники не смогут расшифровать или подменить данные. Ключей два – открытый, который доступен всем, и закрытый, расположенный в памяти хоста. Ключи выдаются проверенными организациями.
- Перенаправлять запросы и использовать кэш. Веб-сервер может взять на себя часть опций прокси-сервера.
- Использовать куки и авторизацию. Для работы веб-приложений удобно идентифицировать клиента и получать о нем какие-то сведения. Куки хранятся в браузере, могут быть переданы в HTTP запросе. Собственный аккаунт – необходимая часть приложения почты или онлайн магазина. Можно использовать базовую авторизацию или вызывать веб-приложение для более сложных действий. Для сервера приложений применяют собственную системы, более надежную, чем описана стандартом HTTP.
Помимо функций связанных с работой сайта непосредственно, сервер еще ведет журнал. В логах отображаются действия и ошибки, что позволяет в дальнейшем разбираться в проблемах. А для файлов можно задать ограничения. Так контент можно разделить на уровни доступа, что позволит работать коммерческим площадкам.
Основные типы веб-серверов
Администраторы используют различные системы и приложения для создания высокопроизводительных систем. Популярные программы:
- Apache – популярный веб-сервер с открытым кодом. Его можно установить на любую систему, есть поддержка сервлетов при помощи tomcat. Разрабатывается Apache c 1995 года, поддерживает множество модулей.
- Ngnix – веб-сервер с открытым кодом и упором на стабильность. Легкий и достаточно мощный сервер подойдет для разных задач: создание прокси, работа сайта или почты. Веб-сервер поддерживает разные операционные системы.
- Lighttpd – простой, надежный и быстрый сервер. В качестве лицензии выбрана BSD. У программы открытый код, с которым можно ознакомится. Данный веб-сервер должен выдерживать множество обращений, чтобы обеспечит максимальную производительность системы.
- IIS – веб-сервер от Microsoft, который поставляется с их системой. Плюсом является простота настройки и управления, минусом – закрытый код. Подходит вариант только для ОС Windows.
- LiteSpeed – проприетарный сервер, который подойдет для высоконагруженных сайтов.
- Sun Java System – проект от Sun Microsystems, который несмотря на закрытый код, можно использовать бесплатно.
- X5 – гибкий в настройке проект, который подойдет для создания файлового и веб-серверов.
Рейтинг веб-серверов
По популярности программы распределены следующим образом:
- Apache около 40% набирает этот веб-сервер. Он лидирует со значительным отрывом на протяжении уже нескольких лет.
- Nginx следом идет этот вариант. Его результат в мире от 23 до 27%, но в рунете в он обгоняет главного конкурента.
- LiteSpeed набирает 2 – 3%.
Остальные набирают меньше процента.
Как настроить веб-сервер
Попробовать запустить сервер несложно. Пользователь может использовать собственный компьютер для этого. Потребуется установить подходящие программы. Если используется один из популярных языков, например JavaScript, то в нем есть встроенный веб-сервер.
Стоит учесть, что такой вариант подойдет только для разработки, он не является оптимальным для постоянного использования.
Для работы в сети потребуется полее тщательно подходить к подбору программ. Администратор настраивает систему. Стандартный набор – LAMP состоит из Linux, Apache, MySQL и PHP. Но компоненты можно менять на другие, а также устанавливать дополнительные.
При создании масштабного проекта, рекомендуется распределить части по разным серверам. При этом следует связать все компоненты, чтобы они корректно взаимодействовали.
Подбираем оборудование
Для пробного запуска любителями подойдет почти любой компьютер, однако такой сервер не выдержит серьезную нагрузку. Для сетевых ресурсов подбирают быстрые и мощные устройства. Важны надежность всех компонент, время отклика накопителя и другие параметры.
Если требуется сервер приложений, то требований к оборудованию будет еще больше. Физический сервер может работать с одним или двумя процессорами, от 1 до 128 Гб оперативной памяти. Для размещения системы, программ, приложений и баз, как правило, используется несколько накопителей с большим запасом энергонезависимой памяти.
В первую очередь следует рассчитать нагрузку, продумать масштабирование проекта. После принимать решение об аренде виртуального или выделенного сервера. Также компания может приобрести один из вариантов:
- Dell R630 – два процессора и до 24 накопителей.
- HPE ProLiant DL360 Gen10 – до 10 накопителей, два процессора Intel Xeon, тип RAM – DDR4.
Положительная репутация в поисковых системах без помех от недоброжелателей возможна с Семантикой!

Получи нашу книгу «Контент-маркетинг в социальных сетях: Как засесть в голову подписчиков и влюбить их в свой бренд».

Веб-сервер – это сервер, который принимает запросы от пользователя и выдает им ответы — документ, страницу или сайт.
Больше видео на нашем канале — изучайте интернет-маркетинг с SEMANTICA

Любой компьютер можно сделать сервером. Для этого нужно установить специальную оболочку.
Требования к технической части определяются количеством размещенных ресурсов и требованиями к скорости. Чем они больше, тем мощнее должен быть компьютер.
Чтобы было понятно, приведем аналогию. Вы заходите в библиотеку и просите выдать вам книгу. Библиотекарь находит нужную и передает вам. Библиотека — это сервер, в ней хранятся все данные. Библиотекарь — это оболочка, которая приняла запрос и направила ответ. Вы — клиент.
Можно отправить библиотекаря за дополнительной информацией – аналогично щелчку по ссылке. Разница в том, что один и тот же ресурс в интернете могут одновременно читать неограниченное число пользователей.
Обслуживание клиента производится по схожему принципу: приходя за книгой, мы можем задать вопрос библиотекарю (поисковая система) или заглянуть в указатель (ЯндексКаталог). Это помогает найти нужную информацию.
Что делает веб-сервер
Его главная задача – хранение информации. Страницы, файлы, изображения, текстовый контент.
Задачи:
- Получать запросы.
- Запускать программы на специальных языках программирования (серверных).
- Формировать веб страницы.
- Отправлять их назад пользователю.
- Защищать информацию.
- Проводить идентификацию посетителей.
- Вести журнал обращений.
- Обслуживать запросы других типов: mailto, FTP и т.д.
Чтобы понять, как работает веб-сервер, надо иметь представление о принципах передачи информации в сети. В основе лежат правила, называемые протоколами: любой URL начинается с указания типа (ftp, http://, https:// и пр.).
Hyper Text Transfer Protocol – протокол передачи гипертекста. Страницы сайта всегда имеют вид гипертекстового документа. Это конечный результат работы любой серверной или клиентской программы.
- Когда пользователь вводит адрес или нажимает ссылку, браузер передает запрос, кодируя информацию по этим правилам.
- Хост, к которому привязан этот адрес, запускает программы сервера. Каждая из них выполняет свои функции.
- Полученные данные расшифровываются, команды выполняются.
- Формируется гипертекст, кодируется и отправляется обратно.
- Браузер получает ответ, преобразовывает код в html и показывает на экране страницу.
Что нужно для веб-сервера
Нужна машина, которая будет обрабатывать все запросы. Оцените нагрузку, которую должен выдерживать сервер. Это зависит от количества посетителей: чем больше запросов, тем требуется большая мощность.
Есть специальные компании, которые предоставляют услуги хостинга. Сервер вы арендуете. Вам дается квота для размещения файлов сайта.
Но если у вас простенький сайт, то можно обойтись своими силами.
Самые распространенные сервера
Далее мы рассмотрим популярные оболочки — системы управления серверами.
Apache
Это бесплатный, свободно распространяемый продукт, у которого есть масса преимуществ:
- Постоянная поддержка разработчиков.
- Модули для работы с серверными языками программирования PHP, Perl, Python, Ruby, ASP и т.д.
- Открытый код. Доработкой под свои нужды занимаются разные программисты. Например, русскоязычное сообщество адаптирует его к русской кодировке.
- Кроссплатформенность. Изначально был создан под Unix, но сейчас поддерживается Windows, Mac OS, BSD, Linux, OS/2 и Novell NetWare.
- Безопасность.
При инсталляции укажите имя вашего хоста, например, localhost. В папку htdocs, которая лежит внутри папки Apachex.x (где x.x – номер версии) скопируйте любую html-страницу. Или создайте ее в блокноте, введя любой текст и сохранив с расширением html.
NGNIX
Доля работающих на нем активных площадок составляет 21,13% (исследования Netcraft). Его в основном используют крупные компании и профессиональные разработчики: Yandex, Mail.ru, Rambler и пр. NGNIX выдерживает огромную нагрузку посетителей, надежен, безопасен и продуман.
Распространяется свободно, но появились платные версии Plus, стоимость от 2,500 $.
IIS
Его известность обеспечена громким именем разработчика. Представляет собой набор веб служб и интегрирован с Windows. Родной платформой программирования является ASP.NET, но можно внедрить и альтернативу, например, РНР.
Для полноценного хостинга требуется установка серверной операционной системы от Microsoft – Windows Server. 6-я версия вообще не была предназначена для хостинга, полноценная поддержка началась в 7-й. Приобретается он автоматически вместе с операционной системой и зависит от ее характеристик.
Установочные пакеты
Для начинающих программистов и разработчиков создаются инструменты, которые позволяют в несколько кликов развернуть веб-сервер у себя на компьютере.
Что такое веб-сервер?
Цель лекции: дать определение понятию «веб-сервер» и сформировать представление о работе этого механизма.
В предыдущей лекции мы разобрались с функционированием протокола HTTP. Теперь давайте рассмотрим, как работают инструменты, которые делают возможным описанные ранее взаимодействия. В основе функционирования веб-приложений лежит такое понятие как веб-сервер. Веб-сервер – это программа, которая принимает входящие HTTP-запросы, обрабатывает эти запросы, генерирует HTTP-ответ и отправляет его клиенту. Общий алгоритм работы веб-сервера можно представить следующим образом (зеленым цветом помечены действия, которые обрабатываются веб-сервером).

В простейшем случае при поступлении HTTP-запроса веб-сервер должен считать содержимое запрашиваемого файла с жесткого диска, упаковать его содержимое в HTTP-ответ и отправить клиенту. В случае если требуемый файл не найден на жестком диске, то веб-сервер сгенерирует ошибку с указанием статусного кода 404 и отправит это сообщение клиенту. Такой вариант работы веб-сервера принято называть статическими сайтами. В этом случае на стороне сервера не запускается никакой программный код, кроме программного кода самого веб-сервера. Однако подобные сценарии работы все чаще оказываются непригодными, а им на смену приходят полноценные веб-приложения. Отличие таких приложений состоит в том, что HTML-документы и другие ресурсы не хранятся на сервере в виде неизменяемых данных. Вместо этого, на сервере хранится программный код, который способен сгенерировать эти данные в момент обработки запроса.
Разумеется, некоторые ресурсы (такие как файлы каскадных стилей, изображения и т.д.) могут храниться как статическое содержимое, но основные страницы HTML генерируют в процессе обработки. В таком случае веб-сервер при обработке запроса HTTP должен обращаться к программному коду, который должен сгенерировать содержимое. С учетом вышесказанного алгоритм работы веб-сервера будет выглядеть следующим образом.


При обращении к сайту «mysite2.com» HTTP-запрос будет выглядеть иначе.

При анализе HTTP-запросов хорошо видно, что HTTP-заголовок «» отличается в каждом из запросов. Таким образом, становится понятно, что веб-сервер анализирует этот заголовок и отправляет клиенту содержимое соответствующего сайта. Схематически этот процесс можно представить следующим образом.

Подобную схему виртуального хостинга использует большинство компаний, занимающихся размещением веб-сайтов в Интернет. Поскольку в этом случае на одном физическом сервере могут размещаться большое количество совершенно различных сайтов, то этот способ один из самых дешевых. Однако, в рамках виртуального хостинга обычно запрещено запускать различные службы и сервисы, а также существует ограничение по степени использования центрального процессора. Это означает, что в случае, когда веб-сайт потребляет слишком много серверных ресурсов, то владельцу сайта предлагается либо перейти на более дорогой тариф (с большим количеством выделенных ресурсов), либо при превышении допустимого порогового значения веб-сайт блокируется на некоторое время. Поскольку иногда от сервера требуется большое количество ресурсов или в рамках этого сервера необходимо запускать дополнительные приложения или службы, виртуальный хостинг можно использовать не всегда.
В этом случае обычно арендуют выделенный сервер – физический или виртуальный. Однако, это более дорогой вид размещения веб-приложений в сети Интернет, поэтому зачастую используется именно виртуальный хостинг.
Как уже говорилось ранее, самый простой сценарий работы веб-сервера заключается в получении 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 используют когда необходимо построить высоконагруженную инфраструктуру.
Краткие итоги
Веб-сервер – это программа, которая обрабатывает входящие HTTP-запросы и генерирует HTTP-ответы. В простейшем случае веб-сервер передает клиенту содержимое файлов, которые размещены на жестком диске сервера. Когда необходимо генерировать HTTP-ответы на основе какой-то программной логики, подключается внешний программный код. Для подключения внешнего программного кода используются интерфейсы CGI и ISAPI. В настоящий момент наиболее перспективным считается использование интерфейса ISAPI в силу более высокой масштабируемости. В рамках веб-сервера создается пул приложения (для каждого веб-приложения отдельный процесс в рамках ОС, в составе которого работает несколько потоков для обработки запросов). Существует большое количество реализаций веб-серверов, для приложений ASP.NET обычно используется веб-сервер Microsoft Internet Information Services (IIS).

