Как работает web server. Как работает веб-сервер

Сервер - это некая программа, аппарат или программно-аппаратный комплекс, который реализует какие-то сервисы. В свою очередь сервис - это служба, выполняющая некие действия, запрашиваемые клиентом. Давайте рассмотрим внимательнее, как работает сервер.

Составляющие клиент-серверной схемы

Посмотрим, из чего состоит сам сервер и без каких внешних компонент он не может обходиться. Во-первых, сервер теряет свой смысл в отсутствие клиентов. Принцип работы сервера - реализовывать нужды клиентов. Клиент формирует требования к серверу и берет на себя некоторую долю его работы. Поэтому чаще говорят не просто о сервере, а о системе клиенты-сервер. Клиент составляет запросы к серверу, посредством которых изъявляет свою волю. Посему следующим, вторым компонентом системы будет тот формальный язык, на котором эти запросы составляются. Этих языков великое множество и выбор того или иного напрямую зависит от сервера. Запросы до сервера должны как-то доставляться. Третий элемент - канал связи клиента и сервера, по которому передаются данные. Это чаще всего либо локальная сеть, либо Интернет, либо локальные связи одной машины. Пришедший запрос сервер должен как-то принять и распознать. Принимающее устройство - так называемый внешний интерфейс, представляет собой несколько портов, которые сервер непрерывно (или не непрерывно) слушает. Принятые запросы отправляются в программную часть сервера, где и обрабатываются в соответствии с тем, как сервер запрограммирован. И в зависимости от принятого запроса, запускается тот или иной сервис с теми или иными начальными данными. Сервисы и будут последней составляющей системы. После окончания работы сервиса результат выполнения отсылается клиенту по тому же каналу связи. Или, если сервис интерактивный, то и в процессе его работы будет интенсивный обмен данными по каналу «клиент-сервер».

Для чего нужен сервер

Сейчас основное назначение клиент-серверных систем - переместить нагрузку с машин-клиентов на машину сервер. Именно поэтому вычислительная мощность обычного сервера на пару порядков выше, чем оная у обычного домашнего компьютера. Но иногда такая организация работы системы отдаёт всю нагрузку на клиенты, а сервер служит для организации их работы и взаимодействия. Или строго наоборот, сервер выполняет все вычисления, а клиенты служат лишь для выдачи информации пользователю. Как видно, способов использовать клиент-серверную модель масса.

Плюсы и минусы модели

Плюсы очевидны - сам принцип работы сервера обеспечивает удобство работы с системой, простоту управления ею, правильное распределение нагрузки на машины. А минусом является язык запросов и связанные с ним компоненты. Если пользователь случайно или умышленно отсылает на сервер неверно сформулированный запрос, то если такая ошибка не была предусмотрена программистом, система даст сбой. Сведущие люди составляют заведомо неверные запросы так, чтобы система, призванная выдавать клиенту прогноз погоды, вывела злоумышленнику, например, данные кредитных карт всех пользователей (если, конечно, за данные карт и за прогноз погоды отвечает один и тот же сервер). И счастливый злоумышленник сначала идёт и перечисляет себе все деньги всех пользователей сервиса, а затем долго и вдумчиво убегает от управления «К», расследующего это преступление.

Безопасность

Клиент-серверная модель организации работы системы - очень удобная в программировании, управлении и работе вещь. Но чтобы такой системой можно было пользоваться, каждая компонента работающей схемы должна быть защищена как от злоумышленников, так и от пользователей, не знающих, как работает сервер, но жмущих все кнопочки, до которых смогут дотянуться в произвольной последовательности. Чтобы в системе можно было хранить, передавать и обрабатывать важные данные, например, сведения о платёжных картах, система информационной безопасности сервера должна удовлетворять определённым законом требованиям.

Если Вы напечатаете в адресной строке вашего браузера http://www.сайт/how-web-server-work/ и нажмете клавишу Enter - эта страничка нашего Веб-сайта появится на экране.

На самом базовом уровне произошло следующее: Ваш браузер сформировал подключение к Веб-серверу, отправил запрос на получение Веб-страницы страницы и получил ее.

Теперь немного подробнее:

URL состоит из трех частей:

1. Протокола (http)

2. Имени сервера (www.сайт)

3. Адреса страницы (how-web-server-work)

Браузер обращается к серверу доменных имен, чтобы перевести имя сайта www.сайт в IP-адрес , который он использует, чтобы подключиться к серверной машине. Браузер затем образует соединение с Веб-сервером по указанному IP-адресу на порт 80 или любой другой, если так задумано (Мы обсудим порты позже в этой статье).

Следуя протоколу HTTP, браузер послал запрос на сервер, запрашивая файл http://www.сайт/how-web-server-work/

Обратите внимание, что файлы cookie также могут быть отправлены от браузера к серверу.

