nginx не совпадает с местоположением при вызове с другого компьютера в сети.

Вопрос или проблема

У меня есть сервис, работающий на 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.

Причины и Диагностика

  1. DNS-Разрешение. Убедитесь, что все устройства в вашей сети корректно разрешают доменное имя pizza.pi в IP-адрес вашей Raspberry Pi. Для этого вы можете добавить соответствующую запись в файл hosts на других устройствах или использовать локальный DNS-сервер.

  2. Конфигурация Nginx:

    • Server Name: Убедитесь, что server_name соответствует именам, которые устройства используют для доступа к сервису. Если ваши устройства пытаются подключиться по IP, добавьте default_server в блок server.
    • Путь: Проверьте, чтобы в конфигурации пути не было опечаток и ошибок с порядком директив. Попробуйте изменять и тестировать с и без директивы rewrite.
  3. Файрвол и Сетевые Правила: Поскольку доступ по адресу http://pizza.pi:3000/my-dashboard осуществляется без проксирования, возможно, существует проблема с сетевыми правилами или файрволом, которая блокирует запросы к порту 80 извне. Проверьте правила iptables или ufw.

Решения

  1. Проверка и Коррекция Конфигурации 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, так и с других устройств.

  2. Проверка DNS и Хостов:

    • Добавьте в файл /etc/hosts запись 172.XX.XX.XX pizza.pi на каждом клиентском устройстве, где 172.XX.XX.XX — реальный IP Raspberry Pi.
    • Или настройте DNS-сервер локальной сети с целью разрешения pizza.pi на нужный IP.
  3. Проверка Файрвола:

    • Убедитесь, что порты 80 и 3000 открыты для входящих соединений, используя команды проверки iptables или утилиту UFW.
    • Для теста временно отключите файрвол и проверьте доступность сервиса.

Заключение

Через эти шаги можно эффективно выявить и устранить проблему. Если после трансформации конфигурации Nginx и проверок сетевых правил ситуация не изменится, возможно, стоит глубже изучить проблематику на уровне конкретных сетевых настроек вашего оборудования.

Если у вас остались вопросы или возникли дополнительные сложности, не стесняйтесь обратиться за дальнейшей помощью.

Оцените материал
Добавить комментарий

Капча загружается...