检查在新端口上运行的应用

时间:2015-07-06 19:36:09

标签: javascript node.js express node-http-proxy node-request

我需要创建获取特定端口请求并将其代理到不同端口上的新服务器的应用程序

例如,以下端口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中,因为此端口已被占用。有解决方法吗?

1 个答案:

答案 0 :(得分:2)

代理服务器的各种用法很少examples。以下是基本代理服务器的简单示例:

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,您不会看到此类标头,因为客户端正在绕过代理服务器并且该标头永远不会设置。