Проверьте приложение, работающее на новом порту

Мне нужно создать приложение, которое получает запрос на определенный порт и проксирует его на новый сервер на другом порту.

например, следующий порт 3000 будет прокси-сервером для порта 9000, и вы фактически запустите приложение на 9000 (под капотом), так как пользователь в клиенте нажимает на 3000

http://localhost:3000/a/b/c

http://localhost:9000/a/b/c

Я пытаюсь что-то вроде

var proxy = httpProxy.createProxyServer({});

            http.createServer(function (req, res) {

                var hostname = req.headers.host.split(":")[0];
                var pathname = url.parse(req.url).pathname;
                proxy.web(req, res, {
                        target: 'http://' + hostname + ':' + 9000
                    });
     var proxyServer = http.createServer(function (req, res) {

                    res.end("Request received on " + 9000);
                });
                proxyServer.listen(9000);

            }).listen(3000, function () {

     });
  1. Это правильный способ сделать это?
  2. Как я могу проверить это? Я спрашиваю, поскольку, если я запускаю приложение узла на порту 3000, я не могу указать первый URL-адрес в клиенте http://localhost:3000/a/b/c, так как этот порт уже занят. Есть ли обходной путь?

person Community    schedule 06.07.2015    source источник


Ответы (1)


Существует несколько примеров различного использования прокси-сервера. Вот простой пример базового прокси-сервера:

var http = require("http");
var httpProxy = require('http-proxy');

/** PROXY SERVER **/
var proxy = httpProxy.createServer({
  target:'http://localhost:'+3000,
  changeOrigin: true
})

// add custom header by the proxy server
proxy.on('proxyReq', function(proxyReq, req, res, options) {
  proxyReq.setHeader('X-Special-Proxy-Header', 'foobar');
});

proxy.listen(8080);

/** TARGET HTTP SERVER **/
http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });

  //check if the request came from proxy server
  if(req.headers['x-special-proxy-header'])
    console.log('Request received from proxy server.')

  res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
  res.end();
}).listen(3000);

Чтобы проверить, работает ли прокси-сервер или поступает ли запрос с прокси-сервера:

Я добавил прослушиватель proxyReq, который добавляет собственный заголовок. Из этого заголовка можно определить, пришел ли запрос с прокси-сервера.

Итак, если вы посетите http://localhost:8080/a/b/c, вы увидите, что req.headers имеет такой заголовок:

'X-Special-Proxy-Header': 'foobar'

Этот заголовок устанавливается только тогда, когда клиент делает запрос на порт 8080.

Но для http://localhost:3000/a/b/c вы не увидите такого заголовка, потому что клиент обходит прокси-сервер и этот заголовок никогда не устанавливается.

person hassansin    schedule 06.07.2015
comment
Спасибо, проголосовали за! но как мне это проверить, не могли бы вы объяснить? - person ; 07.07.2015
comment
Спасибо, Хассасин! Проголосовал! последний вопрос: теперь, когда у меня есть новый сервер, мне нужно вручную переключиться на новый порт прокси, как мне под капотом направить вызов на новый порт? - person ; 07.07.2015
comment
В приведенном выше примере просто замените 8080 на 3000 и 3000 на 9000. - person hassansin; 07.07.2015
comment
Спасибо, но когда я нажимаю на localhost:3000, я получаю json-хост: localhost:3000, мне не нужно получать 9000? - person ; 07.07.2015
comment
Я понимаю. вы можете установить proxyReq.setHeader('host','localhost:9000'), но для этого может быть лучший способ. Я посмотрю на это. - person hassansin; 07.07.2015