Как работает веб-хостинг

Что такое сервер

Сервер — это компьютер, который отвечает на запросы. У него те же части, что у машины на вашем столе: процессор, память, диск, сетевая карта, операционная система, обычно 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: настройка и сайты; здесь важно то, что веб-сервер делает для сайта:

Виртуальные хосты и заголовок 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_basedirPHP может открывать файлы только в папке сайта и во временной папке.
Квоты на дискСайт не может занять весь диск и остановить машину для всех.
Ограничения 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 понимает, какой сайт обслуживать?

  1. По IP-адресу источника посетителя
  2. По заголовку Host в запросе
  3. По номеру порта
  4. По порядку папок на диске
Ответ

b) Виртуальный хостинг по имени сопоставляет запрошенное имя с server_name. Если совпадения нет, отвечает сервер по умолчанию.

2 Какую задачу решает SNI?

  1. Ускоряет PHP
  2. Позволяет одному IP-адресу обслуживать несколько сайтов HTTPS с разными сертификатами
  3. Скрывает версию сервера
  4. Сжимает картинки
Ответ

b) Сертификат нужно выбрать до появления заголовков HTTP, поэтому SNI отправляет имя во время рукопожатия TLS, и сервер выбирает подходящий сертификат.

3 Почему отдельный пул PHP-FPM на каждый сайт лучше одного общего?

  1. PHP работает быстрее
  2. Каждый сайт работает под своим пользователем, поэтому ошибка на одном не прочитает файлы другого
  3. Исчезает нужда в веб-сервере
  4. Резервные копии становятся автоматическими
Ответ

b) Пул задаёт системного пользователя и ограничения для сайта. Общий пул выполняет все сайты под одним пользователем, и права на файлы перестают их защищать.

4 Ваша база данных слушает только 127.0.0.1:3306. Что это значит?

  1. Сайт не может к ней подключиться
  2. Подключаться могут только программы на той же машине, а локальному сайту это и нужно
  3. Порт закрыт и для локального сайта
  4. У базы данных нет пароля
Ответ

b) Локальный сокет или адрес обратной петли доступен с самого сервера. Интернет подключиться не может, и это как раз нужная защита.

5 Какая строка в выводе ss -tlnp заслуживает объяснения, прежде чем закрывать сервер от мира?

  1. Каждый слушающий порт, особенно неожиданный
  2. Только порт 22
  3. Только порты выше 1024
  4. Никакая, слушающие порты всегда безопасны
Ответ

a) Служба, которая слушает, — это служба, до которой можно добраться. Если вы не можете сказать, зачем нужен порт, выключите службу или закройте порт в файрволе.

6 На VPS кто устанавливает обновления безопасности для веб-сервера?

  1. Поставщик оборудования
  2. Вы или служба автоматических обновлений, которую вы настроили
  3. Регистратор домена
  4. Никто, VPS обновляется сам
Ответ

b) Доступ root означает ответственность root. На виртуальном хостинге систему обновляет провайдер; на VPS или выделенном сервере это становится вашей работой.

7 В чём главный риск панели управления?

  1. Она занимает слишком много места на диске
  2. Это веб-приложение с правами root, поэтому её ошибки и входы становятся частью поверхности атаки
  3. Она мешает HTTPS
  4. Она не умеет создавать базы данных
Ответ

b) Панель пишет системную настройку от root. Ей нужны те же обновления, надёжные пароли и вход по двум факторам, что и любой другой административной службе.

Автор статьи: Arthur Isaev

Изображение баннера