Как ранее обсуждалось на курсе фронтенд-разработки, сейчас документный обмен через сеть Интернет преимущественно с помощью веб-технологий
Так браузер на компьютере клиента, используя URL, посылает запрос по HTTP-протоколу на сервер, который отвечает набором файлов, которые задает веб-страницу с помощью языков HTML, CSS и JavaScript
Все ресурсы веб-сайтов делятся на два типа:
Работа веб-сети основана на пяти ключевых стандартах:
Протокол HTTP (HyperText Transfer Protocol, Протокол передачи гипертекста) является ключевым участником взаимодействия всех участников веб-сети
Протокол HTTP:
Веб-серверы ещё называют HTTP-серверами, браузеры - HTTP-клиентами, но клиентами могут быть и другие программы: прокси-серверы, поисковые агенты и тому подобное
HTTP работает по принципу запрос-ответ (Request-Response): клиент отправляет запрос, сервер возвращает ответ
HTTP-запрос имеет такую структуру:
МЕТОД /[имя-ресурса][?параметры-запроса] HTTP/номер-версии
Имя-заголовка-1: значение
Имя-заголовка-2: значение
[тело запроса, может отсутствовать]
Здесь:
МЕТОД - один из поддерживаемых методов. Всего есть 8 методов с разным назначением:
| Метод | Назначение |
|---|---|
GET |
Получение ресурса. Не имеет тела, а параметры передаются в строке URL |
POST |
Отправка данных на сервер, такой метод имеет тело запроса |
PUT |
Полное обновление существующего ресурса |
DELETE |
Удаление ресурса |
HEAD |
Аналог GET, но без тела ответа - только заголовки |
OPTIONS |
Запрос информации о доступных методах для ресурса |
TRACE |
Диагностика пути запроса |
CONNECT |
Установка туннеля к серверу |
Метод GET - cамый простой и распространённый метод, использующийся при вводе URL в адресную строку и переходе по ссылке. Метод не имеет тела - данные передаются в строке запроса, например:
GET /search?query=http&lang=ru HTTP/1.1
Host: example.com
Другой распространенный метод POST используется для отправки форм и создания ресурсов. Метод имеет тело запроса - данные передаются внутри сообщения, а не в URL:
POST /q HTTP/1.1
Host: finance.yahoo.com
User-Agent: Mozilla/4.75
Content-Type: application/json
Content-Length: 16
{"key": "value"}
/имя-ресурса - путь к запрашиваемому ресурсу на сервере[?параметры-запроса] - параметры запросы, хранящиеся в URL, например, https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1 – здесь три параметра v, list и start_radioномер-версии - версия протокола (1.0, 1.1 или 2.0)Имя-заголовка-1: значение - заголовокПример запроса (здесь разрывы строки обозначены \r\n):
GET / HTTP/1.1\r\n
Host: httpforever.com\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: ru\r\n
\r\n
Запрос пишется в текстовом формате, причем конец блока заголовков обозначается последовательностью \r\n\r\n. Запрос также содержит информацию о клиенте - его операционную систему (здесь это 64-битная Windows 10/11), его браузер (здесь это Microsoft Edge на базе Chromium), движок рендера (здесь это AppleWebKit), и принимаемые кодировки (например, можно заархивировать контент), форматы документов и язык контента
Некоторые строки пишутся для соблюдения совместимости. Например, Mozilla/5.0 отправляется потому, что серверы отдавали расширенный контент только браузерам Mozilla
HTTP-ответ выглядит так:
HTTP/1.1 200 OK\r\n
Server: nginx/1.18.0 (Ubuntu)\r\n
Date: Sun, 08 Mar 2026 15:13:19 GMT\r\n
Content-Type: text/html\r\n
Last-Modified: Wed, 22 Mar 2023 14:54:48 GMT\r\n
Transfer-Encoding: chunked\r\n
Connection: keep-alive\r\n
ETag: W/"641b16b8-1404"\r\n
Referrer-Policy: strict-origin-when-cross-origin\r\n
X-Content-Type-Options: nosniff\r\n
Feature-Policy: accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none'\r\n
Content-Security-Policy: default-src 'self'; script-src cdnjs.cloudflare.com 'self' 'report-sha256'; style-src cdnjs.cloudflare.com 'self' fonts.googleapis.com 'unsafe-inline'; font-src fonts.googleapis.com fonts.gstatic.com cdnjs.cloudflare.com; frame-ancestors 'none'; report-uri https://scotthelme.report-uri.com/r/d/csp/enforce
Content-Encoding: gzip\r\n
\r\n
[[HTML-документ]]
Здесь содержится информация о типе контента, сервере (nginx/1.18.0 (Ubuntu)), нужных для сайту разрешений браузера (например, геолокация - geolocation 'none')
Первая строка HTTP-ответа содержит трёхзначный код состояния, который сообщает клиенту о результате обработки запроса. Коды делятся на пять категорий:
1xx - информационные
Используются в поясняющих целях, не сообщают об успехе/неуспехе. Чаще всего встречаются при обновлении протокола (например, при подключении веб-сокета)
2xx - успешная обработка
Самые популярные из категории:
200 OK - запрос успешно выполнен, ресурс отправлен клиенту201 Created - запрос успешно выполнен, на сервере создан новый ресурс (для методов PUT/POST)204 No Content - запрос выполнен, но тело ответа отсутствует3xx - перенаправление
Клиенту нужно выполнить дополнительные действия (обычно - повторить запрос по другому URL)
301 Moved Permanently - ресурс перемещён постоянно на новый адрес302 Found - временное перенаправление303 See Other - ресурс доступен по другому URI методом GET304 Not Modified - ресурс не изменился с последнего запроса (то есть кэш актуален)307 Temporary Redirect - ресурс временно перемещён4xx - ошибки клиента
400 Bad Request - запрос неправильно сформирован401 Unauthorized - требуется аутентификация (нужен заголовок Authorization)403 Forbidden - доступ к ресурсу запрещён404 Not Found - ресурс не найден на сервере5xx - ошибки сервера
500 Internal Server Error - внутренняя ошибка сервера501 Not Implemented - сервер не поддерживает запрашиваемый метод505 HTTP Version Not Supported - версия протокола не поддерживается серверомПомимо информации в URL и теле запроса также есть заголовки - метаданные HTTP-сообщений. Они позволяют управлять сессиями, кэшированием, аутентификацией и авторизацией. Заголовки делятся на четыре группы:
Общие заголовки. Могут использоваться как в запросах, так и в ответах. Примером может быть заголовок Connection, у которого есть два значение: keep-alive - сохранить соединение (используется по умолчанию в HTTP/1.1), и close - закрыть соединение (поведение по умолчанию в HTTP/1.0)
Заголовки запроса. Клиент передаёт дополнительную информацию о себе и о запросе. Примеры:
| Заголовок | Описание |
|---|---|
Host |
Указывает, какой сайт запрашивается (нужен для виртуального хостинга) |
User-Agent |
Описывает программу, отправившую запрос (браузер, версия ОС) |
Referer |
URL страницы, с которой пришёл запрос |
Authorization |
Данные авторизации (имя/пароль). Отправляется после ответа 401 |
Заголовки ответа. Сервер передаёт дополнительную информацию об ответе. Например:
| Заголовок | Описание |
|---|---|
Server |
Информация о веб-сервере (необязательный) |
Location |
URL для перенаправления. Используется с кодами 301, 302, 303, 307 |
WWW-Authenticate |
Задаётся вместе с кодом 401. Браузер запрашивает у пользователя логин/пароль |
Заголовки содержания. Описывают тело сообщения - тип данных, длину, кодировку и так далее
Для работы веб-приложения нужен веб-сервер - серверная программа, работающая в фоновом режиме, которая принимает HTTP-запросы от клиентов и возвращает HTTP-ответы (обычно HTML-документы)
Современные веб-серверы состоят из модулей, каждый из которых отвечает за свою задачу:
Важно, что HTTP не поддерживает состояние сеанса. Вся информация о запросе содержится только в самом запросе (заголовках и теле)
Веб-сервер, как программе, нужно оборудование, на котором он будет работать. В качестве такого оборудования, где веб-сервер может хоститься (от host) могут выступать:
Выделенный сервер (Dedicated server) - физический сервер в полном единоличном использовании. Для простеньких проектов выделенным сервером может быть старый ноутбук или одноплатный компьютер, например, Raspberry Pi
К нему есть полный доступ управления, но выделенный сервер имеет высокую стоимость и требует навыков для правильной настройки, чтобы соблюсти надежность и безопасность
Виртуальный приватный сервер (Virtual Private Server, VPS) - виртуальный сервер с выделенными ресурсами
Виртуальный приватный сервер - это оборудование, доступ к которому осуществляется через операционную систему с помощью виртуализации или контейнеризации
У виртуального приватного сервера есть выделенные ресурсы (то есть соседние процессы не влияют на производительность), полный доступ в качестве суперпользователя, высокая гибкость настройки, однако такое решение все еще требует квалификации для настройки и поддержки
Разделенный сервер (Shared Hosting): несколько клиентов используют один физический сервер совместно
Самое дешёвое решение, часто идут бесплатные домены, не требует технических знаний, но сильные ограничения - нельзя настраивать порты и выбирать нестандартные решения
Управляемый сервер (Managed Hosting): провайдер предоставляет конкретное веб-приложение с административным доступом, но управление сервером остается за провайдером. Примером управляемого сервера может быть сервис Tilda
Здесь не нужно разбираться в сервере, но сервер ограничен только возможностями конкретного приложения
Провайдеры, специфичные для приложений (App-specific providers) - платформы для разработчиков с готовыми компонентами (такими как базы данных, репозитории, деплой, мониторинг). Примеры: Google AppEngine, Heroku, Render, VMware Pivotal Cloud Foundry
У таких платформ нижний порог входа по сравнению с VPS, есть автоматизация многих процессов, но функционал ограничен функциями платформы, а при росте приложения может стать дорого и тяжело мигрировать
Рассмотрим платформу Render, основанную в 2018 году. Render позиционируется как современная замена Heroku и поддерживает Node.js, Python, Go, Ruby, Java, PHP и другие языки
Render используется для:
Приложения запускаются в изолированных контейнерах, при этом одно приложение может использоваться несколькими контейнерами, что обеспечивает лёгкое масштабирование