# Сервер

## Що це таке

Сервер — це програма, яка чекає, поки інші програми звернуться до неї через
мережу, а потім відповідає на те, про що вони питають. Повніше його називають
_мережевим сервером_, а в повсякденній мові це слово означає і саму програму, і
комп'ютер, на якому вона працює. Програма на іншому кінці кожного обміну —
клієнт: браузер, застосунок на телефоні, скрипт, поштова програма або інший
сервер, у якого є власне запитання.

Стандарти, на яких тримається веб, ставлять на перше місце роль. RFC 9110, що
визначає HTTP, називає HTTP-сервером програму, яка приймає з'єднання, щоб
обслуговувати запити, надсилаючи відповіді, і додає, що слова «клієнт» і
«сервер» стосуються лише ролей, які програми виконують у конкретному з'єднанні.
Та сама програма може обслуговувати в одному з'єднанні й питати в наступному.
Вебсервер, який передає запит застосунку позаду себе, на цьому другому відрізку
є клієнтом того застосунку.

В основі більшості серверів лежить один крок, який TCP називає пасивним
відкриттям. Програма повідомляє операційній системі, що готова приймати вхідні
з'єднання — на одній локальній адресі або на будь-якій із них, — і чекає. Клієнт
виконує активне відкриття до цієї адреси й порту. Поки ніхто не під'єднаний,
сервер майже нічого помітного не робить.

Сервери відрізняються тим, як вони чекають. Багато з них працюють місяцями
поспіль і тримають свою пам'ять, байдуже, заходить хтось чи ні. Інші
запускаються наново для кожного з'єднання: чекає програма-наглядач, вона
запускає копію сервера для кожного відвідувача, а копія завершується, коли
відвідувач іде.

Далі — машина. Глосарій NIST описує сервер як комп'ютер або пристрій у мережі,
що керує мережевими ресурсами, і як приклади наводить файлові сервери, сервери
друку, мережеві сервери та сервери баз даних. Коли компанія каже, що її сайт
працює на одному невеликому сервері, вона має на увазі комп'ютер, відведений під
серверні програми, сьогодні здебільшого віртуальну машину, орендовану в
провайдера. Цей глосарій тримає між двома словами чітку межу. Сервер — це те, що
відповідає. Машина як річ з іменем та адресою, яку створюють, захищають і
враховують, — це хост. Один хост може тримати багато серверів, а сервер може
переїхати на інший хост, якщо разом із ним переїде його ім'я.

Види, з якими стикається більшість людей, названо за тим, що вони обслуговують:
вебсервери для HTTP, поштові сервери для SMTP та IMAP, DNS-сервери для імен,
сервери баз даних для запитів, файлові сервери, git-сервери та ігрові сервери.
Сервер застосунків зазвичай стоїть позаду вебсервера й виконує власний код
продукту.

## Чому це важливо

На все, до чого відвідувач доходить в інтернеті, відповідає якийсь сервер, тож
вибір серверів — це вибір того, що відкрито назовні, скільки це коштує і що
падає разом.

Коли слово вперше з'являється в розмові про бюджет, спершу варто з'ясувати, яке
з його значень мають на увазі. «Нам потрібен сервер» може означати програму, яку
треба встановити, машину, яку треба орендувати, керований сервіс, який
обслуговує хтось інший, або більше потужності на машині, за яку вже заплачено.
Ці варіанти різняться ціною, тим, хто встановлює оновлення безпеки, і тим, кого
будять уночі, коли один із них зупиняється.

Друге — вартість, і більша частина вартості сервера — це його очікування.
Програма, яка тримає пам'ять у простої, тримає її цілодобово, тож на невеликій
машині кожен постійно запущений сервер — окремий рядок у бюджеті. Сервер, який
запускається для кожного з'єднання, платить трохи часу за кожен візит, а між
візитами не тримає нічого.

Третє — відкритість назовні. Кожен сервер, що слухає, приймає вхідні дані від
незнайомців, а отже його треба вчасно оновлювати, свідомо налаштовувати й
стежити за ним. Тримати стільки серверів, скільки справді потрібно для роботи, і
не більше, — це рішення про безпеку не меншою мірою, ніж про економію.

Четверте — роль можна купити, а не виконувати самим. Керована база даних,
поштова скринька в хостингу чи мережа доставки контенту — це сервер, який
обслуговує інша компанія. Обмін такий: контроль і видимість натомість менше
того, що треба оновлювати, і невелика компанія цілком може тримати власний
вебсервер, а пошту орендувати.

## Як це виглядає на практиці

