Веб -сервер — это компьютерное программное обеспечение и базовое оборудование , которое принимает запросы через HTTP ( сетевой протокол , созданный для распространения веб-контента ) или его защищенный вариант HTTPS . Пользовательский агент, обычно веб-браузер или веб-сканер , инициирует связь, делая запрос на веб-страницу или другой ресурс с использованием HTTP, а сервер отвечает содержимым этого ресурса или сообщением об ошибке . Веб-сервер также может принимать и хранить ресурсы, отправленные пользовательским агентом, если настроен на это. [1] [2]
Аппаратное обеспечение, используемое для запуска веб-сервера, может различаться в зависимости от объема запросов, которые ему необходимо обработать. В нижнем конце диапазона находятся встроенные системы , такие как маршрутизатор , который запускает небольшой веб-сервер в качестве своего интерфейса конфигурации. Высокотрафикный веб -сайт Интернета может обрабатывать запросы с помощью сотен серверов, работающих на стойках высокоскоростных компьютеров.
Ресурс, отправленный с веб-сервера, может быть уже существующим файлом ( статический контент ), доступным веб-серверу, или он может быть сгенерирован во время запроса ( динамический контент ) другой программой , которая взаимодействует с программным обеспечением сервера. Первый обычно может обслуживаться быстрее и может быть легче кэширован для повторных запросов, в то время как последний поддерживает более широкий спектр приложений.
Такие технологии, как REST и SOAP , которые используют HTTP в качестве основы для общего взаимодействия между компьютерами, а также поддержка расширений WebDAV , значительно расширили сферу применения веб-серверов за пределы их первоначального назначения — обслуживания страниц, удобных для чтения человеком.
Это очень краткая история программ веб-серверов , поэтому некоторая информация обязательно пересекается с историей веб-браузеров , Всемирной паутины и Интернета ; поэтому, ради ясности и понятности, некоторые ключевые исторические сведения, представленные ниже, могут быть аналогичны тем, которые можно найти в одной или нескольких вышеупомянутых исторических статьях. [ требуется ссылка ]
В марте 1989 года сэр Тим Бернерс-Ли предложил своему работодателю CERN новый проект с целью облегчения обмена информацией между учеными с помощью гипертекстовой системы. Предложение под названием «Гипертекст и CERN» было запрошено для комментариев, и его прочитали несколько человек. В октябре 1990 года предложение было переформулировано и расширено (имея в качестве соавтора Роберта Кайо ), и, наконец, оно было одобрено. [3] [4] [5]
В период с конца 1990 по начало 1991 года проект привел к написанию и тестированию Бернерсом-Ли и его разработчиками нескольких программных библиотек, а также трех программ, которые изначально работали на ОС NeXTSTEP, установленной на рабочих станциях NeXT : [6] [7] [5]
Эти ранние браузеры извлекали веб-страницы, написанные на простой ранней форме HTML , с веб-серверов, используя новый базовый протокол связи, который назывался HTTP 0.9 .
В августе 1991 года Тим Бернерс-Ли объявил о рождении технологии WWW и призвал ученых принять и развивать ее. [8] Вскоре после этого эти программы вместе с их исходным кодом стали доступны для людей, заинтересованных в их использовании. [6] Хотя исходный код формально не был лицензирован или размещен в открытом доступе, ЦЕРН неофициально разрешил пользователям и разработчикам экспериментировать и продолжать разработку на их основе. Бернерс-Ли начал продвигать принятие и использование этих программ вместе с их переносом на другие операционные системы . [5]
В декабре 1991 года в SLAC (США) был установлен первый веб-сервер за пределами Европы . [7] Это было очень важное событие, поскольку оно положило начало трансконтинентальным веб-коммуникациям между веб-браузерами и веб-серверами.
В 1991–1993 годах программа веб-сервера ЦЕРНа продолжала активно разрабатываться группой www, в то же время, благодаря доступности ее исходного кода и общедоступным спецификациям протокола HTTP, начали разрабатываться многие другие реализации веб-серверов.
В апреле 1993 года ЦЕРН опубликовал официальное заявление, в котором говорилось, что три компонента веб-программного обеспечения (базовый клиент линейного режима, веб-сервер и библиотека общего кода) вместе с их исходным кодом были переданы в общественное достояние . [11] Это заявление освободило разработчиков веб-серверов от любых возможных юридических проблем, связанных с разработкой производных работ на основе этого исходного кода (угроза, которая на практике никогда не существовала).
В начале 1994 года наиболее заметным среди новых веб-серверов был NCSA httpd , который работал на различных ОС на базе Unix и мог обслуживать динамически генерируемый контент , реализуя POST
метод HTTP и CGI для связи с внешними программами. Эти возможности, наряду с мультимедийными функциями браузера Mosaic NCSA (также способного управлять HTML FORMs для отправки данных на веб-сервер), подчеркнули потенциал веб-технологий для публикации и распределенных вычислительных приложений.
Во второй половине 1994 года разработка NCSA httpd застопорилась до такой степени, что группа внешних разработчиков программного обеспечения, веб-мастеров и других профессиональных деятелей, заинтересованных в этом сервере, начала писать и собирать патчи благодаря тому, что исходный код NCSA httpd был доступен в общественном достоянии. В начале 1995 года все эти патчи были применены к последнему выпуску исходного кода NCSA, и после нескольких тестов был начат проект Apache HTTP-сервера . [12] [13]
В конце 1994 года был выпущен новый коммерческий веб-сервер Netsite с определенными функциями. Он был первым из многих других подобных продуктов, которые были разработаны сначала Netscape , затем также Sun Microsystems и, наконец, Oracle Corporation .
В середине 1995 года была выпущена первая версия IIS для ОС Windows NT компанией Microsoft . Это ознаменовало выход на рынок технологий Всемирной паутины очень важного коммерческого разработчика и поставщика, который играл и продолжает играть ключевую роль на обеих сторонах (клиент и сервер) сети.
Во второй половине 1995 года веб-серверы CERN и NCSA начали приходить в упадок (в глобальном процентном отношении использования) из-за повсеместного внедрения новых веб-серверов, которые имели гораздо более быстрый цикл разработки, а также больше функций, больше исправлений и большую производительность, чем предыдущие.
В конце 1996 года уже существовало более пятидесяти известных (различных) программ веб-серверов, которые были доступны каждому, кто хотел владеть доменным именем в Интернете и/или размещать веб-сайты. [15] Многие из них просуществовали недолго и были заменены другими веб-серверами.
Публикация RFC о версиях протоколов HTTP/1.0 (1996) и HTTP/1.1 (1997, 1999) заставила большинство веб-серверов соответствовать (не всегда полностью) этим стандартам. Использование постоянных соединений TCP/IP (HTTP/1.1) потребовало от веб-серверов как увеличения максимального количества одновременных соединений, так и повышения уровня масштабируемости.
В период с 1996 по 1999 год Netscape Enterprise Server и IIS от Microsoft стали одними из ведущих коммерческих вариантов, в то время как среди свободно распространяемых программ с открытым исходным кодом Apache HTTP Server удерживал лидирующие позиции в качестве предпочтительного сервера (благодаря своей надежности и многочисленным функциям).
В те годы существовал еще один коммерческий, весьма инновационный и потому примечательный веб-сервер под названием Zeus ( ныне прекращенный ), который был известен как один из самых быстрых и масштабируемых веб-серверов, доступных на рынке, по крайней мере до первого десятилетия 2000-х годов, несмотря на его низкий процент использования.
Apache стал самым используемым веб-сервером с середины 1996 года до конца 2015 года, когда после нескольких лет спада его сначала превзошел IIS, а затем Nginx. После этого процент использования IIS упал до гораздо более низкого, чем Apache (см. также долю рынка).
С 2005 по 2006 год Apache начал улучшать свою скорость и уровень масштабируемости, внедряя новые функции производительности (например, MPM событий и новый кэш контента). [16] [17] Поскольку эти новые улучшения производительности изначально были отмечены как экспериментальные, они долгое время не были включены пользователями, и поэтому Apache еще больше страдал от конкуренции со стороны коммерческих серверов и, прежде всего, других серверов с открытым исходным кодом, которые тем временем уже достигли гораздо более высокой производительности (в основном при обслуживании статического контента) с самого начала своей разработки и на момент упадка Apache могли предложить также достаточно длинный список хорошо протестированных расширенных функций.
Фактически, через несколько лет после начала 2000 года появились не только другие коммерческие и весьма конкурентоспособные веб-серверы, например, LiteSpeed , но и множество других программ с открытым исходным кодом, часто превосходного качества и очень высокой производительности, среди которых следует отметить Hiawatha , Cherokee HTTP server , Lighttpd , Nginx и другие производные/связанные продукты, также доступные с коммерческой поддержкой.
Около 2007–2008 годов большинство популярных веб-браузеров увеличили свой предыдущий лимит по умолчанию в 2 постоянных соединения на хост-домен (ограничение, рекомендованное RFC-2616) [18] до 4, 6 или 8 постоянных соединений на хост-домен, чтобы ускорить извлечение тяжелых веб-страниц с большим количеством изображений и смягчить проблему нехватки постоянных соединений, выделенных для динамических объектов, используемых для двунаправленных уведомлений о событиях на веб-страницах. [19] В течение года эти изменения в среднем почти утроили максимальное количество постоянных соединений, которые должны были обрабатывать веб-серверы. Эта тенденция (увеличения количества постоянных соединений) определенно дала сильный толчок принятию обратных прокси-серверов перед более медленными веб-серверами, а также дала еще один шанс появляющимся новым веб-серверам, которые могли показать всю свою скорость и свою способность обрабатывать очень большое количество одновременных соединений, не требуя слишком много аппаратных ресурсов (дорогие компьютеры с большим количеством процессоров, оперативной памяти и быстрых дисков). [20]
В 2015 году RFC опубликовали новую версию протокола [HTTP/2], и поскольку реализация новых спецификаций была совсем нетривиальной, среди разработчиков менее популярных веб-серверов (например, с процентом использования ниже 1% .. 2%) возникла дилемма о добавлении или не добавлении поддержки этой новой версии протокола. [21] [22]
На самом деле поддержка HTTP/2 часто требовала радикальных изменений во внутренней реализации из-за многих факторов (практически всегда требовались зашифрованные соединения, возможность различать соединения HTTP/1.x и HTTP/2 на одном и том же порту TCP, двоичное представление сообщений HTTP, приоритет сообщений, сжатие заголовков HTTP, использование потоков, также известных как подсоединения TCP/IP, и связанное с этим управление потоком и т. д.), поэтому некоторые разработчики этих веб-серверов решили не поддерживать новую версию HTTP/2 (по крайней мере, в ближайшем будущем) также по следующим основным причинам: [21] [22]
Вместо этого разработчики большинства популярных веб-серверов поспешили предложить доступность нового протокола не только потому, что у них были рабочая сила и время, чтобы сделать это, но и потому, что обычно их предыдущая реализация протокола SPDY могла быть повторно использована в качестве отправной точки, и потому, что большинство используемых веб-браузеров реализовывали его очень быстро по той же причине. Другая причина, побудившая этих разработчиков действовать быстро, заключалась в том, что веб-мастера чувствовали давление постоянно растущего веб-трафика , и они действительно хотели установить и попробовать – как можно скорее – что-то, что могло бы радикально снизить количество соединений TCP/IP и ускорить доступ к размещенным веб-сайтам. [23]
В 2020–2021 годах динамика внедрения HTTP/2 (ведущими веб-серверами и популярными веб-браузерами) частично воспроизвелась после публикации предварительных проектов будущих RFC по протоколу HTTP/3 .
Следующий технический обзор следует рассматривать только как попытку привести несколько очень ограниченных примеров некоторых функций , которые могут быть реализованы на веб-сервере, и некоторых задач, которые он может выполнять, чтобы иметь достаточно широкий обзор по теме.
Программа веб-сервера играет роль сервера в модели клиент-сервер , реализуя одну или несколько версий протокола HTTP, часто включая защищенный вариант HTTPS и другие функции и расширения, которые считаются полезными для ее планируемого использования.
Сложность и эффективность программы веб-сервера может сильно различаться в зависимости от (например): [1]
Хотя программы веб-серверов различаются по способу реализации, большинство из них предлагают следующие общие функции.
Это основные функции , которые обычно есть у большинства веб-серверов.
Вот еще несколько более продвинутых и популярных функций ( это лишь очень краткий перечень ).
Программа веб-сервера, когда она запущена, обычно выполняет несколько общих задач , (например): [1]
Программы веб-сервера могут: [24] [25] [26]
После того, как сообщение HTTP-запроса декодировано и проверено, его значения могут быть использованы для определения того, может ли этот запрос быть удовлетворен или нет. Для этого требуется много других шагов, включая проверки безопасности .
Программы веб-сервера обычно выполняют некоторую нормализацию URL-адресов ( URL-адрес, встречающийся в большинстве сообщений HTTP-запросов) для того, чтобы:
Термин нормализация URL относится к процессу изменения и стандартизации URL-адреса в согласованной манере. Существует несколько типов нормализации, которые могут быть выполнены, включая преобразование схемы и хоста в нижний регистр. Среди наиболее важных нормализаций — удаление сегментов пути "." и ".." и добавление завершающих слешей к непустому компоненту пути.
«Отображение URL — это процесс, при котором URL анализируется для определения ресурса, на который он ссылается, чтобы этот ресурс мог быть возвращен запрашивающему клиенту. Этот процесс выполняется с каждым запросом, который делается на веб-сервер, при этом некоторые запросы обслуживаются файлом, таким как документ HTML или изображение gif, другие — результатами запуска программы CGI, а третьи — каким-либо другим процессом, таким как встроенный обработчик модулей, документ PHP или сервлет Java». [27] [ требуется обновление ]
На практике программы веб-сервера, реализующие расширенные функции, выходящие за рамки простого обслуживания статического контента (например, механизм перезаписи URL-адресов, обслуживание динамического контента), обычно должны определять, как обрабатывать этот URL-адрес, например, как:
Один или несколько файлов конфигурации веб-сервера могут определять сопоставление частей пути URL (например, начальных частей пути файла , расширения имени файла и других компонентов пути) с определенным обработчиком URL (файлом, каталогом, внешней программой или внутренним модулем). [28]
Если веб-сервер реализует одну или несколько из вышеупомянутых расширенных функций, то часть пути действительного URL-адреса может не всегда соответствовать существующему пути файловой системы в дереве каталогов веб-сайта (файлу или каталогу в файловой системе ), поскольку он может ссылаться на виртуальное имя внутреннего или внешнего модульного процессора для динамических запросов.
Программы веб-сервера способны преобразовывать URL-путь (полностью или частично), который ссылается на физический путь файловой системы, в абсолютный путь в корневом каталоге целевого веб-сайта. [28]
Корневой каталог веб-сайта может быть указан в файле конфигурации или в каком-либо внутреннем правиле веб-сервера с использованием имени веб-сайта, которое является частью хоста URL-адреса, найденного в HTTP-запросе клиента. [28]
Трансляция путей в файловую систему выполняется для следующих типов веб-ресурсов:
Веб-сервер добавляет путь, найденный в запрошенном URL (сообщение запроса HTTP), и добавляет его к пути корневого каталога веб-сайта (Host). На сервере Apache это обычно /home/www/website
(на машинах Unix это обычно: /var/www/website
). Смотрите следующие примеры того, как это может произойти.
Перевод пути URL для запроса статического файла
Пример статического запроса существующего файла, указанного по следующему URL:
http://www.example.com/path/file.html
Пользовательский агент клиента подключается www.example.com
и затем отправляет следующий HTTP /1.1-запрос:
GET /путь/файл.html HTTP/1.1Хост: www.example.comСоединение: поддерживать активность
Результатом является локальный ресурс файловой системы:
/home/www/www.example.com/path/file.html
Затем веб-сервер считывает файл , если он существует, и отправляет ответ веб-браузеру клиента. Ответ будет описывать содержимое файла и содержать сам файл, или вернется сообщение об ошибке, сообщающее, что файл не существует или доступ к нему запрещен.
Перевод пути URL для запроса каталога (без статического индексного файла)
Пример неявного динамического запроса существующего каталога, указанного следующим URL:
http://www.example.com/directory1/directory2/
Пользовательский агент клиента подключается www.example.com
и затем отправляет следующий HTTP /1.1-запрос:
GET /каталог1/каталог2 HTTP/1.1Хост: www.example.comСоединение: поддерживать активность
Результатом является путь к локальному каталогу:
/home/www/www.example.com/directory1/directory2/
Затем веб-сервер проверяет существование каталога , и если он существует и к нему можно получить доступ, то пытается найти файл индекса (который в этом случае не существует), и поэтому он передает запрос внутреннему модулю или программе, предназначенной для листинга каталогов, и, наконец, считывает выходные данные и отправляет ответ веб-браузеру клиента. Ответ будет описывать содержимое каталога (список содержащихся подкаталогов и файлов), или вернется сообщение об ошибке, говорящее о том, что каталог не существует или доступ к нему запрещен.
Перевод пути URL для динамического запроса программы
Для динамического запроса URL-путь, указанный клиентом, должен ссылаться на существующую внешнюю программу (обычно исполняемый файл с CGI), используемую веб-сервером для генерации динамического контента. [29]
Пример динамического запроса , использующего программный файл для генерации вывода:
http://www.example.com/cgi-bin/forum.php?action=view&orderby=thread&date=2021-10-15
Пользовательский агент клиента подключается www.example.com
и затем отправляет следующий HTTP /1.1-запрос:
GET /cgi-bin/forum.php?action=view&ordeby=thread&date=2021-10-15 HTTP/1.1Хост: www.example.comСоединение: поддерживать активность
Результатом является локальный путь к файлу программы (в данном примере — PHP- программы):
/home/www/www.example.com/cgi-bin/forum.php
Веб-сервер выполняет эту программу, передавая информацию о пути и строку запроса action=view&orderby=thread&date=2021-10-15
, чтобы программа имела информацию, необходимую для запуска. (В этом случае он вернет HTML-документ, содержащий представление записей форума, упорядоченных по теме с 15 октября 2021 г.). В дополнение к этому веб-сервер считывает данные, отправленные из внешней программы, и повторно отправляет эти данные клиенту, который сделал запрос.
После того как запрос прочитан, интерпретирован и проверен, его необходимо обработать в зависимости от его метода, URL-адреса и параметров, которые могут включать значения заголовков HTTP.
На практике веб-сервер должен обработать запрос, используя один из следующих путей ответа: [28]
OPTIONS
, ), который может быть удовлетворен общим кодом веб-сервера, то отправляется успешный ответ;Если программа веб-сервера способна обслуживать статический контент и настроена для этого, то она может отправлять содержимое файла всякий раз, когда сообщение-запрос имеет действительный URL-путь, соответствующий (после сопоставления URL, преобразования URL и перенаправления URL) существующему файлу в корневом каталоге веб-сайта, и файл имеет атрибуты, которые соответствуют тем, которые требуются внутренними правилами программы веб-сервера. [28]
Такой тип контента называется статическим , поскольку обычно он не изменяется веб-сервером при отправке клиентам и остается неизменным до тех пор, пока не будет изменен (изменен файл) какой-либо программой.
ПРИМЕЧАНИЕ: при обслуживании только статического контента программа веб-сервера обычно не изменяет содержимое файлов обслуживаемых веб-сайтов (поскольку они только читаются и никогда не записываются), поэтому достаточно поддерживать только следующие методы HTTP :
OPTIONS
HEAD
GET
Отклик статического содержимого файла можно ускорить с помощью файлового кэша .
Если программа веб-сервера получает сообщение-запрос клиента с URL-адресом, путь которого соответствует одному из существующих каталогов , и этот каталог доступен, а обслуживание индексных файлов каталога включено, то программа веб-сервера может попытаться обслужить первое из известных (или настроенных) имен статических индексных файлов (обычный файл), найденных в этом каталоге; если индексный файл не найден или не выполнены другие условия, возвращается сообщение об ошибке.
Наиболее часто используемые имена для статических индексных файлов: index.html
, index.htm
и Default.htm
.
Если программа веб-сервера получает сообщение-запрос клиента с URL-адресом, путь к которому соответствует имени существующего файла , и этот файл доступен программе веб-сервера, а его атрибуты соответствуют внутренним правилам программы веб-сервера, то программа веб-сервера может отправить этот файл клиенту.
Обычно, по соображениям безопасности, большинство программ веб-серверов предварительно настроены на обслуживание только обычных файлов или на избежание использования специальных типов файлов , таких как файлы устройств , а также символических ссылок или жестких ссылок на них. Цель состоит в том, чтобы избежать нежелательных побочных эффектов при обслуживании статических веб-ресурсов. [30]
Если программа веб-сервера способна обслуживать динамический контент и настроена для этого, то она может взаимодействовать с соответствующим внутренним модулем или внешней программой (связанной с запрошенным путем URL), чтобы передать ей параметры клиентского запроса. После этого программа веб-сервера считывает из нее свой ответ с данными (который она сгенерировала, часто на лету), а затем пересылает его клиентской программе, которая сделала запрос. [ необходима цитата ]
ПРИМЕЧАНИЕ: при обслуживании статического и динамического контента программа веб-сервера обычно должна также поддерживать следующий метод HTTP, чтобы иметь возможность безопасно получать данные от клиента(ов) и, таким образом, иметь возможность размещать веб-сайты с интерактивными формами, которые могут отправлять большие наборы данных (например, большой объем ввода данных или загрузки файлов ) на веб-сервер/внешние программы/модули:
POST
Чтобы иметь возможность взаимодействовать со своими внутренними модулями и/или внешними программами, программа веб-сервера должна реализовать один или несколько из множества доступных интерфейсов шлюза ( см. также Интерфейсы шлюза веб-сервера, используемые для динамического контента).
Ниже приведены три стандартных и исторических интерфейса шлюза .
Программа веб-сервера может управлять динамической генерацией (на лету) списка индексов каталогов файлов и подкаталогов. [31]
Если программа веб-сервера настроена на это, и запрошенный путь URL соответствует существующему каталогу, и его доступ разрешен, и в этом каталоге не найден статический индексный файл, то веб-страница (обычно в формате HTML), содержащая список файлов и/или подкаталогов вышеупомянутого каталога, динамически генерируется (на лету). Если ее невозможно сгенерировать, возвращается ошибка.
Некоторые программы веб-сервера позволяют настраивать списки каталогов, разрешая использование шаблона веб-страницы (HTML-документа, содержащего заполнители, например $(FILE_NAME), $(FILE_SIZE)
, и т. д., которые заменяются значениями полей каждой записи файла, найденной веб-сервером в каталоге), например, index.tpl
или использование HTML и встроенного исходного кода, который интерпретируется и выполняется «на лету», например index.asp
, и/или путем поддержки использования динамических программ индексации, таких как CGI, SCGI, FCGI, например index.cgi
, , index.php
, index.fcgi
.
Использование динамически генерируемых списков каталогов обычно избегается или ограничивается несколькими выбранными каталогами веб-сайта, поскольку такая генерация требует гораздо больше ресурсов ОС, чем отправка статической индексной страницы.
Основное применение списков каталогов — разрешение загрузки файлов (обычно, когда их имена, размеры, дата и время изменения или атрибуты файлов могут меняться случайным образом / часто) в том виде, в котором они есть, без необходимости предоставления дополнительной информации запрашивающему пользователю . [32]
Внешняя программа или внутренний модуль ( процессорный блок ) может выполнять некоторую прикладную функцию, которая может использоваться для получения данных из одного или нескольких хранилищ данных или для сохранения данных в них , например: [ необходима ссылка ]
Блок обработки может возвращать любой вид веб-контента, в том числе с использованием данных, полученных из хранилища данных, например: [ необходима цитата ]
На практике всякий раз, когда имеется контент, который может меняться в зависимости от одного или нескольких параметров, содержащихся в клиентском запросе или в настройках конфигурации, то, как правило, он генерируется динамически.
Программы веб-сервера способны отправлять ответные сообщения в качестве ответов на клиентские запросы. [24]
Сообщение об ошибке может быть отправлено, поскольку сообщение-запрос не может быть успешно прочитано, декодировано, проанализировано или выполнено. [25]
ПРИМЕЧАНИЕ: следующие разделы приведены только в качестве примеров, чтобы помочь понять, что, в общем-то, делает веб-сервер; эти разделы ни в коем случае не являются ни исчерпывающими, ни полными.
Программа веб-сервера может отвечать на запрос клиента множеством видов сообщений об ошибках, в любом случае эти ошибки делятся в основном на две категории:
Когда клиентский браузер получает ответ/сообщение об ошибке, то, если оно связано с основным запросом пользователя (например, URL-адресом веб-ресурса, такого как веб-страница), то обычно это сообщение об ошибке отображается в каком-либо окне/сообщении браузера.
Программа веб-сервера может проверить, соответствует ли запрошенный URL-путь: [35]
Если реализована и включена функция авторизации/прав доступа, а доступ к веб-ресурсу не предоставлен, то в зависимости от требуемых прав доступа программа веб-сервера:
Программа веб-сервера может иметь возможность выполнять перенаправления URL-адресов на новые URL-адреса (новые местоположения), что заключается в ответе на запрос клиента ответным сообщением, содержащим новый URL-адрес, подходящий для доступа к действительному или существующему веб-ресурсу (клиент должен повторить запрос с новым URL-адресом). [36]
Используется URL-перенаправление местоположения: [36]
Пример 1: URL-путь указывает на имя каталога , но в нем нет завершающего слеша «/», поэтому веб-сервер отправляет клиенту перенаправление, чтобы дать ему указание повторить запрос с фиксированным именем пути. [31]
От:
/directory1/directory2
Кому:
/directory1/directory2/
Пример 2: целый набор документов был перемещен внутри веб-сайта с целью реорганизации путей их файловой системы.
От:
/directory1/directory2/2021-10-08/
Кому:
/directory1/directory2/2021/10/08/
Пример 3: целый набор документов был перенесен на новый веб-сайт , и теперь для доступа к ним обязательно использовать защищенные HTTPS-соединения.
От:
http://www.example.com/directory1/directory2/2021-10-08/
Кому:
https://docs.example.com/directory1/2021-10-08/
Приведенные выше примеры — лишь некоторые из возможных видов перенаправлений.
Программа веб-сервера способна ответить на действительный запрос клиента сообщением об успешном выполнении, опционально содержащим запрошенные данные веб-ресурса . [37]
Если данные веб-ресурса отправляются обратно клиенту, то это может быть статический или динамический контент в зависимости от того, как он был извлечен (из файла или из вывода какой-либо программы/модуля).
Чтобы ускорить ответы веб-сервера за счет снижения среднего времени ответа HTTP и используемых аппаратных ресурсов, многие популярные веб-серверы реализуют один или несколько кэшей контента , каждый из которых специализируется на определенной категории контента. [38] [39]
Контент обычно кэшируется по месту своего происхождения, например:
Исторически сложилось так, что статическое содержимое файлов , к которым требовался частый, случайный и быстрый доступ, с середины-конца 1960-х/1970-х годов хранилось в основном на электромеханических дисках . К сожалению, операции чтения и записи на такие устройства всегда считались очень медленными по сравнению со скоростью оперативной памяти , поэтому с момента появления первых ОС сначала разрабатывались дисковые кэши, а затем и подсистемы файлового кэша ОС для ускорения операций ввода- вывода часто используемых данных/файлов.
Даже при использовании файлового кэша ОС относительная/периодическая медлительность операций ввода-вывода с каталогами и файлами, хранящимися на дисках, вскоре стала узким местом в повышении производительности, ожидаемой от веб-серверов верхнего уровня, особенно с середины-конца 1990-х годов, когда трафик Интернета начал расти экспоненциально вместе с постоянным увеличением скорости Интернет-/сетевых линий.
Проблема того, как еще более эффективно ускорить обслуживание статических файлов, тем самым увеличив максимальное количество запросов/ответов в секунду (RPS), начала изучаться/исследоваться с середины 1990-х годов с целью предложить полезные модели кэширования, которые можно было бы реализовать в программах веб-серверов. [40]
На практике в настоящее время многие популярные/высокопроизводительные программы веб-серверов включают в себя собственный пользовательский файловый кэш , адаптированный для использования веб-сервером и использующий их конкретную реализацию и параметры. [41] [42] [43]
Широкое распространение RAID и/или быстрых твердотельных накопителей (оборудования для хранения данных с очень высокой скоростью ввода-вывода) несколько снизило, но, конечно, не устранило преимущества наличия файлового кэша, встроенного в веб-сервер.
Динамический контент, выводимый внутренним модулем или внешней программой, не всегда может меняться очень часто (при наличии уникального URL с ключами/параметрами) и поэтому, возможно, на некоторое время (например, от 1 секунды до нескольких часов или более) результирующий вывод может кэшироваться в оперативной памяти или даже на быстром диске . [44]
Типичное использование динамического кэша — когда на веб-сайте есть динамические веб-страницы с новостями, погодой, изображениями, картами и т. д., которые не меняются часто (например, каждые n минут) и к которым обращается огромное количество клиентов в минуту/час; в таких случаях полезно возвращать также кэшированный контент (без вызова внутреннего модуля или внешней программы), поскольку клиенты часто не имеют обновленной копии запрошенного контента в кэшах своих браузеров. [45]
В любом случае, в большинстве случаев такие кэши реализуются внешними серверами (например, обратным прокси-сервером ) или путем хранения динамических выходных данных на отдельных компьютерах, управляемых специальными приложениями (например, memcached ), чтобы не конкурировать за аппаратные ресурсы (ЦП, ОЗУ, диски) с веб-сервером(ами). [46] [47]
Программное обеспечение веб-сервера может быть либо встроено в ОС и выполняться в пространстве ядра , либо выполняться в пространстве пользователя (как и другие обычные приложения).
Веб-серверы, работающие в режиме ядра (обычно называемые веб-серверами пространства ядра ), могут иметь прямой доступ к ресурсам ядра, поэтому они, теоретически, могут быть быстрее, чем те, которые работают в пользовательском режиме. В любом случае, существуют недостатки в работе веб-сервера в режиме ядра, например: трудности в разработке ( отладке ) программного обеспечения, тогда как критические ошибки во время выполнения могут привести к серьезным проблемам в ядре ОС.
Веб-серверы, работающие в пользовательском режиме, должны запрашивать у системы разрешение на использование большего количества памяти или ресурсов ЦП . Эти запросы к ядру не только занимают время, но и не всегда могут быть удовлетворены, поскольку система резервирует ресурсы для собственного использования и несет ответственность за совместное использование аппаратных ресурсов со всеми другими запущенными приложениями. Выполнение в пользовательском режиме также может означать использование большего количества копий буфера/данных (между пользовательским пространством и пространством ядра), что может привести к снижению производительности веб-сервера пользовательского режима.
В настоящее время почти все программное обеспечение веб-сервера выполняется в пользовательском режиме (потому что многие из вышеупомянутых небольших недостатков были преодолены за счет более быстрого оборудования, новых версий ОС, гораздо более быстрых системных вызовов ОС и нового оптимизированного программного обеспечения веб-сервера). См. также сравнение программного обеспечения веб-сервера, чтобы узнать, какое из них работает в режиме ядра или в пользовательском режиме (также называемом пространством ядра или пространством пользователя).
Для улучшения пользовательского опыта (на стороне клиента/браузера) веб-сервер должен быстро (как можно скорее) отвечать на запросы клиентов; если только скорость ответа на контент не ограничена (конфигурацией) для некоторых типов файлов (например, больших или огромных файлов), возвращаемые данные также должны отправляться как можно быстрее (высокая скорость передачи).
Другими словами, веб-сервер всегда должен быть очень отзывчивым , даже при высокой нагрузке веб-трафика, чтобы общее время ожидания ответа пользователем (сумма времени браузера + время сети + время ответа веб-сервера ) было как можно короче .
Для программного обеспечения веб-сервера основными ключевыми показателями производительности (измеренными в различных условиях эксплуатации) обычно являются, по крайней мере, следующие (например): [48]
Среди условий эксплуатации важным параметром является количество (1 .. n ) одновременных клиентских подключений, используемых во время теста, поскольку оно позволяет соотнести уровень параллелизма, поддерживаемый веб-сервером, с результатами тестируемых показателей производительности.
Конкретная принятая конструкция и модель программного обеспечения веб-сервера (например):
... и другие методы программирования , такие как (например):
... используемый для реализации программы веб-сервера, может значительно повлиять на производительность и, в частности, на уровень масштабируемости , который может быть достигнут при большой нагрузке или при использовании высокопроизводительного оборудования (множество процессоров, дисков и большого объема оперативной памяти).
На практике некоторые модели программного обеспечения веб-серверов могут потребовать больше ресурсов ОС (особенно больше ЦП и больше оперативной памяти), чем другие, чтобы работать хорошо и, таким образом, достигать целевых показателей производительности.
Существует множество условий эксплуатации, которые могут повлиять на производительность веб-сервера; значения производительности могут различаться в зависимости от (например):
Производительность веб-сервера обычно оценивается с помощью одного или нескольких доступных инструментов автоматизированного нагрузочного тестирования .
Веб-сервер (программная установка) обычно имеет предопределенные пределы нагрузки для каждой комбинации условий эксплуатации, также потому, что он ограничен ресурсами ОС и потому, что он может обрабатывать только ограниченное количество одновременных клиентских подключений (обычно от 2 до нескольких десятков тысяч для каждого активного процесса веб-сервера, см. также проблему C10k и проблему C10M ).
Когда веб-сервер близок к пределу нагрузки или превышает его, он перегружается и может перестать отвечать .
В любой момент веб-серверы могут быть перегружены по одной или нескольким из следующих причин (например).
Симптомы перегрузки веб-сервера обычно следующие (например).
Чтобы частично преодолеть пределы нагрузки выше среднего и предотвратить перегрузку, большинство популярных веб-сайтов используют распространенные методы, такие как следующие (например).
download.*
) (этот домен может быть также заменен CDN ) от небольших и средних файлов ( static.*
) и от основного динамического сайта (возможно, где часть контента хранится в базе данных бэкэнда ) ( www.*
); идея состоит в том, чтобы иметь возможность эффективно обслуживать большие или огромные (более 10–1000 МБ) файлы (возможно, ограничивая загрузки) и полностью кэшировать небольшие и средние файлы, не влияя на производительность динамического сайта при большой нагрузке, используя различные настройки для каждой (группы) компьютеров веб-сервера, например:https://download.example.com
https://static.example.com
https://www.example.com
Предостережения относительно использования протоколов HTTP/2 и HTTP/3
Даже если более новые протоколы HTTP (2 и 3) обычно генерируют меньше сетевого трафика для каждого запроса/ответа данных, они могут потребовать больше ресурсов ОС (например, ОЗУ и ЦП), используемых программным обеспечением веб-сервера (из-за зашифрованных данных , большого количества потоковых буферов и других деталей реализации); кроме того, HTTP/2 и, возможно, HTTP/3 тоже, в зависимости также от настроек веб-сервера и клиентской программы, могут быть не лучшими вариантами для загрузки данных больших или огромных файлов на очень высокой скорости, поскольку их потоки данных оптимизированы для параллелизма запросов, и поэтому во многих случаях использование соединений HTTP/1.1 TCP/IP может привести к лучшим результатам/более высокой скорости загрузки (ваш опыт может отличаться) . [53] [54]
Ниже приведены последние статистические данные о доле рынка всех сайтов ведущих веб-серверов в Интернете от Netcraft .
ПРИМЕЧАНИЕ: (*) процент округлен до целого числа, поскольку его десятичные значения не публикуются на исходной странице (на графике отображается только округленное значение).
Стандартные интерфейсы шлюза веб-сервера, используемые для динамического содержимого :
Несколько других интерфейсов веб-сервера (зависящих от сервера или языка программирования ), используемых для динамического содержимого:
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка )