Рейтинг:0

Обратный прокси-сервер nginx не работает, когда для REST API определено несколько портов

флаг bd

У меня есть следующее приложение js, которое я развернул на порту 3000 и установил прокси 3000 на nginx.

Теперь у меня есть собственный внутренний сервер Node js, который я хочу запустить на том же сервере с другим портом 5000.

Я устанавливаю nginx так

место расположения / {
        прокси_http_версия 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Обновить $http_upgrade;
        proxy_set_header Соединение «обновление»;
        proxy_set_header Хост $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 $ схема;
        proxy_pass http://localhost:3000;
    }
расположение ^~ /API {
        прокси_http_версия 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Обновить $http_upgrade;
        proxy_set_header Соединение «обновление»;
        proxy_set_header Хост $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 $ схема;
        proxy_pass http://localhost:5000;
            
        }

У меня нет проблем с доступом к приложению на example.com. Я устанавливаю местоположение /api для подключения выборки server.js/api.

когда я получаю вот так

axios.get(example.com/api)

возвращаемая ошибка -- Не удается получить /api/

но когда я устанавливаю прокси-сервер местоположения nginx следующим образом

прокси_пароль http://localhost:5000/;

с косой чертой, его работа и axios успешно извлекают данные.

Но всякий раз, когда я пытаюсь получить другой маршрут из файла server.js, например

axios.get(example.com/api/credential)

Снова показывает ошибку, как это

Не удается ПОЛУЧИТЬ//учетные данные

Возврат с двойной косой чертой // учетные данные

единственный маршрут '/', работающий с server.js путем получения example.com/api

без косой черты на прокси-сервере возвращается ошибка. не может ПОЛУЧИТЬ /api или не может ПОЛУЧИТЬ api/credential

пожалуйста помоги. Заранее спасибо.

Обновлять

я исправил с Ивана отвечать. Теперь у меня новая проблема с этой конфигурацией. Я использую socket.io рядом с axios. Поэтому всякий раз, когда я пытаюсь подключиться через socket.io код моего клиентского сокета ..

импортировать io из "socket.io-client";
const socket = io("https://example.com/api");

и конфигурация сокета сервера..

const io = require("socket.io")(сервер, {
  кор: {
    источник: "*",
  },
});

Теперь, когда страница загружается, консоль регистрирует..

ПОЛУЧИТЬ https://example.com/socket.io?EIO=4&transport=polling&t=O4UTf4l 404 (не найдено)

пожалуйста помоги.

Рейтинг:0
флаг gr

Как правило, вы всегда должны предпочитать

местоположение /префикс/ {
    ...
}

над

местоположение/префикс {
    ...
}

если вы не проксируете одну конечную точку API, а не весь API (или другое веб-приложение). Когда вы используете префикс URI с proxy_pass директива (т. прокси_пароль http://localhost:5000/; скорее, чем proxy_pass http://localhost:5000;, завершающая косая черта здесь считается префиксом URI), nginx удалит префикс, указанный в место расположения директиву из вашего URI запроса и добавьте к ней префикс, указанный в proxy_pass. Использовать

расположение ^~ /api/ {
    ...
    прокси_пароль http://localhost:5000/;
}

и ваш /API/учетные данные URI запроса будет правильно передан вашему восходящему потоку как /учетные данные.

Irfan Habib avatar
флаг bd
Привет Иван. Спасибо за Ваш ответ. Я помог мне, и вы спасли мой день. Теперь у меня есть новый issu с socket.io. Пожалуйста, смотрите обновленный вопрос.
Ivan Shatsky avatar
флаг gr
Я думаю, вы должны использовать другой префикс для связи через веб-сокет, например. `/ws`, а не смешивать его с вызовами `/api`. Вы также должны проксировать соединения WebSocket [особым образом] (http://nginx.org/en/docs/http/websocket.html), однако вы уже сделали это в своей конфигурации. К сожалению, `socket.io` не входит в мою компетенцию, рассмотрите возможность задать это как отдельный вопрос, возможно, StackOverflow будет более подходящим сайтом для этого.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.