#Симптом и границы применимости
systemctl сообщает active (running), но на ожидаемом TCP-порту 80, 443 или нестандартном порту нет слушателя. Это не одно и то же, что блокировка доступа извне: сначала нужно проверить локальный сокет.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| В конфигурации нет нужного listenNginx открывает только сокеты, перечисленные в действующей конфигурации. | В nginx -T отсутствует ожидаемый адрес:порт | Уточнить server-блок и добавить нужный listen после резервной копии |
| Проверяется не тот экземплярПанель хостинга или контейнер может запускать отдельный экземпляр. | systemctl показывает одно имя службы, а nginx -T читает другой файл | Сверить бинарный файл и параметры запуска |
| Nginx слушает только loopback/IPv6Сокет на 127.0.0.1 доступен только локально. | ss показывает 127.0.0.1 или [::1], но не внешний адрес | Сопоставить адрес прослушивания с целью |
#Пошаговая диагностика и исправление
- Определите ожидаемый портИз панели хостинга, файла конфигурации или технического задания узнайте, где должен работать сайт: 80, 443, 8080 и на каком IP. Не считайте порт 443 обязательным, если TLS завершает внешний балансировщик. Запишите текущий адрес и порт.
- Проверьте статус и сокетыОткройте SSH-терминал сервера. Первая команда показывает состояние службы; вторая — TCP-сокеты в режиме LISTEN. В строках ищите :80 или :443 и имя nginx. Пустой ответ у grep — отсутствие найденной строки, а не доказательство неисправности всего сервера.
- Только чтениеLinux · Терминал (Bash)КомандаНужен sudoТолько чтение. На системах без systemd используйте штатный менеджер службы.
sudo systemctl status nginx --no-pagersudo ss -lntp
- Проверьте действующие директивы listenВыполните проверку конфигурации и распечатайте активные server-блоки. В nginx -T учитываются включаемые файлы; путь к ним бывает не только /etc/nginx/sites-enabled. Проверьте, что нужный listen относится именно к server_name домена, а не расположен в закомментированном файле.Linux · Терминал (Bash)КомандаНужен sudoКоманда чтения может вывести фрагменты закрытой конфигурации; не публикуйте полный вывод.
sudo nginx -tsudo nginx -T 2>&1 | grep -nE "listen |server_name"
- Исключите занятый порт и ошибку запускаЕсли порт занят другой программой, ss покажет имя процесса. Не завершайте неизвестный процесс. Посмотрите журнал запуска: сообщения bind() failed указывают на конфликт или отсутствие адреса в системе; permission denied — на права или ограничения окружения. Сопоставьте время ошибки с перезапуском.
- Среда: Linux с systemdLinux · Терминал (Bash)КомандаНужен sudoСреда: Linux с systemd. Только чтение.
sudo journalctl -u nginx -n 60 --no-pager
- Исправьте конкретную причинуЕсли listen указан как 127.0.0.1:8080, а нужен внешний доступ, меняйте директиву только после проверки firewall и схемы прокси. Если Nginx запущен в контейнере, проверьте публикацию порта контейнера: изменение listen в контейнере не публикует порт на хосте. Сохраните изменяемый файл, выполните nginx -t, затем reload.Linux · Терминал (Bash)С осторожностьюНужен sudoНе выполняйте reload, пока проверка не успешна. При ошибке верните сохранённый файл.
sudo nginx -t && sudo systemctl reload nginxКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
Повторите ss -lntp и curl -I http://127.0.0.1:ПОРТ/ для HTTP либо curl -Ik https://127.0.0.1:ПОРТ/ для TLS (параметр -k только диагностический). Если сокет есть локально, но извне недоступен, рассматривайте брандмауэр, NAT и группы безопасности отдельно.
#Если проблема не устранена
Если nginx -t успешен, но сокета нет, проверьте реальные ExecStart и конфигурацию запущенного процесса, а также контейнер/панель. Не открывайте внешний порт, пока не подтверждено, что сервис предназначен для публичного доступа.