Коли браузер відкриває сайт, запит спершу потрапляє не на сам сайт, а на вебсервер — програму, яка приймає вхідні з'єднання, вирішує, що з ними робити, і віддає готову відповідь. Ця стаття пояснює, що таке вебсервер, чим відрізняються поширені реалізації і як він пов'язаний з рештою стеку сайту. Розуміння цієї ролі допомагає швидше знаходити причину проблем, коли сайт відповідає помилкою або довго не завантажується.
Що відбувається, коли ви відкриваєте сайт
За частки секунди між введенням адреси і появою сторінки відбувається декілька кроків.
- Браузер знаходить IP-адресу сервера за доменним іменем через DNS.
- Браузер відкриває TCP-з'єднання із сервером на порту 80 або 443.
- Вебсервер приймає запит і вирішує, який файл віддати чи який обробник викликати.
- Сервер формує відповідь і надсилає її назад браузеру, який відмальовує сторінку.
Вебсервер як програма: що він робить
Вебсервер — це програма, яка слухає мережевий порт, приймає HTTP-запити і за заданими правилами повертає вміст: статичний файл, результат роботи іншої програми чи помилку, якщо запитаного ресурсу немає. Окрім самої роздачі файлів, вебсервер зазвичай відповідає за стиснення відповідей, кешування статики, обмеження швидкості і перенаправлення запитів на потрібний обробник. Ці функції можна вмикати і налаштовувати окремо, не змінюючи код самого сайту.
Поширені вебсервери та їхні відмінності
Перевірити стан встановленого вебсервера і коректність його конфігурації можна стандартними командами.
systemctl status nginx
nginx -t
Різні вебсервери по-різному обробляють одночасні з'єднання: одні використовують по потоку на кожне з'єднання, інші — подієву модель з невеликою кількістю робочих процесів. Порядок встановлення і базового налаштування одного з найпоширеніших вебсерверів описано у статті налаштування nginx. Вибір конкретної реалізації рідко критичний для невеликого сайту, але стає важливим при зростанні навантаження.
Вебсервер і решта стеку: куди він передає запити
Вебсервер рідко працює повністю наодинці, і саме це розділення обов'язків дозволяє кожній частині стеку робити тільки свою власну роботу. Запити до статичних файлів він зазвичай віддає сам, а запити, що потребують виконання коду сайту, передає далі — інтерпретатору PHP, серверу застосунків чи базі даних, і вже їхню відповідь повертає браузеру. Як зібрати типовий стек із вебсервера, обробника PHP і бази даних на одному сервері, описано у статті встановлення LEMP.
Порівняння підходів до обробки з'єднань
| Підхід | Як обробляються з'єднання | Сильна сторона |
|---|---|---|
| Процес на з'єднання | Окремий процес чи потік на кожне з'єднання | Проста модель обробки запитів |
| Подієва модель | Невелика кількість процесів обслуговує багато з'єднань | Економія пам'яті при високому навантаженні |
| Зворотний проксі | Сервер передає запит іншому обробнику | Розділення статики і динаміки |
| Вбудоване кешування | Повторні запити віддаються з кешу без звернення до бекенду | Зниження навантаження на застосунок |
На практиці вебсервер зазвичай поєднує декілька підходів одразу: кешує статику, водночас працює як зворотний проксі і обробляє з'єднання за подієвою моделлю.
Що робити: як обрати і налаштувати вебсервер
- Визначте тип навантаження: багато статики, багато динамічних запитів чи змішаний профіль.
- Оберіть вебсервер із придатною моделлю обробки з'єднань під це навантаження.
- Налаштуйте передавання динамічних запитів на обробник застосунку і кешування статики.
- Перевірте конфігурацію на синтаксичні помилки перед застосуванням на бойовому сервері.
- Якщо поточний вебсервер не справляється з навантаженням, розгляньте перехід на інший — порядок міграції описано у статті міграція з Apache на nginx.
Такий порядок дій підходить і для нового проєкту, і для сайту, який уже працює і почав помітно повільніше відповідати під навантаженням.
Часті питання
Чим вебсервер відрізняється від хостингу?
Хостинг — це місце і обладнання, де розміщено сайт, а вебсервер — програма на цьому обладнанні, яка безпосередньо приймає запити браузера і віддає відповіді.
Чи можна використовувати декілька вебсерверів для одного сайту?
Так, часто один вебсервер працює як зворотний проксі перед іншим: наприклад, приймає усі зовнішні з'єднання і розподіляє їх між внутрішніми серверами застосунку.
Чи потрібен вебсервер для статичного сайту без динаміки?
Так, навіть сайту зі звичайних HTML-файлів потрібна програма, яка слухає порт і віддає ці файли браузеру за запитом — це і є вебсервер.