Веб-сервер — это программное обеспечение, которое обрабатывает и отвечает на HTTP/HTTPS-запросы. Его основная задача — предоставлять посетителям страницы сайта. Если вам нужно разместить свой сайт в интернете, в большинстве случаев для этого понадобится веб-сервер.
Например, когда вы заходите на https://hostiq.ua, вы сначала вводите URL-адрес, который запускает запрос через интернет. Этот запрос проходит несколько уровней, один из которых как раз веб-сервер. Он формирует ответ на запрос, который в нашем примере будет главной страницей HOSTiQ. При этом всё это обычно происходит за несколько секунд и работает 24/7.
Хотя для посетителя главная страница HOSTiQ воспринимается как одно целое, на самом деле это комбинация из множества ресурсов. Веб-сервер выступает посредником между внутренней частью программы (бекендом) и внешней (фронтендом), предоставляя все необходимые файлы браузеру, чтобы он мог собрать из них страницу.
В этой статье постараемся простыми словами ответить на базовые вопросы про веб-серверы: что они умеют делать, какие задачи решают и чем отличаются друг от друга.
Зачем нужен веб-сервер
Веб-сервер нужен, чтобы обрабатывать HTTP и HTTPS-запросы от пользователей или ботов, которые хотят взаимодействовать с сайтом/приложением. Из-за этого веб-сервер также иногда называют HTTP-сервер. На практике он понадобится, если вы хотите создать сайт или разработать приложение с подключением к интернету.
Основные задачи, которые выполняет веб-сервер:
- Предоставлять HTML, CSS и JavaScript файлы, изображения и видео.
- Обрабатывать пользовательские запросы (часто одновременно несколько).
- Обрабатывать сообщения об ошибках HTTP.
- Сопоставлять и преобразовывать URL-адреса.
- Генерировать и обслуживать динамический контент.
- Сжимать данные для оптимизации скорости загрузки.
- Управлять кэшированием статического контента в браузере.
Этот список далеко не исчерпывающий, но поможет понять, какие функции веб-сервер выполняет в своей работе.
Основные цели веб-сервера
От веб-сервера ожидают высокую скорость работы, доступность, надёжность и другие качества. Хороший веб-сервер будет объединять в себе такие аспекты:
- Доступность. Речь про время, в течение которого веб-сервер функционирует. Сайты всегда должны быть в онлайне, за исключением периода планового обслуживания. Высокая стабильность и предсказуемость критически важны: страница должна загружаться при каждом запросе. Баги или случайные сбои ухудшают пользовательский опыт.
- Скорость. Страницы должны загружаться как можно быстрее. Посетители должны получать ответ на запрос быстро, иначе есть риск их потерять. Каждая медленная загрузка, даже если посетитель уже подождал пару раз, будет экспоненциально снижать желание оставаться на сайте, как и желание зайти на него снова.
- Многозадачность. Речь про способность веб-сервера обрабатывать много запросов одновременно. Кажется, что много посетителей это классно, но это также может сильно замедлить работу сайта или вообще привести к перегрузке сервера. Тут важно, чтобы веб-сервер эффективно использовал ограниченные ресурсы физического сервера (оперативную память, мощность процессора).
- Масштабируемость. У вас должна быть возможность легко увеличить мощность текущего сервера (вертикальная масштабируемость), либо добавить новые серверы (горизонтальная масштабируемость). По мере развития вашего проекта изначальных ресурсов может стать недостаточно.
- Простота настройки. Возможность легко и быстро развернуть проект на сервере важна для его развития. Поэтому процесс установки веб-сервера должен быть простым, стандартизированным и удобным для последующего масштабирования.
- Документация. Веб-серверы это сложно. Стандартные сборки можно установить без особых усилий, но со временем потребности гарантированно вырастут. Может быть такое, что вам понадобится функционал, который используют нечасто. И когда это время придёт, очень важно, чтобы была качественная документация, которая поможет во всём разобраться.
- Поддержка разработчиков. Если разработчики не развивают свой проект, на него не стоит полагаться. Важно, чтобы у них был как долгосрочный план развития, так и возможность быстро реагировать на сиюминутные проблемы, исправлять баги, выпускать обновления.
- Сообщество. Команда разработчиков сделает всю основную работу, но активные пользователи тоже важны. Они могут помочь найти ответы на второстепенные или неочевидные вопросы, а в проектах с открытым кодом могут даже вносить вклад в кодовую базу.
Отличия между веб-серверами
Два самых популярных веб-сервера с открытым кодом — это Apache и Nginx. Apache появился раньше, в период, когда на одном веб-сервере часто размещали по несколько сайтов с индивидуальными конфигурационными файлами. Nginx появился, когда фокус сместился в сторону обслуживания одного сайта на одном сервере с целью повысить эффективность при высоких нагрузках.
Хотя у всех веб-серверов похожие цели и задачи, способы их решения отличаются. Ниже вы найдёте основные различия в работе веб-серверов на примере Apache и Nginx.
Структура конфигурационных файлов
Веб-серверы хранят свои настройки в конфигурационных файлах. Их можно редактировать, чтобы менять поведение веб-сервера. Способы хранения и организации этих файлов зависят от подхода разработчиков и являются одной из особенностей, которые отличают веб-серверы друг от друга.
Основное различие состоит в централизованной и децентрализованной конфигурации:
- Децентрализованные конфигурационные файлы позволяют тонко управлять настройками на уровне файловой системы, что изначально было необходимо для размещения нескольких сайтов на одном сервере. Они используют привязку к структуре директорий веб-сервера.
- Централизованные конфигурации не ориентированы на обслуживание множества сайтов на одном сервере, а сосредоточены на эффективной работе одного сайта. Они используют сопоставление URI-шаблонов, при котором URL связываются с именами файлов или другими уникальными идентификаторами.
Apache обеспечивают децентрализованную конфигурацию, позволяя управлять настройками на уровне файловой системы с высокой уровнем контроля. Вся архитектура Apache выстроена вокруг этого подхода.
Nginx, в отличие от этого, не ориентирован на файловую систему. Он фокусируется на сопоставлении URI-шаблонов и использует централизованную конфигурацию.
Обработка большого количества запросов
Физические машины, на которых работают веб-серверы, имеют ограниченные ресурсы, такие как оперативная память или процессорная мощность. То, как веб-сервер управляет запросами, влияет на эффективное использование этих ресурсов. Один запрос может создавать отдельный процесс для обработки, или его можно обрабатывать на основе событий.
Apache обрабатывает запросы, создавая процессы для каждого запроса, что расходует ресурсы и может стать проблемой при высокой нагрузке.
Nginx использует событийно-ориентированную систему обработки, которая расходует меньше ресурсов и может работать быстрее при высокой нагрузке.
Обслуживание статического контента
Помимо страниц, веб-серверы получают запросы на другие ресурсы, такие как видео, изображения, CSS и JavaScript файлы. Эти ресурсы называют статическим контентом, потому что они всегда одинаковые, независимо от того, кто их запрашивает.
Часто страница представляет собой просто HTML-файл, который тоже не меняется в зависимости от запроса пользователя, и поэтому тоже считается статическим контентом. Веб-серверы могут также сжимать этот контент для более быстрой передачи.
Nginx хорошо справляется с обслуживанием статического контента благодаря своей событийно-ориентированной обработке запросов.
Apache тоже может обслуживать статический контент, но в большинстве случаев не так быстро и эффективно при высокой нагрузке, как Nginx.
Обслуживание динамического контента
Когда контент меняется, обрабатывается и настраивается в зависимости от того, кто его запрашивает, такой контент называется динамическим. Например, после входа на сайт, он может динамически отображать ваше имя пользователя в верхней панели навигации.
Динамический контент представляет дополнительную сложность, поскольку веб-сервер должен обрабатывать каждый запрос индивидуально при его получении. Такой контент нельзя кэшировать и обслуживать всем одинаково.
Обработка динамического контента на сервере позволяет избежать лишнего уровня абстракции, который обычно возник бы при передаче запроса внешней библиотеке.
Apache изначально поддерживает обработку динамического контента, например, в таких популярных решениях как стек LAMP (Linux, Apache, MySQL, PHP).
Nginx более нейтрален к языкам программирования, но требует использование внешних библиотек, таких как PHP-FPM, чтобы предоставить решение, аналогичное стеку LAMP.
Работа в качестве обратного прокси
Обратный прокси-сервер находится перед традиционным веб-сервером, получает весь HTTP-трафик первым, а потом перенаправляет на веб-сервер или веб-серверы за собой. По сути это что-то вроде консьержа между веб-серверами и интернетом. Для большей безопасности обратный прокси часто также взаимодействует с фаерволом.
Хотя работать как обратный прокси может большинство веб-серверов, Nginx изначально был создан и оптимизирован для этого. На практике его как раз чаще всего используют в этой роли из-за высокой эффективности.
Несколько обычных веб-серверов размещают за обратным прокси Nginx, а он определяет, на какой из них отправить запрос, основываясь на нагрузке или настроенных правилах. Это позволяет использовать Nginx в паре с Apache, где первый может быть обратным прокси, а второй — традиционным веб-сервером.
Экосистема поддержки
Nginx и Apache оба имеют сильную поддержку со стороны своих команд разработчиков и простых пользователей. Поскольку это самые популярные веб-серверы с открытым кодом, есть много обучающих ресурсов по работе с ними.
Apache развивает некоммерческая организация Apache, пока он всегда был доступен бесплатно. Nginx тоже бесплатный, но некоторые востребованные функции, такие как проверки состояния upstream-серверов, сохранение сессий и расширенный мониторинг, доступны только в платной версии Nginx Plus.
Что дальше
В этой статье мы постарались простыми словами объяснить, что такое веб-серверы, как они используются и какие задачи решают. Надеемся, это получилось и эта технология стала для вас немного понятнее.