В ответ сервер сгенерировал динамическую Веб-страницу и послал обратно HTML текст для отображения этой страницы в Вашем браузере. Файлы cookie также могут быть отправлены от сервера к браузеру в заголовке страницы. Браузер читает HTML-теги и формирует вывод Веб-страницы на экране.

Интернет

Так что же такое «Интернет»? Интернет представляет собой сотни миллионов компьютеров, связанные вместе в компьютерную сеть . Сеть позволяет всем компьютерам взаимодействовать друг с другом. Домашний компьютер может быть связан с сетью Интернет при помощи самых разных способов и устройств – начиная с примитивного модема для телефонной линии, закачивая соединением по локальной сети (LAN ) с Интернет-провайдером (ISP ).

Крупные Интернет-провайдеры поддерживают волоконно-оптические линии для всей страны или региона. Магистральные сети проложены во всем мире, соединенные по волоконно-оптическим линиям, подводным кабелям или спутниковым каналам. Таким образом, каждый компьютер в сети Интернет подключен к любому другому компьютеру в сети Интернет.

Клиенты и Серверы

В общем, все компьютеры в Интернет, можно разделить на две категории: серверы и клиенты. Компьютеры, обеспечивающие сервисы (такие как Веб-серверы, серверы FTP, облачные сервисы) для других машин являются серверами . Машины, которые используются для подключения к этим услугам — клиенты . При подключении к Google , чтобы выполнить поисковый запрос или воспользоваться каким-либо его сервисом, Google предоставляет свой компьютер (возможно, целый кластер мощных компьютеров) для обслуживания Вашего запроса. Таким образом, Google предоставляет сервер. Ваша машина тоже может предоставлять услуги кому-то в Интернете. Таким образом, пользовательская машина, обычно, является клиентом, хотя может становиться и сервером, в случае необходимости.

Сервер может предоставить одну или несколько услуг в Интернете. Например, на компьютере-сервере может быть установлено программное обеспечение, позволяющее ему выступать в качестве Веб-сервера, e-mail сервера и FTP сервера. Компьютеры-клиенты, которые присоединяются к серверу, направляют свои запросы к специальному программному обеспечению, работающему на общем компьютере-сервере. Например, если вы используете Веб-браузер на вашем компьютере, он будет «общаться» с Веб-сервером на компьютере-сервере. Ваше e-mail приложение будет «говорить» с сервером электронной почты, и так далее.

IP-адреса

Чтобы соединить все эти машины в сеть, у каждого компьютера в Интернете есть уникальный адрес, называемый IP-адрес . Типичный IP-адрес выглядит так:

Четыре числа в IP-адресе называются октеты потому что они могут принимать значения между 0 и 255 или 2 8 вариантов значений.

Каждый компьютер в Интернет имеет свой уникальный IP-адрес. Сервер имеет статический IP-адрес, который меняется редко. Домашний компьютер часто имеет IP адрес, назначенный провайдером, когда машина соединяется с ним. Этот IP-адрес является уникальным для этой сессии, но может оказаться другим в следующий раз. Таким образом, ISP, нужен только один IP адрес для каждого маршрутизатора, которые он поддерживает, а не для каждого клиента.

Если вы работаете на Windows машине, вы можете просмотреть множество информации об Интернете на вашем компьютере, включая ваш текущий IP-адрес и имя хоста, с помощью команды ipconfig . На UNIX-машине, надо набрать nslookup в командной строке для отображения IP-адреса машины.

Доменные имена

Поскольку большинство людей имеют трудности с запоминанием последовательности цифр, которые составляют IP-адреса, и потому, что IP-адреса иногда нужно менять, все серверы и сайты в Интернете также имеют и удобочитаемые имена, называемые доменными именами . Например, www.. Это проще для большинства из нас — запомнить www.сайт чем запоминать 5.9.205.233

Имя www.сайт на самом деле состоит из трех частей:

1. Имя World Wide Web (www). На самом деле можно обходиться и без явного указания «www», хотя, формально, это будет другая сеть.

2. Доменное имя (qriosity)

3. В зоне домена верхнего уровня (ru)

Доменными именами управляют Регистраторы доменных имен . Регистраторы создают доменные имена верхнего уровня и гарантируют, что все имена в зоне верхнего уровня домена является уникальным. Регистратор также предоставляет контактную информацию для каждого доменного имени и запускает сервис whois , указывающий на владельца домена. Имя хоста создается владельцем домена.

Серверы доменных имен

Набор серверов, называемых серверы доменных имен (DNS) сопоставляет удобочитаемые имена в IP-адреса. Эти серверы содержат простые базы данных, содержащие имена и IP-адреса, и они распределены по всему Интернету. Большинство отдельных компаний, Интернет-провайдеров и крупных университетов поддерживают малые DNS. Существуют также центральные DNS, которые используют данные, поставляемые Регистраторами доменных имен.

