Вопрос или проблема
У меня есть сервис, работающий на Docker на порту 3000 внутри Raspberry Pi. Я добавил обратный прокси на nginx, чтобы обслуживать этот сервис.
server {
listen 80;
server_name pizza.pi;
location /my-dashboard {
# Передача запросов бекенд-сервису
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
# WebSocket и другие заголовки
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Обеспечиваем правильную передачу пути
rewrite ^/my-dashboard(/.*)$ $1 break;
}
}
Когда я захожу на http://pizza.pi/my-dashboard
с самого Raspberry Pi, я вижу, что сервис (NextJS) работает корректно. Однако, когда я пытаюсь получить доступ к этому же URL с другого компьютера в сети, я получаю 404 и вижу следующие логи в nginx:
[debug] 16756#16756: *45 test location: "/"
[debug] 16756#16756: *45 using configuration "/"
...
[debug] 16756#16756: *45 http script var: "/my-dashboard"
[debug] 16756#16756: *45 trying to use file: "/my-dashboard" "/var/www/html/my-dashboard"
[debug] 16756#16756: *45 http script var: "/my-dashboard"
[debug] 16756#16756: *45 trying to use dir: "/my-dashboard" "/var/www/html/my-dashboard"
[debug] 16756#16756: *45 trying to use file: "=404" "/var/www/html=404"
[debug] 16756#16756: *45 http finalize request: 404, "/my-dashboard?" a:1, c:1
[debug] 16756#16756: *45 http special response: 404, "/my-dashboard?"
[debug] 16756#16756: *45 http set discard body
[debug] 16756#16756: *45 HTTP/1.1 404 Not Found
Тем не менее, сервис доступен в сети, если я указываю порт http://pizza.pi:3000/my-dashboard
, но в этом случае я не вижу никаких логов в nginx, что говорит о том, что nginx как-то обходит это (это только предположение, так как я не очень знаком с такими конфигурациями).
Я пытался поиграть с завершающими слэшами в конфигурации, но безуспешно.
Что я упускаю? Как я могу сделать так, чтобы http://pizza.pi/my-dashboard
работал с любого устройства в сети?
Ответ или решение
Для решения проблемы, связанной с некорректной работой Nginx на Raspberry Pi при обращении с другого устройства в сети, необходимо тщательно рассмотреть несколько возможных причин и решений. Давайте анализировать шаг за шагом.
Фон и Текущее Состояние
У вас настроен Nginx для работы в качестве обратного прокси на Raspberry Pi, который перенаправляет запросы для вашего сервиса, работающего на порте 3000 в Docker. Конфигурация позволяет корректный доступ по адресу http://pizza.pi/my-dashboard
только с самого Raspberry Pi, однако другие устройства в сети получают ошибку 404.
Причины и Диагностика
-
DNS-Разрешение. Убедитесь, что все устройства в вашей сети корректно разрешают доменное имя
pizza.pi
в IP-адрес вашей Raspberry Pi. Для этого вы можете добавить соответствующую запись в файл hosts на других устройствах или использовать локальный DNS-сервер. -
Конфигурация Nginx:
- Server Name: Убедитесь, что
server_name
соответствует именам, которые устройства используют для доступа к сервису. Если ваши устройства пытаются подключиться по IP, добавьтеdefault_server
в блокserver
. - Путь: Проверьте, чтобы в конфигурации пути не было опечаток и ошибок с порядком директив. Попробуйте изменять и тестировать с и без директивы
rewrite
.
- Server Name: Убедитесь, что
-
Файрвол и Сетевые Правила: Поскольку доступ по адресу
http://pizza.pi:3000/my-dashboard
осуществляется без проксирования, возможно, существует проблема с сетевыми правилами или файрволом, которая блокирует запросы к порту 80 извне. Проверьте правила iptables или ufw.
Решения
-
Проверка и Коррекция Конфигурации Nginx:
server { listen 80 default_server; server_name pizza.pi; location /my-dashboard { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Удалите директиву
rewrite
и тестируйте без неё. Добейтесь одинаковой реакции как для обращения с Raspberry Pi, так и с других устройств. -
Проверка DNS и Хостов:
- Добавьте в файл
/etc/hosts
запись172.XX.XX.XX pizza.pi
на каждом клиентском устройстве, где172.XX.XX.XX
— реальный IP Raspberry Pi. - Или настройте DNS-сервер локальной сети с целью разрешения
pizza.pi
на нужный IP.
- Добавьте в файл
-
Проверка Файрвола:
- Убедитесь, что порты 80 и 3000 открыты для входящих соединений, используя команды проверки iptables или утилиту UFW.
- Для теста временно отключите файрвол и проверьте доступность сервиса.
Заключение
Через эти шаги можно эффективно выявить и устранить проблему. Если после трансформации конфигурации Nginx и проверок сетевых правил ситуация не изменится, возможно, стоит глубже изучить проблематику на уровне конкретных сетевых настроек вашего оборудования.
Если у вас остались вопросы или возникли дополнительные сложности, не стесняйтесь обратиться за дальнейшей помощью.