Усі сервери цього сайту вміщуються на одній машині, і сторінка подяк
[називає кожну серверну програму на ній](/uk/credits/). Caddy відповідає на
кожен вебзапит і сам оновлює HTTPS-сертифікат. Agate та Gophernicus відповідають
за Gemini й Gopher, Tor — за onion-адресу, а Soft Serve — це git-сервер. Усі
чотири публічні копії сайту читають ту саму теку з файлами, тож одне розгортання
оновлює їх усі. Onion-сервіс показує, що обслуговувати й слухати — різні речі:
сторінка називає його єдиним входом, який можна було додати, не відкриваючи
порту, бо tor сам відкриває вихідні з'єднання до introduction points, і відкриті
порти машини лишилися такими самими, як були. Пошта, за словами тієї ж сторінки,
працює в стороннього сервісу, тобто цю роль купили, а не виконують самі.

Сторінка про конфіденційність показує сервер, що запускається для кожного
з'єднання, з боку, з якого на нього рідко дивляться.
[Копію в Gopher операційна система запускає наново для кожного відвідувача](/uk/privacy/)
і називає цей запуск за адресою, з якої прийшов відвідувач, а назву записує до
власного журналу, якого серверна програма не бачить. Цей журнал помітили в день
першого підрахунку запитів, і тепер записи в ньому видаляються через тридцять
днів.

А одна машина обмежує й те, які сервери вона може прийняти. Розповідь про те, як
[уся компанія працювала на одному хості з 512 МБ](/uk/portfolio/ran-the-whole-company-on-one-512mb-host-109/),
навмисно тримає пошту поза цією машиною. Поштовий сервер існує як заготовка для
встановлення, що чекає на окремий хост, бо поштовому серверу потрібен запас,
який ця машина вже вичерпала: межу записано заздалегідь, а не з'ясовано згодом.

## Де виникають проблеми

**Машина відповідає, а сервер — ні.** Ping, відкритий сеанс SSH чи зелена плитка
віртуальної машини в панелі кажуть лише, що хост працює. Жоден із цих сигналів
не каже, що вебсервер відповідає, що він повертає правильну сторінку чи що його
сертифікат досі чинний. Перевіряйте сервер так, як ним користується клієнт:
поставте справжнє запитання й прочитайте відповідь.

```sh
curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' https://example.com/
```

Код 200 за розумний час — це те, що потрібно відвідувачеві. Усе інше —
несправність, хоч би що показували графіки машини.

**Файл на диску каже одне, а запущений сервер — інше.** Більшість серверів
читають конфігурацію під час запуску чи перезавантаження й тримають її в
пам'яті, тож відредагований файл нічого не змінює до наступного
перезавантаження. Перезапуск із пошкодженим файлом узагалі лишає машину без
запущеного сервера. Перевірте файл, потім передайте його запущеному серверу,
потім поставте серверу запитання. Командний рядок Caddy охоплює перші два кроки:
`validate` завантажує й налаштовує кожен модуль так, ніби конфігурацію
запускають, але не запускає її, а `reload` передає нову конфігурацію запущеному
екземпляру.

```sh
caddy validate --config /etc/caddy/Caddyfile
caddy reload --config /etc/caddy/Caddyfile
```

**Два сервери не ділять роботу одного навпіл.** Друга копія сервера застосунків
за балансувальником навантаження ставить під сумнів кожен шматок стану, який
тримала перша. Сесії в пам'яті належать одній копії, тож відвідувач, якого
направили до другої, мусить входити знову. Файл, завантажений на один диск, є
лише на тому диску. Запланована задача, встановлена на обох, виконується двічі.
Перш ніж додавати другу копію, перенесіть сесії, завантаження й розклад туди, де
їх бачать обидві, або залиште один сервер і зробіть його швидшим.

**Усі сервери на одній машині мають спільну долю.** Один хост із багатьма
серверами дешевий і простий, але це також означає, що одне перезавантаження,
один заповнений диск чи вичерпана пам'ять зупиняють усі сервери водночас. Для
невеликого сайту це чесний обмін, якщо його обрали свідомо: машину описано як
код, щоб її можна було відтворити, дані копіюються за межі машини, а сервер,
якому потрібен власний запас, отримує власну машину.

## Що почитати далі

- [server — NIST CSRC Glossary](https://csrc.nist.gov/glossary/term/server) —
  визначення, спільне для публікацій NIST, з видами серверів, які вони
  називають.
- [RFC 9110, HTTP Semantics: Connections, Clients, and Servers](https://www.rfc-editor.org/rfc/rfc9110.html#section-3.3)
  — клієнт і сервер як ролі, що їх програма виконує в одному з'єднанні.
- [RFC 9293, Transmission Control Protocol](https://www.rfc-editor.org/rfc/rfc9293.html)
  — пасивне й активне відкриття і те, як програма, що слухає, чекає на одній
  адресі або на всіх.
- [Caddy: Command Line](https://caddyserver.com/docs/command-line) — `validate`,
  `reload` та інші команди вебсервера, на якому працює цей сайт.

<https://engineer.company/uk/glossary/server/>