При вводе URL-адреса http://www..сайт, передает его на сервер доменных имен, сервер возвращает правильный IP-адрес для www.сайт. Целый ряд серверов имен может быть вовлечен в то, чтобы получить правильный IP-адрес.

Итак, повторим прочитанное: Интернет состоит из миллионов машин, каждая с уникальным IP-адресом. Многие из этих машин – серверы. Это означает, что они предоставляют услуги другим компьютерам в Интернет. Многие из этих серверов являются серверами электронной почты, Веб-серверами, FTP-серверами, серверами облачных сервисов.

Порты

Любой сервер делает свои услуги доступными через Интернет с помощью пронумерованных портов , по одному для каждой службы, доступной на сервере. Например, есть компьютер-сервер, на котором запущен Веб-сервер и FTP-сервер. Веб-сервер, как правило, будет доступен на порту 80, а FTP-сервер будет доступен на порту 21. Клиенты подключаются к сервису на определенный IP адрес и на определенный порт.

Каждая из самых популярных услуг, доступна на заранее известном номере порта, но можно назначить и собственный номер порта любой услуге.

Если сервер принимает соединения на порту от внешнего мира, и если брандмауэр не защищает порты, вы можете подключиться к заранее обусловленному порту с любого компьютера в Интернет и воспользоваться услугой. Обратите внимание, что нет ничего, что заставляет Вас, к примеру, держать Веб-сервер на порту 80. Если вы установили свой сервер и загрузили программное обеспечение Веб-сервера на нем, вы могли бы поставить Веб-сервер на порту 999, или любом другом неиспользуемом порту. Затем, если, например, Ваша машина будет известна как xxx.yyy.com то к ней могут подключаться с URL http://xxx.yyy.com:999 - «:999» явно указывает номер порта, по которому можно добраться до вашего Веб-сервера. Если порт не указан, то браузер просто предполагает, что Веб-сервер доступен с помощью хорошо известного порта 80.

Протоколы

Как только клиент подключен к службе на данном порту, он обращается к сервису с помощью специального протокола . Протокол — это набор соглашений логического уровня, позволяющий программам обмениваться данными. Для совместной работы компьютеров в сети Интернет используется семейство протоколов TCP/IP . Веб-сервер использует протокол HTTP.

Дополнительно: Безопасность

Вы можете видеть из этого описания, что Веб-сервер это довольно простой фрагмент программного обеспечения. Он принимает имя файла, отправленного с помощью команды GET, получает файл и отправляет его в браузер. Даже если брать в расчет весь код для обработки портов, программа простейшего Веб-сервера состоит не более, чем из 500 строк кода. Полномасштабные Веб-серверы являются более сложными, но в своей основе тоже очень просты.

Большинство серверов устанавливают некоторый уровень безопасности к процессам обслуживания. Простейший вариант – запрос логина и пароля для получения доступа к серверу. Более продвинутые серверы добавляют дополнительную безопасность, путем установления зашифрованной связи между сервером и браузером, так что конфиденциальная информация (например, номера кредитных карт) может быть выслана по Интернету.

Это действительно все, что нужно Веб-серверу, который обслуживает стандартные, статические Веб-страницы . Статические страницы – это страницы, которые не изменяются, если вебмастер сам не отредактирует их.

Дополнительно: Динамические страницы

Что такое динамические Веб-страницы ? Например:

1. Любая гостевая книга позволяет ввести сообщение в HTML-форме, и выводит новые и старые записи автоматически.

2. Любой поисковик позволяет ввести ключевые слова в HTML-форме запроса, и тогда он динамически создает страницу, на основе поиска информации по этим ключевым словам.

Во всех этих случаях, Веб-сервер осуществляет не просто «поиск файла». Он обрабатывает информацию и генерирует страницы в зависимости от специфики запросов. Почти во всех случаях, Веб-сервер, использует так называемые скрипты программный код, написанный на PHP, Perl, Java и других языках программирования, чтобы совершить этот процесс.

Страницы нашего сайта — тоже являются динамическими, созданными при помощи PHP с использованием баз данных MySQL.

В этой статье мы узнаем, что из себя представляют веб-серверы, как они работают, и почему они так важны.

Введение

Понятие « веб-сервер» может относиться как к аппаратной начинке, так и к программному обеспечению. Или даже к обеим частям, работающим совместно.

  1. С точки зрения "железа", « веб-сервер» - это компьютер, который хранит файлы сайта (HTML-документы, CSS-стили, JavaScript-файлы, картинки и другие) и доставляет их на устройство конечного пользователя (веб-браузер и т.д.). Он подключен к сети Интернет и может быть доступен через доменное имя, подобное mozilla.org .
  2. С точки зрения ПО, веб-сервер включает в себя несколько компонентов, которые контролируют доступ веб-пользователей к размещенным на сервере файлам, как минимум - это HTTP-сервер . HTTP-сервер - это часть ПО, которая понимает (веб-адреса) и HTTP (протокол, который ваш браузер использует для просмотра веб-страниц).

