Сайт не открывается
Когда сайт не открывается, причина почти всегда одна из немногих: веб-сервер не запущен, порт закрыт файрволом, DNS указывает не туда, истёк SSL-сертификат или в конфигурации есть ошибка, которую видно только в логах. В этой статье — пошаговая диагностика на VPS mHost: от процесса на сервере до браузера пользователя, — которая поможет быстро найти, что именно сломалось.
Что понадобится
- Доступ по SSH под
rootили пользователем сsudo— большинство проверок выполняются в терминале. - Домен, который должен указывать на этот VPS, — понадобится для Шагов 5 и 6 (DNS и SSL). Если сайт пока должен открываться только по IP, эти два шага можно пропустить.
- Информация о том, какой веб-сервер установлен — Nginx, Apache или Caddy. Если не уверены, посмотрите статьи «Nginx: установка и первый сайт», «Apache: установка и виртуальные хосты» или «Caddy: автоматический HTTPS» — либо просто попробуйте команды для каждого из них по очереди в Шаге 2.
Шаг 1. Определите симптом: как именно сайт не открывается
То, как именно отвечает (или не отвечает) сервер, сразу сужает круг подозреваемых. Проверьте с любого компьютера с доступом в интернет — не обязательно с самого сервера:
curl -I --max-time 10 https://example.comЗамените example.com на свой домен. Если сайт пока без HTTPS, замените https:// на http://. По тому, чем именно ответит curl, определите, какой шаг проверять первым:
- Ошибка `curl: (6)` — «Could not resolve host» — домен вообще не резолвится: опечатка в адресе либо DNS ещё не настроен — см. Шаг 5.
- Ошибка `curl: (7)` — «Connection refused» — до сервера пакеты доходят, но порт закрыт: сервис не запущен либо слушает не тот адрес или порт — см. Шаги 2–3.
- Ошибка `curl: (28)` — «Connection timed out» — запрос зависает и не получает ответа вообще: чаще всего файрвол молча отбрасывает пакеты — см. Шаг 4. Причиной может быть и неверный IP в DNS-записи.
- Ошибка `curl: (60)` — «SSL certificate problem» (или предупреждение о сертификате в браузере) — проблема с TLS-сертификатом — см. Шаг 6.
- Ответ приходит с кодом 500, 502, 503 или 504 — веб-сервер отвечает, но с ошибкой на своей стороне или на стороне приложения за ним — см. Шаг 7 (логи).
- Ответ приходит, но не то, что ожидалось (404, чужой сайт, старая версия страницы) — сеть и сертификат в порядке, дело в конфигурации самого сайта — тоже см. Шаг 7.
Если не уверены, что именно не так, — просто пройдите Шаги 2–7 по порядку.
Шаг 2. Проверьте, что веб-сервер запущен
Самая частая причина — служба веб-сервера остановлена или упала после ошибки в конфигурации. Команда systemctl status зависит от того, какой веб-сервер установлен:
- Nginx (все дистрибутивы) —
systemctl status nginx - Apache на Ubuntu/Debian —
systemctl status apache2 - Apache на AlmaLinux/Rocky Linux —
systemctl status httpd - Caddy (все дистрибутивы) —
systemctl status caddy
systemctl status nginxПример, когда всё в порядке:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-07-09 10:12:03 UTC; 2h 14min ago
Docs: man:nginx(8)
Main PID: 1234 (nginx)Пример, когда служба упала:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Thu 2026-07-09 12:40:11 UTC; 3min agoВажна строка Active: active (running) — служба работает; inactive (dead) — остановлена, но не упала; failed — упала, обычно из-за ошибки в конфигурации или занятого порта.
Если служба не active (running), запустите её (замените nginx на нужное имя службы из списка выше):
sudo systemctl start nginxЕсли сразу после этого статус снова failed, посмотрите причину в системном журнале:
sudo journalctl -xeu nginx --no-pager -n 50Шаг 3. Проверьте, что сервер слушает порты 80 и 443
Служба может быть запущена, но слушать не тот порт или не тот сетевой адрес — тогда снаружи до неё всё равно не достучаться. Проверьте, что реально прослушивается:
sudo ss -tlnp | grep -E ':80 |:443 'Пример вывода, когда всё в порядке:
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1234,fd=7))State—LISTENозначает, что порт открыт и ждёт подключений.Local Address:Port— адрес и порт, которые слушает процесс.0.0.0.0(или*) означает все сетевые интерфейсы, порт доступен снаружи;127.0.0.1— только сам сервер, снаружи (и даже по домену или IP сервера) недоступен.Process— какой именно процесс держит порт (имя и PID).
Если строк с портом 80 или 443 нет вообще — на сервере никто их не слушает. Вернитесь к Шагу 2: либо служба не запущена, либо в её конфигурации указан другой listen (nginx) / Listen (Apache).
Шаг 4. Проверьте файрвол
Даже если сервис слушает порт правильно, файрвол на самом VPS может блокировать входящие соединения снаружи.
Ubuntu / Debian (ufw)
sudo ufw statusПример:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN AnywhereЕсли строк для 80/443 нет, добавьте их:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpAlmaLinux / Rocky Linux (firewalld)
sudo firewall-cmd --list-allИщите в выводе строку services — она должна содержать http и https (либо соответствующие порты должны быть перечислены в строке ports):
services: ssh dhcpv6-client http httpsЕсли http/https в выводе нет, откройте их:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reloadШаг 5. Проверьте DNS: указывает ли домен на этот сервер
Сервис запущен, порт открыт — а сайт всё равно не открывается по домену? Проверьте, что домен вообще указывает на IP этого VPS.
dig +short example.comОжидаемый результат — IP-адрес, совпадающий с публичным IP вашего VPS (посмотреть его можно в карточке сервера в VMmanager 6, либо прямо на сервере командой curl -4 ifconfig.me).
Если dig вернул пустой ответ или другой IP, учтите задержку на распространение изменений (TTL) и проверьте напрямую через публичный DNS-резолвер, в обход возможного локального кеша:
dig +short example.com @1.1.1.1Чтобы убедиться, что дело именно в DNS, а не в самом сервере, обратитесь к серверу напрямую по IP с заголовком Host — так, будто домен уже резолвится правильно:
curl -I -H "Host: example.com" http://203.0.113.10/Замените 203.0.113.10 на реальный IP сервера. Если так сайт открывается (код 200 OK), а по домену — нет, проблема на 100% в DNS, а не на сервере.
Шаг 6. Если сайт на HTTPS — проверьте сертификат
Актуально, если браузер показывает предупреждение о сертификате или соединение обрывается именно на порту 443 (а не молчит вовсе — это был бы Шаг 3 или 4).
Проверьте сам сертификат, не открывая браузер:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -datesПример вывода:
subject=CN=example.com
notBefore=Mar 11 08:00:00 2026 GMT
notAfter=Jun 9 08:00:00 2026 GMTnotAfter— дата истечения. Если она в прошлом, сертификат просрочен — именно этим чаще всего объясняется предупреждениеNET::ERR_CERT_DATE_INVALIDв Chrome.subject— домен, на который выпущен сертификат. Если он не совпадает с адресом в браузере (например, сертификат только наwww.example.com, а открываютexample.comбезwww), браузер покажет ошибку несовпадения имени, даже если сам сертификат ещё действителен.
Если сертификат выпущен через certbot (обычно вместе с Nginx или Apache), посмотрите список сертификатов и их статус:
sudo certbot certificatesFound the following certs:
Certificate Name: example.com
Domains: example.com www.example.com
Expiry Date: 2026-06-09 08:00:00+00:00 (INVALID: EXPIRED)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pemЕсли сертификат просрочен, проверьте, почему не сработало автопродление, и продлите вручную:
systemctl list-timers | grep certbot
sudo journalctl -u snap.certbot.renew.service --no-pager -n 50
sudo certbot renewСамые частые причины провала автопродления:
- Порт 80 был закрыт в момент продления — certbot проверяет владение доменом по HTTP, без открытого порта 80 продление не проходит — см. Шаг 4.
- Домен перестал указывать на этот сервер — сменили DNS-запись или перенесли сайт — см. Шаг 5.
- Сертификат выпущен на другое имя, чем то, что реально открывают в браузере, — само по себе продление тут ни при чём, нужно перевыпустить сертификат с нужными доменами.
Шаг 7. Прочитайте логи веб-сервера
Если служба запущена, порты открыты, DNS и сертификат в порядке, а сайт всё равно отвечает не так, как нужно, — ответ почти всегда в логах.
- Nginx —
/var/log/nginx/error.logи/var/log/nginx/access.log(все дистрибутивы). - Apache на Ubuntu/Debian —
/var/log/apache2/error.logи/var/log/apache2/access.log, либо отдельные файлы для конкретного сайта, если они заданы вVirtualHostчерезErrorLog/CustomLog. - Apache на AlmaLinux/Rocky Linux —
/var/log/httpd/error_logи/var/log/httpd/access_log. - Caddy — по умолчанию пишет в системный журнал, а не в файл:
journalctl -u caddy -n 50 --no-pager.
sudo tail -n 50 /var/log/nginx/error.logЕсли сама служба не стартует и до записи в error.log дело не доходит, посмотрите системный журнал:
sudo journalctl -xeu nginx --no-pager -n 50Типичные записи в логах и что они означают:
- `bind() to 0.0.0.0:80 failed (98: Address already in use)` — порт уже занят другим процессом: например, Apache и Nginx запущены одновременно, или остался «зависший» старый процесс. Найдите его:
sudo ss -tlnp | grep ':80 '. - `No such file or directory` для корня сайта — неверный
root(nginx) илиDocumentRoot(Apache), либо в каталоге нетindex.html/index.php. - `(13: Permission denied)` при чтении файлов сайта, `403 Forbidden` в браузере — не хватает прав на файлы/каталоги, либо (на AlmaLinux/Rocky) доступ блокирует SELinux — пример настройки контекста через
semanage/restoreconесть в статье «Nginx: установка и первый сайт». - `connect() failed (111: Connection refused) while connecting to upstream` — это ошибка не самого веб-сервера, а backend-приложения за ним: оно не запущено или слушает не тот порт. Проверьте процесс приложения — статьи «Node.js приложение с PM2 и Nginx», «Python и FastAPI: продакшн-деплой», «Django на VPS», «Docker и Docker Compose».
- 502 или 504 в браузере и в access.log — то же самое: backend недоступен или отвечает слишком медленно.
- Логи не растут вообще, или последняя запись обрывается на середине строки — вероятно, на сервере закончилось место на диске — см. статью «Диск заполнен».
- Сайт открывается, но очень медленно или не всегда — это уже не «не открывается», а высокая нагрузка на сервер — см. статью «Высокая нагрузка на сервер».
Что дальше
Если прошли все шаги, а сайт по-прежнему не открывается или причина не нашлась в перечисленном выше, — скорее всего, дело уже не в инфраструктуре VPS, а в коде или конфигурации самого приложения. Смежные темы: полная настройка HTTPS — статья «Бесплатный SSL с Let's Encrypt (certbot)»; файрвол — статья «Файрвол ufw: порты»; если не запускается сама служба — статья «Служба не запускается»; общий чек-лист базовой защиты сервера — статья «Чеклист базовой защиты VPS».