Вопрос или проблема
У меня есть сервер Ubuntu 22.04 с Plesk Obsidian, на котором настроено несколько виртуальных хостов. Теперь мне нужно вызвать API с моего собственного домена (размещенного на этом сервере): https://www.example.com/api. Когда я делаю это локально на своем ПК, например, используя wget или curl:
wget https://www.example.com/api
Это работает, и я получаю ожидаемый результат. Однако, когда я выполняю ту же команду на своем сервере Plesk через ssh, я получаю ошибку 404.
В качестве теста я также попробовал:
wget https://www.example.com/
И, как и ожидалось, на моем ПК я получаю HTML-файл главной страницы. Но когда я запускаю ту же команду на сервере, я получаю страницу по умолчанию Plesk, которая обычно отображается на вновь созданных доменах.
Похоже, что виртуальные хосты не работают корректно, когда пытаются достичь их с одной и той же машины. Но у меня не было никаких проблем с этим сервером и настройками до сих пор.
Есть идеи?
Оказалось, что проблема заключалась в разрешении IPv6. Принудительное использование IPv4 для wget работает:
wget --inet4-only https://www.example.com/api
Ответ или решение
Решение проблемы с неправильным разрешением Wget на хостинг-домене
Вы столкнулись с проблемой, когда при выполнении команды wget
на вашем сервере с Ubuntu 22.04 и Plesk Obsidian вы получаете ошибку 404, в то время как такая же команда, выполненная на вашем локальном компьютере, работает корректно. Ситуация выглядит следующим образом:
-
При вызове API с локального компьютера:
wget https://www.example.com/api
Вы получаете ожидаемый результат.
-
При вызове API с Plesk-сервера:
wget https://www.example.com/api
Вы получаете ошибку 404.
-
При вызове главной страницы:
wget https://www.example.com/
На локальном компьютере вы видите HTML-код вашей главной страницы, тогда как на сервере отображается стандартная страница Plesk.
Причины проблемы
Судя по всему, проблема заключается в том, что сервер не может правильно разрешить имя домена www.example.com
в контексте виртуальных хостов (vHosts), когда запрос производится с самих серверов. Причиной этого может быть нелогичное поведение сети, связанное с настройками IPv6 и IPv4.
Когда ваш сервер пытается разрешить доменное имя, он может предпочитать использовать IPv6, что приводит к неправильному маршрутизации запросов, особенно если настройка vHosts не поддерживает IPv6.
Решение проблемы
Вы уже выяснили, что принудительное использование IPv4 решает проблему. Это можно сделать с помощью следующей команды:
wget --inet4-only https://www.example.com/api
Рекомендации и дальнейшие действия
-
Проверка конфигурации веб-сервера:
- Убедитесь, что конфигурация вашего веб-сервера (например, Apache или Nginx) правильно настроена для поддержки и IPv4, и IPv6. Возможно, вам придется настроить виртуальные хосты так, чтобы они правильно обрабатывали запросы по обоим протоколам.
-
Проверка DNS-нотаблений:
- Убедитесь, что DNS-записи для вашего домена корректно указывают на правильные IP-адреса сервера. Это важно как для IPv4, так и для IPv6.
-
Настройка параметров сетевого интерфейса:
- Если вы не планируете использовать IPv6, рассмотрите возможность его отключения на уровне интерфейса, чтобы избежать путаницы.
-
Проверка на ошибки конфигурации:
- Проверьте журналы сервера на наличие ошибок при обработке запросов. Это поможет вам лучше понять, почему запросы обрабатываются неправильно.
-
Использование правил маршрутизации:
- Если проблем с IPv6 не избежать, рассмотрите возможность установки правил маршрутизации в вашей сети, чтобы гарантировать, что трафик для определенных ресурсов обрабатывается надлежащим образом.
Заключение
Данная проблема связана с конфликтом между IPv4 и IPv6 в контексте настройки виртуальных хостов на вашем сервере. Принудительное использование IPv4 — это временное, но эффективное решение. Рекомендуется также проработать конфигурацию вашего веб-сервера и DNS-записей для более устойчивого и долгосрочного решения.