На самом базовом уровне, когда браузеру нужен файл, размещенный на веб-сервере, браузер запрашивает его через HTTP-протокол. Когда запрос достигает нужного веб-сервера ("железо"), сервер HTTP (ПО) принимает запрос, находит запрашиваемый документ (если нет, то сообщает об ошибке ) и отправляет обратно, также через HTTP.

Статический веб-сервер , или стек, состоит из компьютера ("железо") с сервером HTTP (ПО). Мы называем это « статикой» , потому что сервер посылает размещенные файлы в браузер « как есть» .

Динамический веб-сервер состоит из статического веб-сервера и дополнительного программного обеспечения, чаще всего сервера приложения и базы данных . Мы называем его « динамическим» , потому что сервер приложений изменяет исходные файлы перед отправкой в ваш браузер по HTTP.

Например, для получения итоговой страницы, которую вы просматриваете в браузере, сервер приложений может заполнить HTML-шаблон данными из базы данных. Такие сайты, как MDN или Википедия, состоят из тысяч веб-страниц, но они не являются реальными HTML документами - лишь несколько HTML-шаблонов и гигантские базы данных. Эта структура упрощает и ускоряет сопровождение веб-приложений и доставку контента.

Активное изучение

Активное изучение пока не доступно. .

Погружаемся глубже

Чтобы загрузить веб-страницу, как мы уже говорили, ваш браузер отправляет запрос к веб-серверу, который приступает к поиску запрашиваемого файла в своем собственном пространстве памяти. Найдя файл, сервер считывает его, обрабатывает как ему это необходимо, и отсылает в браузер. Давайте рассмотрим эти шаги более подробно.

Хостинг файлов

Прежде всего, веб-сервер должен содержать файлы веб-сайта, а именно все HTML-документы и связанные с ними ресурсы, включая изображения, CSS-стили, JavaScript-файлы, шрифты и видео.

Технически, вы можете разместить все эти файлы на своем компьютере, но гораздо удобнее хранить их на выделенном веб-сервере, который:

  • всегда запущен и работает
  • всегда подключен к Интернету
  • имеет неизменный IP адрес (не все провайдеры предоставляют статический IP-адрес для домашнего подключения)
  • обслуживается третьей, сторонней компанией

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

Как только вы решили проблему с хостингом, вам понадобится только загрузить свои файлы на ваш веб-сервер .

Связь по HTTP

Во-вторых, веб-сервер обеспечивает поддержку HTTP (англ. H ypert ext T ransfer P rotocol - гипертекстовый транспортный протокол ). Как следует из названия, HTTP указывает, как передавать гипертекст (т.е. связанные веб-документы) между двумя компьютерами.

Протокол представляет собой набор правил для связи между двумя компьютерами. HTTP является текстовым протоколом без сохранения состояния.

Текстовый Все команды являются простым человекочитаемым текстом. Не сохраняет состояние Ни клиент, ни сервер не помнят о предыдущих соединениях. Например, опираясь только на HTTP, сервер не сможет вспомнить введенный вами пароль или на каком шаге транзакции вы находитесь. Для таких задач, вам потребуется сервер приложения. (Мы остановимся на этих технологиях в следующих статьях.)

HTTP задает строгие правила взаимодействия клиента и сервера. Мы рассмотрим сам протокол HTTP в технической статье немного позднее. Пока достаточно знать об этих правилах:

  • Исключительно клиенты могут производить HTTP-запросы, и только на сервера . Сервера способны только отвечать на HTTP-запросы клиента .
  • При запросе файла по HTTP, клиент должен сформировать файловый .
  • Веб-сервер должен ответить на каждый HTTP-запрос, по крайней мере сообщением об ошибке.

На веб-сервере HTTP-сервер отвечает за обработку входящих запросов и ответ на них.

  1. При получении запроса, HTTP-сервер сначала проверяет, существует ли ресурс по данному URL.
  2. Если это так, веб-сервер отправляет содержимое файла обратно в браузер. Если нет, сервер приложения генерирует необходимый ресурс.
  3. Если ничто из этого не возможно, веб-сервер возвращает сообщение об ошибке в браузер, чаще всего “404 Not Found”. (Это ошибка настолько распространена, что многие веб-дизайнеры тратят большое количество времени на разработку 404 страниц об ошибках .)

Статический и Динамический контент

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

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

