Вопрос или проблема
Я озадачен следующей ситуацией. Мой VPS на Ubuntu 24.04 отвечает на curl http://localhost:80
сообщением «404 страница не найдена», но никакой процесс не слушает на порту 80 (sudo lsof -i :80
), поэтому я ожидал, что curl сообщит о сбое подключения.
Я не помню точный порядок событий, но всё работало нормально, контейнеризированный сервер nginx слушал на порту 80. Я не помню, почему перезагрузил сервер — из-за проблемы с SSL-сертификатами или потому что установил пакеты — но после перезагрузки (возможно, до) началась эта странность.
После перезагрузки ранее неактивный сервер Caddy (который, как я думаю, я установил для теста некоторое время назад) занял порт 80.
Я убил процесс и удалил Caddy с хост-машины с помощью sudo apt remove caddy
. На системе больше нет бинарного файла Caddy. sudo systemctl status caddy.service
показывает, что служба «неактивна (умерла)».
Я перезагрузил сервер несколько раз с тех пор и даже обновил ОС. По какой-то причине сервер все еще существует, возможно, удаленный хост-машина Caddy каким-то образом отвечает на запросы на порту 80, хотя я не вижу никакого процесса, слушающего на этом порту.
Теперь, когда я запускаю контейнеризированный сервер Caddy, я могу связать его с 0.0.0.0:80/443 и lsof показывает процесс как слушающий. Так что система, похоже, не считает, что порт 80 используется.
Однако, независимо от того, запущен ли новый контейнер Caddy или нет и независимо от того, возвращает ли lsof процесс, слушающий на порту 80 (и fuser/netstat/…), curl localhost
возвращает «404 страница не найдена» (аналогично telnet).
Я не понимаю сетевого взаимодействия в Linux и действительно не понимаю, что происходит. Буду признателен за любые подсказки. Заранее спасибо!
EDIT
Я поэкспериментировал.
-
curl localhost:80
безsudo lsof -i :80
, не показывающего ничего; возвращает «404 страница не найдена» -
curl <публичный ip по ip -4 addr>:80
без lsof, не показывающего ничего; возвращает «404 страница не найдена» -
curl localhost:80
с сервером nginx, обслуживающим тестовую страницу на порту 80 (docker run -p 80:80 -v $PWD:/usr/share/nginx/html:ro nginx:latest
); возвращает тестовую страницу -
curl 127.0.0.1:80
с тестовым сервером nginx; возвращает «404 страница не найдена» -
curl <публичный ip>:80
с сервером nginx, обслуживающим тестовую страницу на порту 80 (docker run -p 80:80 ...
); возвращает «404 страница не найдена» -
curl localhost:3000
без lsof, не показывающего ничего; возвращает «Не удалось подключиться к серверу» -
curl localhost:3000
с сервером nginx, обслуживающим тестовую страницу на порту 3000 (docker run -p 3000:80 ...
); возвращает тестовую страницу -
curl <публичный ip>:3000
с сервером nginx, обслуживающим тестовую страницу на порту 3000 (docker run -p 3000:80 ...
); возвращает тестовую страницу
Результаты тестов 3, 6, 7, 8 ожидаемы, в то время как 1, 2, 4 и 5 не имеют для меня смысла. Обратите внимание, что тест 3 предполагает, что то, что я говорил ранее о том, что сервер не может обслуживать запросы на localhost:80, не совсем верно (возможно, я не уделил этому достаточного внимания). Основная проблема остается без изменений, что-то отвечает, хотя lsof не показывает ничего. Кроме того, наблюдается действительно странное поведение, которое я не могу объяснить (см., например, пункты 3 и 4). Могла ли проблема быть на стороне провайдера хостинга?
Ответ или решение
Анализ проблемы: Сервер отвечает на запросы, но процесс не слушает на этом порту
Введение
Ваша ситуация на Ubuntu 24.04 VPS, когда запросы к локальному серверу на порту 80 возвращают "404 page not found", несмотря на отсутствие слушающего процесса на этом порту, действительно вызывает недоумение. Давайте подробно проанализируем данную проблему, выделяя возможные причины и рекомендации по их устранению.
Описание ситуации
Согласно предоставленной информации, вы наблюдаете следующие ключевые моменты:
- Сервер отвечает на запросы к
http://localhost:80
, но при этом нет процесса, который бы слушал на этом порту. - После перезагрузки машина испытывает проблемы с сервером Caddy, который, по всей видимости, некорректно освободил порт 80 после удаления.
- Docker-изображения, связанные с Caddy и Nginx, корректно работают на других портах, что подтверждено успешными запросами.
Возможные причины проблемы
-
Кэширование или прокси-сервер: Возможно, на вашем хостинг-провайдере или на уровне сетевого оборудования используется прокси-сервер, который может кэшировать старые ответы или перенаправлять запросы. Это объясняет, почему вы получаете "404 page not found", несмотря на то, что на вашем сервере не запущены процессы.
-
Сетевые настройки и iptables: Проверьте настройки брандмауэра (iptables) на вашем сервере, который может перехватывать пакеты и перенаправлять их к другому сервису. Используйте команду
sudo iptables -L -n -v
для проверки. -
Отложенные процессы: В редких случаях, после удаления процесса, на системе могут сохраняться «завершающиеся» процессы, которые продолжают обрабатывать запросы на уровне сети, даже если сам процесс уже не существует. Это можно проверить с помощью
sudo netstat -tulnp
илиsudo ss -tulnp
. -
DNS или конфигурация сетевых интерфейсов: Убедитесь, что конфигурация сети на сервере верная, а также проверьте, не кэширует ли DNS-резолвер старые записи.
Рекомендации по устранению проблемы
-
Перезагрузка сетевых интерфейсов: Попробуйте перезагрузить сетевые интерфейсы с помощью команды
sudo systemctl restart networking
. -
Проверка конфигураций: Убедитесь, что конфигурации веб-серверов (например, Nginx или Caddy) на самом деле не запускаются автоматически при загрузке.
-
Логи: Проверьте логи системного журнала (
/var/log/syslog
или/var/log/messages
) и логи веб-сервера на наличие ошибок, которые могут указать на проблему со службой. -
Тестирование на новом порту: Чтобы убедиться, что текущие конфигурации работают правильно, протестируйте запустить другой экземпляр Nginx на тестовом порту, таком как 8080. Это даст возможность Исследовать поведение сервера вне порта 80.
-
Контакт с хостинг-провайдером: Если ни одна из вышеупомянутых рекомендаций не помогает, стоит обратиться в службу поддержки вашего провайдера. Возможно, на их стороне есть дополнительные механизмы, которые могут влиять на поведение вашего сервера.
Заключение
Ваша проблема с неожиданным ответом сервера, когда никакого процесса на порту 80 не запущено, может быть вызвана несколькими причинами, начиная от проблем с конфигурацией и заканчивая сетевыми вопросами. Изучите предлагаемые рекомендации для устранения ситуации, а также не забудьте задействовать поддержку вашего хостинг-провайдера, если проблема будет сохраняться. Будьте внимательны при выполнении этих действий, чтобы избежать потенциальных перебоев в работе вашего сервера.