Пошук уроків, статей та іншого контенту
З’ясуєте відмінності вебсерверів і серверів застосунків та їхню роль в обробці HTTP-запитів.
Вебсервер — це програмне забезпечення, яке приймає HTTP-запити від клієнтів і повертає HTTP-відповіді.
Клієнтом найчастіше є браузер, але ним також може бути мобільний застосунок, інший сервер або утиліта командного рядка.
Вебсервер зазвичай відповідає за:
приймання HTTP-з’єднань;
пошук і відправлення статичних файлів;
обробку базових HTTP-операцій;
повернення статус-кодів і заголовків;
завершення або передавання запиту іншому сервісу.
Статичний файл не генерується під час кожного запиту. Сервер просто читає його з диска та повертає клієнту.
Приклади:
HTML-файли;
CSS-файли;
JavaScript-файли;
зображення;
шрифти;
відео.
Наприклад, браузер запитує:
GET /images/logo.png HTTP/1.1
Host: example.comВебсервер може знайти файл images/logo.png і повернути його вміст:
HTTP/1.1 200 OK
Content-Type: image/png
Content-Length: 24576Вебсерверу не потрібно виконувати бізнес-логіку, щоб повернути цей файл.
Сервер застосунків — це програмне середовище, у якому працює код застосунку та виконується його бізнес-логіка.
Сервер застосунків може:
перевіряти автентифікацію користувача;
звертатися до бази даних;
обробляти дані форми;
обчислювати результат;
взаємодіяти з іншими сервісами;
формувати динамічну HTTP-відповідь.
Наприклад, клієнт може надіслати запит:
GET /api/products/42 HTTP/1.1
Host: example.comСервер застосунків може:
прочитати ідентифікатор товару 42;
виконати запит до бази даних;
перевірити права доступу;
сформувати JSON-відповідь.
HTTP/1.1 200 OK
Content-Type: application/json{
"id": 42,
"name": "Keyboard",
"price": 49.99
}На відміну від вебсервера, сервер застосунків не просто віддає готовий файл. Він виконує програмний код, щоб отримати результат.
Різницю можна сформулювати так:
вебсервер переважно повертає готовий контент;
сервер застосунків виконує код і створює контент або результат.
Однак це не абсолютно суворий поділ. Сучасні інструменти часто поєднують обидві ролі.
Наприклад, застосунок на Node.js може:
приймати HTTP-запити;
повертати статичні файли;
виконувати бізнес-логіку;
формувати JSON.
Тому важливо розрізняти не лише назву програмного забезпечення, а й його роль у конкретній архітектурі.
Розглянемо типовий сценарій, у якому вебсервер і сервер застосунків працюють разом.
Клієнт
│
│ HTTP-запит
▼
Вебсервер
│
├── статичний файл → відповідь клієнту
│
└── динамічний запит
│
▼
Сервер застосунків
│
├── бізнес-логіка
├── база даних
└── відповідьКлієнт запитує:
GET /styles.css HTTP/1.1Вебсервер:
знаходить файл styles.css;
визначає його тип;
повертає вміст клієнту.
Сервер застосунків у цьому випадку може взагалі не залучатися.
Клієнт запитує:
GET /api/orders HTTP/1.1Вебсервер:
приймає запит;
визначає, що шлях /api/orders належить застосунку;
передає запит серверу застосунків.
Сервер застосунків:
перевіряє користувача;
отримує замовлення з бази даних;
формує JSON;
повертає відповідь вебсерверу.
Вебсервер після цього передає відповідь клієнту.
У цьому прикладі Node.js-програма сама приймає HTTP-запити та виконує роль простого сервера застосунків.
const http = require("node:http");
const server = http.createServer((request, response) => {
if (request.method === "GET" && request.url === "/api/hello") {
const body = JSON.stringify({
message: "Привіт із сервера застосунків"
});
response.writeHead(200, {
"Content-Type": "application/json; charset=utf-8"
});
response.end(body);
return;
}
response.writeHead(404, {
"Content-Type": "application/json; charset=utf-8"
});
response.end(JSON.stringify({
error: "Маршрут не знайдено"
}));
});
server.listen(3000, () => {
console.log("Сервер запущено на http://localhost:3000");
});Збережіть код у файлі server.js і запустіть:
node server.jsПісля цього надішліть запит:
curl http://localhost:3000/api/helloРезультат:
{"message":"Привіт із сервера застосунків"}У прикладі:
http.createServer створює HTTP-сервер;
request.method містить HTTP-метод;
request.url містить шлях запиту;
response.writeHead встановлює статус і заголовки;
response.end відправляє відповідь клієнту.
Цей приклад не використовує окремий вебсервер. Програма Node.js одночасно приймає HTTP-запити та виконує логіку застосунку.
У більшій системі ролі часто розділяють:
Браузер
│
▼
Вебсервер
├── /index.html → статичний файл
├── /app.js → статичний файл
└── /api/users → сервер застосунків
│
▼
База данихТаке розділення має кілька переваг:
статичні файли можна обробляти окремо від бізнес-логіки;
сервер застосунків зосереджується на API та правилах системи;
компоненти можна масштабувати незалежно;
кожен компонент має чіткішу відповідальність.
Наприклад, вебсервер може віддавати файли вебінтерфейсу, а кілька екземплярів сервера застосунків — обробляти API-запити.
Коли вебсервер передає запит серверу застосунків, це називають проксуванням. Вебсервер у такій ролі часто називають зворотним проксі.
Для клієнта це виглядає як один сервер:
Клієнт → вебсерверА всередині системи запит може пройти далі:
Клієнт → вебсервер → сервер застосунківКлієнт зазвичай не повинен знати внутрішню адресу сервера застосунків. Вебсервер приховує цю деталь і передає клієнту готову відповідь.
Важливо: зворотний проксі — це спосіб організації взаємодії між компонентами, а не синонім сервера застосунків.
Потрібно подивитися на характер операції.
запит до файлу з відомим шляхом;
віддавання HTML, CSS, JavaScript або зображення;
відповідь із фіксованим вмістом;
базові помилки на кшталт 404 Not Found.
запит до API;
створення, зміну або видалення даних;
перевірку прав доступу;
роботу з базою даних;
персоналізовану відповідь;
складні правила предметної області.
Наприклад, файл logo.png можна віддати без виконання бізнес-логіки. А запит «покажи замовлення поточного користувача» потребує логіки застосунку та, ймовірно, звернення до бази даних.
Обидва компоненти працюють із HTTP-відповідями. Відповідь має:
статус-код;
заголовки;
тіло, якщо воно потрібне.
Поширені статус-коди:
200 OK — запит успішно оброблено;
201 Created — створено новий ресурс;
400 Bad Request — некоректний запит;
401 Unauthorized — потрібна автентифікація;
403 Forbidden — доступ заборонено;
404 Not Found — ресурс або маршрут не знайдено;
500 Internal Server Error — помилка на сервері.
Вебсервер може повернути 404, якщо не знайшов статичний файл або маршрут. Сервер застосунків може повернути 404, якщо потрібний ресурс не знайдено в базі даних.
Однаковий статус-код може виникнути в різних компонентах, тому для діагностики важливо знати шлях запиту через систему.
Вебсервери можуть виконувати й інші функції: приймати з’єднання, проксувати запити та повертати помилки.
Статичні файли — це лише найпростіший і найтиповіший сценарій.
У деяких технологіях вебсервер і сервер застосунків — різні компоненти. В інших одна програма виконує обидві ролі.
Наприклад, програма на Node.js може самостійно приймати HTTP-запити та виконувати код застосунку.
Сервер застосунків містить або виконує логіку програми. База даних зберігає та опрацьовує дані.
Типовий шлях запиту може мати такий вигляд:
Клієнт → вебсервер → сервер застосунків → база данихБаза даних не є заміною серверу застосунків: вона не повинна сама відповідати за маршрутизацію HTTP-запитів і правила роботи інтерфейсу.
Це залежить від архітектури. Можливі обидва варіанти:
Клієнт → одна програмаабо:
Клієнт → вебсервер → сервер застосунківПотрібно дивитися на фактичну структуру конкретної системи.
Вебсервер приймає HTTP-запити та часто повертає статичні файли.
Сервер застосунків виконує код, бізнес-логіку та формує динамічні відповіді.
Вебсервер може передавати динамічні запити серверу застосунків.
Застосунок може самостійно виконувати роль вебсервера і сервера застосунків.
Статичний файл зазвичай можна повернути без звернення до бази даних.
Запит до API часто потребує сервера застосунків і додаткової логіки.
Межа між ролями залежить від конкретної архітектури, але їхнє розділення допомагає краще організувати систему.