Возьмем для примера страницу, которую вы сейчас читаете. На веб-сервере, где она хостится, есть сервер приложения, который извлекает содержимое статьи из базы данных, форматирует его, добавляет в HTML-шаблоны и отправляет вам результат. В нашем случае, сервер приложения называется Kuma , написан он на языке программирования Python (используя фреймворк Django). Команда Mozilla создала Kuma для конкретных нужд MDN, но есть множество подобных приложений, построенных совершенно на других технологиях.

Существует так много серверов приложений, что довольно трудно предложить какой-то один. Некоторые серверы приложений заточены под определенные категории веб-сайтов, такие как блоги, вики-страницы или интернет-магазины; другие, называемые CMSs (системы управления контентом), более универсальны. Если вы создаете динамический сайт, потратьте немного времени на выбор инструмента, который соответствует вашим потребностям. Если вы не хотите изучать веб-программирование (хотя это увлекательно само по себе!), то вам не нужно создавать свой собственный сервер приложения. Это будет изобретением очередного велосипеда.

Следующие шаги

Теперь, когда вы познакомились с веб-серверами, вы можете:

  • прочитать насколько сложно делать что-либо в веб
  • узнать больше о разнообразии ПО, которое может пригодиться для создания веб-сайта
  • двигаться к практике: например, .

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

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


Больше видео на нашем канале - изучайте интернет-маркетинг с SEMANTICA

Любой компьютер можно сделать сервером. Для этого нужно установить специальную оболочку.

Требования к технической части определяются количеством размещенных ресурсов и требованиями к скорости. Чем они больше, тем мощнее должен быть компьютер.
Чтобы было понятно, приведем аналогию. Вы заходите в библиотеку и просите выдать вам книгу. Библиотекарь находит нужную и передает вам. Библиотека - это сервер, в ней хранятся все данные. Библиотекарь - это оболочка, которая приняла запрос и направила ответ. Вы - клиент.
Можно отправить библиотекаря за дополнительной информацией – аналогично щелчку по ссылке. Разница в том, что один и тот же ресурс в интернете могут одновременно читать неограниченное число пользователей.
Обслуживание клиента производится по схожему принципу: приходя за книгой, мы можем задать вопрос библиотекарю (поисковая система) или заглянуть в указатель (ЯндексКаталог). Это помогает найти нужную информацию.

Что делает веб-сервер

Его главная задача – хранение информации. Страницы, файлы, изображения, текстовый контент.
Задачи:

  • Получать запросы.
  • Запускать программы на специальных языках программирования (серверных).
  • Формировать веб страницы.
  • Отправлять их назад пользователю.
  • Защищать информацию.
  • Проводить идентификацию посетителей.
  • Вести журнал обращений.
  • Обслуживать запросы других типов: mailto, и т.д.

