使用npm包http-proxy实现反向代理

1,486 阅读2分钟

  在服务器端使用反向代理是很常见的事情,这篇文章来教大家如何使用npm包http-proxy来实现反向代理。

  首先说下本篇文章使用反向代理要解决的问题,比如你有一个web服务,和一个后端服务,这两个服务部署在同一台服务器上。但服务器只有一个80端口允许外网访问,这时就没办法让两个服务都能实现外网访问。所以我们需要在80端口上另起一个服务,根据规则来分发前端页面内容的请求和后端接口的请求,实现反向代理。

  具体的代码如下:

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

// 新建一个代理 Proxy Server 对象
var proxy = httpProxy.createProxyServer({});

// 捕获异常
proxy.on('error', function (err, req, res) {
  res.writeHead(500, {
    'Content-Type': 'text/plain'
  });
  res.end('Something went wrong. And we are reporting a custom error message.');
});

// 在每次请求中,调用 proxy.web(req, res config) 方法进行请求分发
var server = require('http').createServer(function(req, res) {
  // 在这里可以自定义你的路由分发
  var host = req.headers.host
  
  switch(host){
    case 'www.alleria.cn':
      proxy.web(req, res, { target: 'http://localhost:3000' });
    break;
    case 'server.alleria.cn':
      proxy.web(req, res, { target: 'http://localhost:9527' });
    break;
    default:
      next();
  }
});

server.listen(80);
console.log("listening on port 80");

  当访问www.alleria.cn的时候,请求就被转发到了3000端口上,请求server.alleria.cn时就被转发到了9527这个端口上,80端口只做请求的分发工作,这样就实现了流量的分发工作。

  用node做服务器的话,推荐大家用pm2来做管理,这样可以把一台服务器上的所有服务都监控起来,利于开发调试,提高系统稳定性。

我的新博客上线了,还在建设中,欢迎大家来交流,吴楠的博客