Чек-лист запуска и план обслуживания
Домен
Имя — та часть сайта, которую нельзя восстановить из резервной копии. Проверяйте его первым и раз в квартал, а не один раз.
- Данные регистранта верны, и адрес электронной почты всё ещё работает.
- Автопродление включено, и карта в файле не истекает в этом году.
- У аккаунта регистратора уникальный пароль и двухфакторная аутентификация.
- Блокировка переноса включена: WHOIS показывает clientTransferProhibited.
- DNS-серверы — те, что вы выбрали, а DNSSEC либо включён и работает, либо выключен.
- Дата окончания стоит в календаре за месяц до настоящей даты.
- У сайта есть второе имя, www, и оно перенаправляет на основное.
Подробности — в уроке 1.
Хостинг и сайт
- Домен разрешается в правильный адрес по IPv4 и IPv6: dig +short example.com, dig +short AAAA example.com.
- https://example.com отвечает 200, а http:// один раз перенаправляет на него.
- Сертификат покрывает оба имени, действителен и продлевается сам.
- Сайт умеет сохранить запись, отправить форму и показать загрузку: три вещи, которые касаются базы данных, почты и диска.
- CMS и каждый плагин обновлены, а у аккаунта администратора есть двухфакторная аутентификация.
- Ни .git, ни .env, ни дамп базы данных не доступны под веб-корнем.
- База данных доступна только с сервера, и её пользователь не root.
- У файлов и базы данных есть копия за эту неделю на другой машине.
- Страница 404 существует и выглядит как сайт, а не как страница сервера по умолчанию.
Уроки 3 и 4 дают всё это на виртуальном хостинге; урок 5 делает то же на вашем сервере.
Сервер
- SSH принимает только ключи; root не может войти; fail2ban работает.
- ufw разрешает нужные порты и ничего больше: sudo ufw status.
- Автоматические обновления безопасности включены, и сервер перезагружался после последнего обновления ядра.
- На публичном адресе слушают только службы, которые вы знаете: sudo ss -tlnp.
- У каждого сайта свой системный пользователь и свой пул PHP-FPM.
- Файлы настройки с секретами — 600, файлы сайта — 640 или 750.
- HSTS и заголовки безопасности на месте, а строки версий скрыты.
- На веб-сервере заданы ограничения частоты.
- У аккаунта провайдера и аккаунта панели есть двухфакторная аутентификация.
Это чек-лист урока 8 в сжатом виде. Прогоняйте его после каждого крупного изменения, а не только при запуске.
Почта
- Записи MX указывают на почтовый сервер, и почтовый сервер отвечает на порту 25.
- Запись SPF перечисляет каждого отправителя, и запись SPF ровно одна.
- DKIM подписывает исходящую почту, и открытый ключ опубликован.
- DMARC есть, отчёты приходят, и политика не ниже quarantine.
- Запись PTR адреса совпадает с именем, которое объявляет сервер.
- Исходящий порт 25 открыт или настроен релей.
- Сервер не открытый релей, и порт 587 требует аутентификации.
- Почта, отправленная крупному провайдеру и полученная от него, проходит проверки SPF, DKIM и DMARC.
- У ящика надёжный пароль, а почтовый клиент использует TLS.
Команды и значения записей — в уроке 9. Сайт может выйти в сеть без почты; бизнес — нет.
Расписание обслуживания
Серверу не нужно внимание каждый день, но нужен ритм. Этот подходит небольшому сайту и занимает около десяти минут в день, полчаса в неделю и час в месяц.
| Когда | Что делать |
|---|---|
| Каждый день | Прочитать результат резервного копирования. Взглянуть на проверку доступности и график диска. Прочитать журнал ошибок, если какая-то проверка красная. |
| Каждую неделю | Установить ожидающие обновления. Проверить свободное место и память. Прочитать журнал аутентификации на новых пользователей и странные адреса. Убедиться, что свежая резервная копия открывается. |
| Каждый месяц | Обновить CMS, темы и плагины. Восстановить одну резервную копию в тестовую папку. Проверить срок и продление сертификата. Пересмотреть список аккаунтов с доступом к сайту, панели и регистратору. Прочитать журнал доступа на неожиданные пути. |
| Каждый квартал | Пересмотреть правила файрвола и слушающие порты. Удалить неиспользуемые сайты, базы данных и ящики. Сменить пароли, которыми пользуются несколько человек. Проверить запись WHOIS и блокировку переноса. |
| Раз в год | Запланировать пересборку на свежем образе системы. Прочитать заметки о выпуске дистрибутива. Сравнить бюджет тарифа с трафиком. |
Команды — обычные из этого курса: cron запускает резервное копирование, sudo apt upgrade обновляет систему, df -h проверяет диск, а journalctl читает службы. Привычка важнее инструмента: напоминание в календаре, которое никто не игнорирует, — самый дешёвый мониторинг.
Когда сайт лежит
Идите снаружи внутрь и останавливайтесь на первом слое, который отвечает неправильно. Большинство ответов дают три инструмента: dig для имени, curl для страницы и df для диска. Порядок каждый раз один и тот же, поэтому его стоит запомнить.
1. Это сайт или посетитель? Спросите кого-нибудь ещё или используйте другую сеть, прежде чем что-то менять. Локальный кэш DNS или сбой у провайдера выглядят точно как сломанный сервер, если смотреть с одного места.
2. Разрешается ли имя?
dig +short example.com
Нет ответа или неверный адрес означают DNS: запись изменилась, домен истёк или DNS-серверы лежат. Сравните с публичным резолвером и прочитайте делегирование через dig +trace.
3. Отвечает ли порт?
nc -vz example.com 443
Connection to example.com 443 port [tcp/https] succeeded!
Тайм-аут означает файрвол, сеть провайдера или остановленный веб-сервер. Проверьте с самого сервера: если localhost отвечает, а интернет нет, проблема в пути.
4. Отвечает ли сайт по HTTP?
curl -I https://example.com
HTTP/2 502 server: nginx
502 означает, что Nginx жив, а PHP-FPM нет или путь к сокету неверен. 500 означает, что PHP выполнился, а приложение упало; читайте его журнал ошибок. 403 — проблема прав или индексного файла. 404 при правильном сервере — проблема настройки сайта. Сами коды — в статье коды состояния HTTP.
5. Диск заполнен? Заполненный диск ломает базу данных, журналы и сеансы сразу, а сообщения об ошибках указывают куда угодно, кроме диска.
df -h /
df -i /
Filesystem Size Used Avail Use% Mounted on /dev/vda1 39G 38G 0G 100% /
Сто процентов занято или сто процентов inode — вот ответ. Удалите старые журналы и старые резервные копии, затем найдите, что выросло: du -h /var/log/* | sort -h | tail. Не удаляйте файлы базы данных, чтобы освободить место; лучше перенесите резервную копию с сервера.
6. База данных работает?
systemctl status mariadb --no-pager
sudo journalctl -u mariadb -n 20 --no-pager
База данных, которая остановилась после заполнения диска, обычно снова запускается, когда место освободилось. У базы данных, остановившейся по другой причине, есть сообщение в журнале, которое называет таблицу или файл.
7. Что изменилось? Последнее развёртывание, последнее обновление плагина, последнее продление сертификата, последнее правило файрвола. На практике ответ почти всегда в последнем часе, и быстрее всего отменить изменение, а разбираться уже потом. Потом прочитайте журналы и разберитесь.
8. Когда ничего не помогает, восстанавливайте. Сайт, который нельзя починить за полчаса, — это сайт, который откатывают к последней хорошей копии, пока вы разбираетесь на копии. Поэтому в расписании есть проверка восстановления: в худший момент вам не захочется учить процедуру восстановления.
Записывайте, что нашли, даже когда ответ был простым. Следующая авария будет другой, и ваши записи станут самым быстрым путём ко второй строке диагностики.
Тест
1 Какую часть сайта нельзя восстановить из резервной копии сервера?
Ответ
c) Файлы, базы данных и сертификаты можно создать заново. Имя, которое истекло и было зарегистрировано кем-то другим, потеряно, и поэтому важны автопродление, блокировка и двухфакторная аутентификация.
2 Что предотвращает блокировка переноса домена?
Ответ
b) clientTransferProhibited запрещает перенос. Она не влияет на DNS, сайт или сертификат.
3 Какой тип записи несёт адрес сервера для example.com?
Ответ
b) A хранит IPv4, AAAA — IPv6. CNAME в вершине не разрешён, а MX и TXT служат другим целям.
4 curl -I https://example.com отвечает 502. Что проверить первым?
Ответ
b) 502 — плохой шлюз: Nginx не смог добраться до обработчика PHP. Проверьте службу и путь в fastcgi_pass.
5 Диск заполнен на сто процентов. Какие файлы безопасно удалить первыми?
Ответ
b) Ротированные журналы и локальные копии — это копии. Файлы базы данных, настройка и загрузки — рабочие данные, и их нельзя удалять, чтобы освободить место.
6 Как часто нужно проверять восстановление резервной копии?
Ответ
b) Ежемесячное восстановление ловит сломанную копию до того, как она понадобится. Восстановление только во время аварии превращает плохой день в катастрофу.
7 Какие три настройки останавливают подбор пароля SSH?
Ответ
b) Ключи убирают пароль, который можно подобрать, запрет входа root убирает аккаунт, который пробуют все, а fail2ban убирает адрес, который продолжает пробовать.
8 Письмо с вашего домена проходит проверку SPF, но не проходит проверки DKIM и DMARC. Какова наиболее вероятная причина?
Ответ
b) SPF проверяет конвертного отправителя, и совпадения с доменом From нет, поэтому проверка DMARC тоже не пройдена. DKIM подписывает домен From, поэтому исправлять надо подпись, которая не прошла проверку: селектор, указывающий на другой ключ, или ключ, перегенерированный без обновления DNS, дают именно такой результат.
9 Какая задача обслуживания относится к месячному списку, а не к ежедневному?
Ответ
b) Ежедневный список наблюдает, месячный доказывает. Проверка восстановления занимает час и спасает выходные.
10 Посетитель говорит, что сайт лежит, а ваш браузер показывает его нормально. Что делать первым?
Ответ
b) Сайт может быть в порядке, а у посетителя — закэшированный ответ DNS, заблокированный адрес или истёкший сеанс. Подтвердите масштаб, прежде чем менять работающую систему.
Автор статьи: Arthur Isaev