Чтобы понять, как работает веб-сервер, надо иметь представление о принципах передачи информации в сети. В основе лежат правила, называемые протоколами: любой URL начинается с указания типа (ftp, http://, https:// и пр.).
Hyper Text Transfer Protocol – протокол передачи . Страницы сайта всегда имеют вид гипертекстового документа. Это конечный результат работы любой серверной или клиентской программы.

  • Когда пользователь вводит адрес или нажимает ссылку, браузер передает запрос, кодируя информацию по этим правилам.
  • Хост, к которому привязан этот адрес, запускает программы сервера. Каждая из них выполняет свои функции.
  • Полученные данные расшифровываются, команды выполняются.
  • Формируется гипертекст, кодируется и отправляется обратно.
  • Браузер получает ответ, преобразовывает код в html и показывает на экране страницу.

Что нужно для веб-сервера

Нужна машина, которая будет обрабатывать все запросы. Оцените нагрузку, которую должен выдерживать сервер. Это зависит от количества посетителей: чем больше запросов, тем требуется большая мощность.

Есть специальные компании, которые предоставляют услуги хостинга. Сервер вы арендуете. Вам дается квота для размещения файлов сайта.
Но если у вас простенький сайт, то можно обойтись своими силами.

Когда решен вопрос с сервером, надо привязать к нему статический IP-адрес.

Сайт становится доступен на веб-сервере после того, как зарегистрировано доменное имя, выполнено преобразование адресов службой DNS - связывание IP-адреса (например, 111.111.111.111) и доменного имени (www.site.com).

Самые распространенные сервера

Apache

Это бесплатный, свободно распространяемый продукт, у которого есть масса преимуществ:

  • Постоянная поддержка разработчиков.
  • Модули для работы с серверными языками программирования PHP, Perl, Python, Ruby, ASP и т.д.
  • Открытый код. Доработкой под свои нужды занимаются разные программисты. Например, русскоязычное сообщество адаптирует его к русской кодировке.
  • . Изначально был создан под Unix, но сейчас поддерживается Windows, Mac OS, BSD, Linux, OS/2 и Novell NetWare.
  • Безопасность.

При инсталляции укажите имя вашего хоста, например, localhost. В папку htdocs, которая лежит внутри папки Apachex.x (где x.x – номер версии) скопируйте любую html-страницу. Или создайте ее в блокноте, введя любой текст и сохранив с расширением html.

Когда в папке появился файл, откройте браузер и наберите адрес: localhost://ИМЯ СТРАНИЦЫ.html. На экране появится ваш текст – страница открыта с сервера. Если вы увидели ошибку «Не удается получить доступ к сайту», значит не запущен Apache. Его значок находится в трее.
Нажмите на него и выберите «Play». После этого все заработает.

NGNIX

Доля работающих на нем активных площадок составляет 21,13% (исследования Netcraft). Его в основном используют крупные компании и профессиональные разработчики: Yandex, Mail.ru, Rambler и пр. NGNIX выдерживает огромную нагрузку посетителей, надежен, безопасен и продуман.
Распространяется свободно, но появились платные версии Plus, стоимость от 2,500 $.

IIS

Его известность обеспечена громким именем разработчика. Представляет собой набор веб служб и интегрирован с Windows. Родной платформой программирования является ASP.NET, но можно внедрить и альтернативу, например, РНР.

Для полноценного хостинга требуется установка серверной операционной системы от Microsoft – Windows Server. 6-я версия вообще не была предназначена для хостинга, полноценная поддержка началась в 7-й. Приобретается он автоматически вместе с операционной системой и зависит от ее характеристик.

Установочные пакеты

Для начинающих программистов и разработчиков создаются инструменты, которые позволяют в несколько кликов развернуть веб-сервер у себя на компьютере.

  • OpenServer. Портативная среда разработки, включающая множество баз данных, языков программирования и их версий, а также дополнительные сервисы. Например, интерфейс работы с БД PhpMyAdmin. На сегодняшний день это самый популярный инсталляционный набор. Работает даже с флешки. Бесплатно скачивается на низкой скорости. За 100 рублей скорость увеличивается в разы.
  • Xampp. Активно поддерживаемый пакет: Apache, Php, Perl, MariaDB и пр. Имеет панель управления. Скачивается бесплатно.
  • . Очень удобный набор всех нужных инструментов, включающий Apache, PHP, MySQL, PhpMyAdmin. К сожалению, последняя версия включает устаревшие дистрибутивы. В целом для обучения подойдут и они. Судя по форуму проект больше не поддерживается.

В этой статье я постараюсь максимально широко изложить схемы работы веб-серверов. Это поможет выбрать сервер или решать, какая архитектура быстрее, не основываясь на часто необъективных бенчмарках.

В общем - статья представляет собой глобальный обзор "что бывает". Без циферок.

Статья написана на основе опыта работы с серверами:

  • Apache, Lighttpd, Nginx (на C)
  • Tomcat, Jetty (на Java)
  • Twisted (Python)
  • Erlang OTP (язык Erlang)
  • и операционными системами Linux, FreeBSD

Тем не менее, принципы достаточно общие, поэтому должны распространяться в каком-то виде на OS Windows, Solaris, и на большое количество других веб-серверов.

Цель веб-сервера

Цель веб-сервера проста - обслуживать одновременно большое количество клиентов, максимально эффективно используя hardware. Как это сделать - в этом основная заморочка и предмет статьи;)

Работа с соединениями

С чего начинается обработка запроса? Очевидно - с приема соединения от пользователя.

Для этого в разных OS используются разные системные вызовы. Наиболее известный и медленный на большом количестве соединений - select . Более эффективные - poll, kpoll, epoll.

Современные веб-серверы постепенно отказываются от select.

Оптимизации ОС

Еще до приема соединения возможны оптимизации на уровне ядра ОС. Например, ядро ОС, получив соединение, может не беспокоить веб-сервер, пока не произошло одно из событий.

  • пока не пришли данные (dataready)
  • пока не пришел целиком HTTP-запрос (httpready)

На момент написания статьи оба способа поддерживаются во FreeBSD (ACCEPT_FILTER_HTTP, ACCEPT_FITER_DATA), и только первый - в Linux (TCP_DEFER_ACCEPT).

Эти оптимизации позволяют серверу меньше времени простаивать в ожидании данных, повышая таким образом общую эффективность работы.

Соединение принято

Итак, соединение принято. Теперь на плечи сервера ложится основная задача - обработать запрос и отослать ответ посетителю. Будем здесь рассматривать только динамические запросы, существенно более сложные, чем отдача картинок.

Во всех серверах используется асинхронный подход.

Он заключается в том, что обработка запроса спихивается куда-нибудь "налево" - отдается на выполнение вспомогательному процессу/потоку, а сервер продолжает работать и принимать-отдавать на выполнение все новые соединения.

