Вопрос или проблема
Я в замешательстве из-за следующей ситуации. Мой VPS на Ubuntu (22.04 LTS, но с тех пор как возникла проблема, я обновился до 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, но я действительно не понимаю, что происходит. Любые подсказки будут оценены. Заранее спасибо!
Ответ или решение
Ваша ситуация действительно необычна и может возникнуть по нескольким причинам. Давайте разберем её по шагам, чтобы выявить потенциальные проблемы и возможные решения.
1. Понимание ситуации
Вы упомянули, что после перезагрузки системы сервер, вероятно, был "захвачен" ранее установленным Caddy, который после этого был удален. Однако даже после его удаления и нескольких перезагрузок, вы продолжаете получать ответ на запросы на порт 80 (HTTP) в форме "404 page not found", хотя не наблюдается активного процесса, слушающего этот порт.
2. Проверка процесса на порту 80
Первым делом, убедитесь, что действительно нет процессов, использующих порт 80. Команда, которую вы использовали (sudo lsof -i :80
), является правильной, но стоит также проверить с помощью других инструментов:
sudo netstat -tuln | grep ':80'
или
sudo ss -tuln | grep ':80'
3. Возможные причины проблемы
a. Неправильное кеширование:
Иногда кеш браузера или прокси-сервер (если он настроен) может воздействовать на запросы, поэтому попробуйте использовать curl
с параметром -i
, чтобы получить более полную информацию о заголовках ответа:
curl -i http://localhost:80
b. IPTables или другие правила брандмауэра:
Возможность, что ваши настройки брандмауэра могут перенаправлять запросы или блокировать процесс:
sudo iptables -L -n -v
c. Docker:
Поскольку вы упомянули использование контейнеров, убедитесь, что другие настройки сети Docker обычно не конфликтуют с хост-процессами. Используйте следующие команды, чтобы проверить состояние контейнеров:
docker ps
4. Дополнительная диагностика
a. Проверка конфигурации Nginx или Caddy:
Проверьте, нет ли в конфигурации Nginx (или Caddy) неправильно настроенных обратных прокси, которые могут перенаправлять запросы. Возможно, при настройке контейнера не указаны правильные параметры.
b. Лог-файлы:
Просмотрите лог-файлы веб-сервера и системы:
cat /var/log/nginx/error.log
cat /var/log/syslog
Это может дать подсказки о том, что происходит с запросами.
5. Решение проблемы
Если вышеуказанные шаги не помогли, попробуйте следующие решения:
- Выполните перезагрузку конфигураций сети:
sudo systemctl restart networking
- Обновите и переустановите веб-сервер (если это Nginx или Caddy):
sudo apt update
sudo apt install --reinstall nginx
- Проверьте дополнительные системные службы, которые могут прослушивать порт 80, такие как php-fpm или другие, которые могли быть инсталлированы ранее.
Заключение
Ошибка "404 page not found" на порту 80 может указывать на наличие веб-сервера, который не обрабатывает запросы должным образом, или на тот факт, что веб-сервер неправильно настроен. После выполнения всех вышеуказанных шагов вы должны получить более четкое понимание ситуации. Обратите внимание на конфигурации, лог-файлы и процессы, так как они могут дать полезные подсказки.
Если проблема продолжает сохраняться, рассмотрите возможность создания резервной копии данных и переустановки ОС, что может устранить все возможные конфликты, однако это крайняя мера и должна рассматриваться как последняя инстанция.