Назад | Перейти на главную страницу

Нет маршрута к порту 80, пока HTTPS работает

Я не могу понять, как это исправить. Всякий раз, когда я пытаюсь открыть веб-сайт по HTTP, я получаю что-то вроде:

$ wget example.com
Connecting to example.com (example.com)|<IP_HERE>|:80... failed: No route to host.

Между тем HTTPS работает нормально:

$ wget https://example.com
Connecting to example.com (example.com)|<IP_HERE>|:443... connected.

Конечно, в первую очередь я обратил внимание на конфигурацию брандмауэра и nginx. Тем не мение, ufw показывает порт 80 как уже открытый:

$ ufw allow http
Skipping adding existing rule
Skipping adding existing rule (v6)

... и логика перенаправления на HTTPS в моей конфигурации nginx кажется мне довольно хорошей:

listen 80; # managed by Certbot

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

if ($scheme != "https") {
    return 301 https://$host$request_uri;
} # managed by Certbot

Я тоже пробовал nmap-сервера (Ubuntu 16.04) как с самого компьютера (nmap localhost) и с внешней точки (nmap <ip-here>). Удивительно, но HTTP вроде бы закрыт из внешнего источника. Отключение брандмауэра тоже не помогло. netstat -lnp | grep "80" показывает мне, что nginx действительно прослушивает порт 80:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      8845/nginx -g daemo

В журналах nginx ничего не написано.

Я не уверен, где еще искать. Я не могу точно определить эту проблему.

При перезапуске сервера я обнаружил, что с nginx что-то не так (запустить его не удалось).

Я тогда посмотрел на journalctl -xe и обнаружил, что в nginx отсутствует одна из зависимостей для отдельной конфигурации nginx (php7.0-mbstring), что мешало его запуску. Странно то, что nginx -t и перезапуск nginx через systemd не обнаружил эту ошибку до перезапуска.

После перезапуска я убедился, что установил недостающую PHP-зависимость. Это заставило nginx правильно запуститься, и с этого момента HTTP-трафик перенаправлялся на HTTPS.

Я предполагаю, что суть этой проблемы заключается в том, что необходимо перезапустить какой-то процесс PHP (возможно, php7.0-fpm, Я действительно не знаком с экосистемой PHP), чтобы nginx заметил изменение зависимости, и что сочетание этих двух проблем привело к действительно неожиданным последствиям.