В зависимости от реализации - процесс-помощник ("worker") может пересылать результат обратно серверу целиком (для последующей отдачи клиенту), может передавать серверу только дескриптор результата (без копирования), или может отдавать результат клиенту сам.

Основные стратегии работы с worker"ами

Работа с воркерами состоит из нескольких элементов, которые можно по-разному комбинировать и получать разный результат.

Тип worker"а

Основных типов два - это процесс и поток. Для улучшения производительности иногда используют оба типа одновременно, порождая несколько процессов и кучу потоков в каждом.

Процесс

Различные worker"ы могут быть процессами. В этом случае они не взаимодействуют между собой, и данные различных worker"а полностью независимы друг от друга.

Поток

Потоки, в отличие от процессов, имеют общие, разделяемые структуры данных. В коде worker"а должна быть реализована синхронизация доступа, чтобы одновременная запись одной и той же структуры не привела к хаосу.

Адресное пространство

Каждый процесс, в том числе и сервер, обладает своим адресным пространством, которое использует для разделения данных.

Внутри сервера

При работе внутри сервера - worker имеет доступ к данным сервера. Он может поменять любые структуры и делать разные гадости, особенно если написан с ошибками.

Плюсом является отсутствие пересылки данных из одного адресного пространства в другое.

Снаружи сервера

Worker может быть запущен вообще независимо от сервера и принимать данные на обработку по специальному протоколу (например FastCGI).

Конечно, этот вариант - самый безопасный для сервера. Но требует дополнительной работы по пересылке запроса - результата между сервером и worker"ом.

Рождение worker"ов

Чтобы обрабатывать много соединений одновременно - нужно иметь достаточное количество рабочих.

Основных стратегий - две.

Статика

Количество рабочих может быть жестко фиксированно. Например, 20 рабочих процессов всего. Если же все рабочие заняты и приходит 21й запрос - сервер выдает код Temporary Unavailable - "временно недоступен".

Динамика

Для более гибкого управления ресурсами - рабочие могут порождаться динамически, в зависимости от загрузки. Алгоритм порождения рабочих может быть параметризован, например (Apache pre-fork), так:

  • Минимальное количество свободных рабочих = 5
  • Максимальное количество свободных рабочих = 20
  • Всего рабочих не более = 30
  • Начальное количество рабочих = 10

Чистка между запросами

Рабочие могут либо заново инициализовать себя между запросами, либо - просто обрабатывать запросы один за другим.

Чистый

Перед каждым запросом очищается от того, что было раньше, чистит внутренние переменные и пр.

В результате нет проблем и ошибок, связанных с использованием переменных, оставшихся от старого запроса.

Персистентный

Никакой очистки состояния. В результате - экономия ресурсов.

Разбор типичных конфигураций

Посмотрим, как эти комбинации работают на примере различных серверов.

Apache (pre-fork MPM) + mod_php

Для обработки динамических запросов используется модуль php, работающий в контексте сервера.
  • Процесс
  • Внутри сервера
  • Динамика
  • Чистый

Apache (worker MPM) + mod_php

Для обработки динамических запросов используется модуль php, работающий в контексте сервера.

При этом, так как php работает в адресном пространстве сервера, разделяемые потоками данные периодически портятся, поэтому связка нестабильна и не рекомендована. Это происходит из-за ошибок в mod_php, который включает в себя ядро PHP и различные php-модули.

Ошибка в модуле, благодаря одному адресному пространству, может повалить весь сервер.

  • Поток
  • Внутри сервера
  • Динамика
  • Чистый

Apache (event mpm) + mod_php

Event MPM - это стратегия работы с worker"ами, которую использует только Apache. Все - точно так же, как с обычными потоками, но с небольшим дополнением для обработки Keep-Alive

Установка Keep-Alive служит для того, чтобы клиент мог прислать много запросов в одном соединении. Например, получить веб-страницу и 20 картинок. Обычно, worker заканчивает обработку запроса - и ждет какое-то время (keep-alive time), не последуют ли в этом соединении дополнительные запросы. То есть, просто висит в памяти.

Event MPM создает дополнительный поток, который берет на себя ожидание всех Keep-Alive запросов, освобождая рабочего для других полезных дел. В результате, общее количество worker"ов значительно сокращается, т.к никто теперь не ждет клиентов, а все работают.

  • Поток
  • Внутри сервера
  • Динамика
  • Чистый

Apache + mod_perl

Особенность связки Apache с mod_perl - в возможности вызывать Perl-процедуры по ходу обработки запроса апачем.

Благодаря тому, что mod_perl работает в одном адресном пространстве с сервером - он может регистрировать свои процедуры через Apache hooks, на разных стадиях работы сервера.

