#Симптом и границы применимости
Если Nginx отвечает по localhost или внутреннему IP, но не открывается из интернета, сначала определите, в какой точке обрывается соединение. Локальный HTTP-код 200 не доказывает, что публичные DNS, маршруты, входящие порты и TLS исправны.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Слушается только localhostПривязка к loopback недоступна внешним клиентам. | ss показывает 127.0.0.1:80 или [::1]:443 | Сверить listen с требуемой схемой |
| Внешний порт закрыт или не проброшенТрафик может не доходить до процесса Nginx. | curl снаружи выдаёт timeout, локально работает | Проверить firewall, NAT и облачную группу безопасности |
| DNS ведёт на чужой или старый адресПроверка localhost не касается внешнего адреса. | A/AAAA не совпадают с маршрутизируемым узлом | Сверить DNS, CDN и точку TLS |
#Пошаговая диагностика и исправление
- Отличите отказ соединения, тайм-аут и ошибку сайтаС компьютера вне серверной сети откройте https://example.com. Если timeout — обычно пакет не достигает ответа; connection refused — на адресе никто не принимает соединение либо его активно отклоняют; HTTP 403/502 — соединение установлено и проблема на уровне веб-сервиса.
- Дополнительная команда по темеLinux · Терминал (Bash)КомандаКлиентский терминал; -I заголовки, -v диагностика, --connect-timeout ограничивает ожидание.
curl -Iv --connect-timeout 8 https://example.com/
- Сверьте публичный адресПроверьте A/AAAA в DNS. Если домен за CDN, публичные IP относятся к CDN, а не напрямую к серверу: важно проверить именно выбранную схему. Если домашний сервер за CGNAT, простой проброс порта на маршрутизаторе может не обеспечить входящий доступ.
- При отсутствии dig используйте nslookup; команды чтенияLinux · Терминал (Bash)КомандаПри отсутствии dig используйте nslookup; команды чтения.
dig +short A example.com; dig +short AAAA example.com
- Проверьте интерфейс и TCP-сокеты на сервереПодключитесь по SSH и посмотрите, на каких IP/портах слушает nginx. 127.0.0.1 означает доступ только с сервера, 0.0.0.0 — IPv4 на всех интерфейсах, [::] — IPv6. Прокси Apache может слушать снаружи, а Nginx — только локально, и это допустимая схема.
- Только чтение, не раскрывайте полный список адресов публичноLinux · Терминал (Bash)КомандаНужен sudoТолько чтение, не раскрывайте полный список адресов публично.
ip -brief address; sudo ss -lntp | grep -E ":(80|443)[[:space:]]"
- Проверьте локальный запрос с нужным Host/SNIHTTP на 127.0.0.1 без Host может попасть в default_server и создать ложную картину. Для точного HTTPS-теста укажите имя и адрес через --resolve; если TLS терминируется на прокси, тестируйте правильный слой.
- Выполнить на самом сервере; замените домен, если Nginx действительно слушает loopback:443Linux · Терминал (Bash)КомандаВыполнить на самом сервере; замените домен, если Nginx действительно слушает loopback:443.
curl -Iv --resolve example.com:443:127.0.0.1 https://example.com/
- Сверьте правила сети без их выключенияПосмотрите действующие правила nftables и отдельную облачную группу безопасности, настройки маршрутизатора и провайдера. Открывайте только необходимый порт для заданного источника по политике безопасности. Не выполняйте команды отключения всего firewall.
- Дополнительная команда по темеLinux · Терминал (Bash)КомандаНужен sudoЕсли используется iptables/ufw/firewalld — смотрите правила в соответствующем средстве; команда чтения.
sudo nft list ruleset
- Исправьте один доказанный барьерЕсли listen настроен неправильно, сохраните конфигурацию и исправьте привязку к нужному интерфейсу. Если блокировка в маршруте — исправьте порт или группу безопасности без перенастройки веб-сервера. После изменения Nginx выполните синтаксическую проверку и reload.Linux · Терминал (Bash)С осторожностьюНужен sudoПрименять только если менялась конфигурация и синтаксическая проверка успешна.
sudo nginx -t && sudo systemctl reload nginxКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
Из независимой внешней сети доступен сайт по имени и HTTPS, правильный сертификат, статус соответствует ожидаемому. Локальный доступ и соседние виртуальные хосты также работают.
#Если проблема не устранена
Если пакеты не приходят до сервера, решайте задачу с сетевым администратором или провайдером. Если TCP доступен, но HTTP выдаёт ошибку, возвращайтесь к серверной конфигурации, а не к NAT.