Веб-сервер — це програмне забезпечення, яке обробляє та відповідає на HTTP/HTTPS-запити. Його основне завдання — надавати відвідувачам сторінки сайту. Якщо вам потрібно розмістити свій сайт в інтернеті, в більшості випадків для цього знадобиться веб-сервер.

Наприклад, коли ви заходите на https://hostiq.ua, ви спочатку вводите URL-адресу, яка запускає запит через інтернет. Цей запит проходить кілька рівнів, один із яких якраз веб-сервер. Він формує відповідь на запит, який у нашому прикладі буде головною сторінкою HOSTiQ. При цьому все це відбувається за кілька секунд і працює 24/7.

Хоча для відвідувача головна сторінка HOSTiQ сприймається як одне ціле, насправді це комбінація з великої кількості ресурсів. Веб-сервер виступає посередником між внутрішньою частиною програми (бекендом) та зовнішньою (фронтендом), надаючи всі необхідні файли браузеру, щоб він міг зібрати з них сторінку.

У цій статті спробуємо простими словами відповісти на базові питання про веб-сервери: що вони вміють робити, які мають цілі та чим відрізняються один від одного.

Навіщо потрібен веб-сервер

Веб-сервер потрібен, щоб обробляти HTTP та HTTPS-запити від користувачів або ботів, які хочуть взаємодіяти з сайтом/додатком. Через це веб-сервер також називають HTTP-сервер. На практиці він знадобиться, якщо ви хочете створити сайт або розробити програму з підключенням до Інтернету.

Основні завдання, які виконує веб-сервер:

  • Надавати HTML, CSS та JavaScript файли, зображення та відео.
  • Обробляти запити користувача (часто одночасно кілька).
  • Обробляти повідомлення про помилки HTTP.
  • Порівнювати та перетворювати URL-адреси.
  • Генерувати та обслуговувати динамічний контент.
  • Стискати дані для оптимізації швидкості завантаження.
  • Керувати кешуванням статичного контенту у браузері.

Цей список не вичерпний, але допоможе зрозуміти, які функції веб-сервер виконує у своїй роботі.

Основні цілі веб-сервера

Від веб-сервера очікують високу швидкість роботи, доступність, надійність та інші якості. Хороший веб-сервер буде об’єднувати такі аспекти:

  • Доступність. Йдеться про час, протягом якого веб-сервер працює. Сайти повинні бути в онлайні 24/7, за винятком періоду планового обслуговування. Така висока стабільність і передбачуваність є критично важливими, тому що баги або випадкові збої погіршують користувальницький досвід.
  • Швидкість. Сторінки повинні завантажуватися якомога швидше. Відвідувачі повинні отримувати відповідь на запит швидко, інакше є ризик їх втратити. Кожне повільне завантаження, навіть якщо відвідувач уже зачекав кілька разів, буде експоненційно знижувати бажання залишитися на сайті, як і бажання зайти на нього знову.
  • Багатозадачність. Йдеться про можливість веб-сервера обробляти багато запитів одночасно. Здається, багато відвідувачів це класно, але це також може сильно уповільнити роботу сайту або взагалі призвести до перевантаження сервера. Тут важливо, щоб веб-сервер ефективно використовував обмежені ресурси фізичного сервера (оперативну пам’ять, потужність процесора).
  • Масштабованість. У вас має бути можливість легко збільшити потужність поточного сервера (вертикальна масштабованість) або додати нові сервери (горизонтальна масштабованість). З розвитком вашого проекту початкових ресурсів може стати недостатньо.
  • Простота налаштування. Можливість легко і швидко розгорнути проект на сервері є важливою для його розвитку. Тому процес встановлення веб-сервера повинен бути простим, стандартизованим та зручним для подальшого масштабування.
  • Документація. Веб-сервери це складно. Стандартні зборки можна встановити без особливих зусиль, але згодом потреби гарантовано зростуть. Можливо, вам знадобиться функціонал, який використовують нечасто. І коли цей час прийде, дуже важливо, щоби була якісна документація, яка допоможе у всьому розібратися.
  • Підтримка розробників. Якщо розробники не розвивають свій проект, на нього не варто покладатися. Важливо, щоб вони мали як довгостроковий план розвитку, так і можливість швидко реагувати на поточні проблеми, виправляти баги, випускати оновлення.
  • Спільнота. Команда розробників зробить всю основну роботу, але активні користувачі також важливі. Вони можуть допомогти знайти відповіді на другорядні або неочевидні питання, а в проектах з відкритим кодом можуть навіть робити вклад у кодову базу.

Відмінності між веб-серверами

Два найпопулярніші веб-сервери з відкритим кодом — це 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.

Що далі

У цій статті ми постаралися простими словами пояснити, що таке веб-сервери, як вони використовуються та які завдання вирішують. Сподіваємося, це вийшло і ця технологія стала для вас трохи зрозумілішою.

Чи була ця стаття корисною?

Дякуємо за відгук!