Например, можно работать на той же стадии, что и mod_rewrite, переписывая урл в хуке PerlTransHandler.

Следующий пример описывает rewrite с /example на /passed, но на перле.

# в конфиге апача при включенном mod_perl PerlModule MyPackage::Example PerlTransHandler MyPackage::Example # в файле MyPackage/Example.pm package MyPackage::Example use Apache::Constants qw(DECLINED); use strict; sub handler { my $r = shift; $r->uri("/passed") if $r->uri == "/example" return DECLINED; } 1;

К сожалению, mod_perl - весьма тяжелый сам по себе, поэтому использование его лишь реврайтов - весьма накладно.

В отличие от mod_php, перловый модуль персистентен, т.е не инициализует себя заново каждый раз. Это удобно, т.к освобождает от необходимости загружать заново большую пачку модулей перед каждым запросом.

  • Процесс/поток - зависит от MPM
  • Внутри сервера
  • Динамика
  • Персистентный

Twisted

Этот асинхронный сервер написан на Python. Его особенность - в том, что программист веб-приложения сам создает дополнительных рабочих и дает им задания. # пример кода на сервере twisted # долгая функция, обработка запроса def do_something_big(data): .... # в процессе обработки запроса d = deferToThread (do_something_big, "параметры") # привязать каллбеки на результат do_something_big d.addCallback(handleOK) # .. и на ошибку при выполнении do_something_big d.addErrback(handleError)

Здесь программист, получив запрос, использует вызов deferToThread для создания отдельного потока, которому поручено выполнить функцию do_something_big. При успешном окончании do_something_big, будет выполнена функция handleOK, при ошибке - handleError.

А текущий поток в это время продолжит обычную обработку соединений.

Все происходит в едином адресном пространстве, поэтому все рабочие могут разделять, например, один и тот же массив с пользователями. Поэтому на Twisted легко писать многопользовательские приложения типа чата.

  • Поток
  • Внутри сервера
  • Динамика
  • Персистентный

Tomcat, Servlets

Сервлеты - классический пример поточных веб-приложений. Единый Java-код приложения запускается во множестве потоков. Синхронизация обязательна и должна выполняться программистом.

  • Поток
  • Внутри сервера
  • Динамика
  • Персистентный

FastCGI

FastCGI - интерфейс общения web-сервера с внешними worker"ами, которые обычно запущены как процессы. Сервер в специальном (не HTTP) формате передает переменные окружения, заголовки и тело запроса, а worker - возвращает ответ.

Есть два способа порождения таких worker"ов.

  1. Интегрированный с сервером
  2. Отдельный от сервера

В первом случае сервер сам создает внешние рабочие процессы и управляет их числом.

Во втором случае - для порождения рабочих процессов используется отдельный "spawner", второй, дополнительный сервер, который умеет общаться только по FastCGI-протоколу и управлять рабочими. Обычно spawner порождает рабочих в виде процессов, а не потоков. Динамика/Статика - определяется настройками spawner"а, а Чистый/Персистентный - характеристиками рабочего процесса.

Пути работы с FastCGI

С FastCGI можно работать двумя путями. Первый способ - самый простой, его использует Apache.

получить запрос -> отдать на обработку в FastCGI -> подождать ответа -> отдать ответ клиенту.

Второй способ используют сервера типа lighttpd/nginx/litespeed/и т.п.

получить запрос -> отдать на обработку в FastCGI -> обработать других клиентов -> отдать ответ клиенту, когда придет.

Отмеченное отличие позволяет Lighttpd + fastcgi работать эффективнее, чем это делает Apache, т.к пока процесс Apache ждет - Lighttpd успевает обслужить другие соединения.

Режимы работы FastCGI

У FastCGI есть два режима работы.
  • Responder - обычный режим, когда FastCGI принимает запрос и переменные, и возвращает ответ
  • Authorizer - режим, когда FastCGI в качестве ответа разрешает или запрещает доступ. Удобно для контроля за закрытыми статическими файлами

Оба режима поддерживаются не во всех серверах. Например, в сервере Lighttpd - поддерживаются оба.

FastCGI PHP vs PERL

PHP-интерпретатор каждый раз очищает себя перед обработкой скрипта, а Perl - просто обрабатывает запросы один за другим в цикле вида:

Подключить модули; while (пришел запрос) { обработать его; print answer; } Поэтому Perl-FastCGI гораздо эффективнее там, где большУю часть времени выполнения занимают include вспомогательных модулей.

Резюме

В статье рассмотрена общая структура обработки запросов и виды worker"ов. Кроме того, заглянули в Apache Event MPM и способы работы с FastCGI, посмотрели сервлеты и Twisted.

Надеюсь, этот обзор послужит отправной точкой для выбора серверной архитектуры Вашего веб-приложения.

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то