Как работает веб-хостинг
Что такое сервер
Сервер — это компьютер, который отвечает на запросы. У него те же части,
что у машины на вашем столе: процессор, память, диск, сетевая карта,
операционная система, обычно Linux. Разница в
том, что перед ним никто не сидит. Он работает в дата-центре, в сети,
которую никогда не выключают, и им управляют по
SSH.
На сервере программы, которые называют службами, слушают порты и ждут
подключений. Запрос к сайту идёт на порт 80 для обычного HTTP или 443
для HTTPS, почта — на порт 25 или 587, SSH — на порт 22. Каждая служба —
это процесс, который systemd запускает при загрузке и перезапускает,
когда он падает. Чтобы увидеть, что слушает на вашей машине:
sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=812,fd=6)) LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=812,fd=7)) LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mariadbd",pid=944,fd=21)) LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=701,fd=3))
Список короткий, и каждую строку нужно уметь объяснить. Nginx отвечает за веб на всех адресах; MariaDB слушает только 127.0.0.1, поэтому база данных доступна с самого сервера и больше ниоткуда; SSH слушает все адреса, потому что к нему надо подключаться. Порт, который вы не можете объяснить, — это служба, которую стоит выключить или закрыть в файрволе. Это первая привычка администратора сервера, и урок 8 на ней строится.
Веб-сервер
Веб-сервер — это программа, которая принимает HTTP-запросы и отправляет
файлы в ответ. Почти везде это делают две программы:
Nginx и Apache. Apache запускает пул
процессов, разрешает настройку в файлах .htaccess
внутри папки сайта и умеет выполнять PHP
внутри себя. Nginx использует цикл событий, держит всю настройку в
файлах под /etc/nginx/, полностью игнорирует
.htaccess и передаёт запросы к PHP отдельному
процессу.
Оба превосходны. Виртуальный хостинг часто работает на Apache, потому
что поддержка .htaccess позволяет клиенту менять
перенаправления без системного администратора. Серверы, которые вы
настраиваете сами, часто работают на Nginx из-за меньшего расхода памяти
и простых файлов настройки. Подробности — в
nginx.conf: настройка и сайты; здесь
важно то, что веб-сервер делает для сайта:
- Читает строку запроса, например GET /about/ HTTP/1.1, и заголовки за ней.
- Определяет, какому сайту принадлежит запрос, по заголовку Host.
- Сопоставляет путь с файлом в папке этого сайта или передаёт запрос PHP.
- Добавляет заголовки ответа: тип содержимого, правила кэширования, заголовки безопасности.
- Пишет строку в журнал доступа и, если что-то не удалось, в журнал ошибок.
Виртуальные хосты и заголовок Host
Один сервер с одним IP-адресом обслуживает сотни сайтов. Секрет в заголовке Host: браузер отправляет имя, которое набрал пользователь, а веб-сервер выбирает подходящую настройку. В Nginx каждый сайт — это блок server, а имя задаёт server_name. В Apache это VirtualHost с ServerName. Это называют виртуальным хостингом по имени, и поэтому один IP-адрес сам по себе ещё не сайт.
sudo vi /etc/nginx/sites-available/example.com
server { listen 80; server_name example.com www.example.com; root /var/www/example.com/html; index index.php index.html; } server { listen 80; server_name shop.example.net; root /var/www/shop.example.net/html; }
Два имени, две папки, один IP-адрес. Запрос к
example.com попадает в первый блок, запрос к
shop.example.net — во второй. Блок с
default_server — а если он не помечен, то первый
в настройке — отвечает на запросы к незнакомым именам: так сервер
реагирует на прямой заход по IP или на домен, который по ошибке указали
на него.
HTTPS добавляет проблему. Сертификат выбирают во время рукопожатия TLS,
до того как появится хоть один заголовок HTTP, поэтому сервер ещё не
может прочитать Host. Решение — SNI, Server Name
Indication: браузер отправляет запрошенное имя в рукопожатии, и сервер
выбирает подходящий сертификат. Его поддерживает каждый современный
браузер. Практическое правило: убедитесь, что имя есть в
server_name, прежде чем запрашивать для него
сертификат, и включите и example.com, и
www.example.com.
Обработчики PHP и пулы
Веб-сервер сам не выполняет PHP. Он передаёт запрос обработчику PHP, и есть две распространённые схемы. Старая — mod_php: интерпретатор PHP работает внутри каждого процесса Apache, поэтому все сайты на сервере делят одну настройку PHP. Современная — PHP-FPM: отдельная служба с пулами, каждый пул работает под своим системным пользователем и слушает свой сокет. Веб-сервер передаёт запрос в сокет.
sudo vi /etc/php/8.3/fpm/pool.d/example.com.conf
[example.com] user = example group = example listen = /run/php/php8.3-fpm-example.sock listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[open_basedir] = /var/www/example.com:/tmp
Пул работает под пользователем example, поэтому ошибка на одном сайте не может прочитать файлы другого сайта, который работает под другим пользователем. max_children ограничивает число запросов, которые сайт может выполнять одновременно, и не даёт одному загруженному сайту съесть всю память машины. open_basedir ограничивает папки, которые PHP может открыть. В блоке сайта Nginx подключается к сокету:
sudo vi /etc/nginx/sites-available/example.com
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm-example.sock; }
На виртуальном хостинге эти файлы пишете не вы. Панель пишет их, когда вы выбираете версию PHP для сайта, и изоляция, которую они дают, — одна из вещей, за которые вы платите.
Базы данных
Сервер баз данных — ещё одна служба, обычно MariaDB или MySQL, слушающая порт 3306. Один сервер баз данных держит много баз данных, и у каждой базы есть свои пользователи и права. Сайт получает имя базы, имя пользователя и пароль, и больше ничего:
sudo mariadb
MariaDB [(none)]> CREATE DATABASE example_db; Query OK, 1 row affected (0.001 sec) MariaDB [(none)]> CREATE USER 'example_user'@'localhost' IDENTIFIED BY 'long-random-password'; Query OK, 0 rows affected (0.012 sec) MariaDB [(none)]> GRANT ALL ON example_db.* TO 'example_user'@'localhost'; Query OK, 0 rows affected (0.004 sec) MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | example_db | | information_schema | | mysql | | performance_schema | +--------------------+ 4 rows in set (0.001 sec)
Пользователь может работать только внутри example_db и подключаться только с localhost. Это правильное поведение по умолчанию: сайт работает на той же машине, что и база данных, поэтому базе никогда не нужно принимать подключения из интернета. Порт базы данных, открытый всему миру, — один из самых быстрых способов потерять сайт, и урок 7 ставит его высоко в списке.
Как один сервер разделяет клиентов
Виртуальный хостинг сажает незнакомых людей на одну машину. Провайдер обещает, что ваши файлы, ваша база и ваша почта принадлежат только вам, и это обещание держится на наборе механизмов:
| Механизм | Что он делает |
|---|---|
| Системные пользователи | Каждый сайт работает под своим пользователем; права на файлы решают, что этот пользователь может прочитать. |
| Пулы PHP-FPM | Один пул на сайт, со своим пользователем, сокетом и ограничениями. |
| open_basedir | PHP может открывать файлы только в папке сайта и во временной папке. |
| Квоты на диск | Сайт не может занять весь диск и остановить машину для всех. |
| Ограничения CPU и памяти | cgroups и лимиты пула сдерживают шумного соседа. |
| chroot и тюрьмы | Процесс видит поддерево файловой системы как свой корень. |
| Контейнеры | Пространства имён и cgroups дают процессу отдельное, приватное представление системы. |
Ни один из них не идеален. Все сайты делят одно ядро, и ошибка в ядре может сломать стену между ними. Провайдер, который продаёт больше, чем у него есть, ставит слишком много загруженных сайтов на один диск, и ждут все. Это не повод избегать виртуального хостинга; это повод понимать, что вы покупаете. Когда ограничения начинают мешать, вы переходите на VPS, где стена — это виртуальная машина, ядро всё ещё общее, но машина ваша.
Панели управления
Панель управления — это веб-приложение, которое работает от root и
пишет настройку за вас: создаёт папку сайта и системного пользователя,
пишет блок Nginx или Apache, создаёт базу данных, добавляет зону
DNS, выпускает сертификат, добавляет
почтовый ящик. ispmanager, cPanel, Plesk, Hestia CP и CloudPanel —
самые распространённые; у провайдера может быть и своя, более простая
панель.
Панель превращает десять шагов командной строки в десять щелчков, и это
заметно экономит время, когда сайтов много. Цена — ещё одна
служба с правами root на машине: её нужно обновлять так же тщательно,
как веб-сервер, на её входе должна быть двухфакторная аутентификация, а
её собственные ошибки становятся частью поверхности атаки. Панель ещё и
скрывает, что она делает, поэтому этот курс показывает файлы под ней.
Виртуальный, VPS, выделенный, облако
Эти четыре слова описывают, кому принадлежит какой слой. Слои — это оборудование, операционная система, службы на ней и ваш сайт.
| Виртуальный | VPS | Выделенный | Облако | |
|---|---|---|---|---|
| Оборудование | Провайдер | Провайдер | Провайдер, одна машина для вас | Провайдер |
| Операционная система | Провайдер | Вы | Вы | Вы |
| Веб-сервер, PHP, база данных | Провайдер, через панель | Вы | Вы | Вы |
| Доступ root | Нет | Да | Да | Да |
| Соседи на машине | Много | Виртуальные машины | Нет | Виртуальные машины |
| Масштабирование | Тариф побольше | Больше ядер и памяти | Новое оборудование | Новые экземпляры по требованию |
| Кто чинит сломанное обновление | Провайдер | Вы | Вы | Вы |
Виртуальный хостинг — самый дешёвый и самый простой:
Какой хостинг выбрать сравнивает
предложения. VPS — виртуальная машина на большом хосте, со своим ядром
и доступом root; VPS хостинг
показывает, как её создать. Выделенный сервер — целая физическая машина,
и это важно, когда нужны все ядра, большой дисковый массив или
предсказуемая сеть. Облачные платформы продают те же виртуальные машины
плюс базы данных, хранилище и балансировщики нагрузки по часам.
Уроки 4
и 5 запускают
один и тот же небольшой сайт на первых двух: те же файлы, та же база
данных, совершенно разный объём работы.
Тест
1 Два домена указывают на один IP-адрес. Как Nginx понимает, какой сайт обслуживать?
Ответ
b) Виртуальный хостинг по имени сопоставляет запрошенное имя с server_name. Если совпадения нет, отвечает сервер по умолчанию.
2 Какую задачу решает SNI?
Ответ
b) Сертификат нужно выбрать до появления заголовков HTTP, поэтому SNI отправляет имя во время рукопожатия TLS, и сервер выбирает подходящий сертификат.
3 Почему отдельный пул PHP-FPM на каждый сайт лучше одного общего?
Ответ
b) Пул задаёт системного пользователя и ограничения для сайта. Общий пул выполняет все сайты под одним пользователем, и права на файлы перестают их защищать.
4 Ваша база данных слушает только 127.0.0.1:3306. Что это значит?
Ответ
b) Локальный сокет или адрес обратной петли доступен с самого сервера. Интернет подключиться не может, и это как раз нужная защита.
5 Какая строка в выводе ss -tlnp заслуживает объяснения, прежде чем закрывать сервер от мира?
Ответ
a) Служба, которая слушает, — это служба, до которой можно добраться. Если вы не можете сказать, зачем нужен порт, выключите службу или закройте порт в файрволе.
6 На VPS кто устанавливает обновления безопасности для веб-сервера?
Ответ
b) Доступ root означает ответственность root. На виртуальном хостинге систему обновляет провайдер; на VPS или выделенном сервере это становится вашей работой.
7 В чём главный риск панели управления?
Ответ
b) Панель пишет системную настройку от root. Ей нужны те же обновления, надёжные пароли и вход по двум факторам, что и любой другой административной службе.
Автор статьи: Arthur Isaev