使用Node.js 实现反向代理

租用一个阿里云服务器,服务器上运行多个项目,eg:AA.com, BB.com, CC.com。如何以域名作为分发,让来自AA的请求分发到指定的端口,其他BB或CC的请求分发到其他端口上。
可以利用反向代理的技术,即通过从80端口接口回来的请求,根据域名进行处理,然后进而分发。
一般来说,我们使用Nginx作为反向代理.这里我们使用Node.js来代替Nginx来完成反向代理的功能

目前Node中用于代理的模块有http-proxy, anyproxy

http-proxy实现反向代理

安装http-proxy

npm install http-proxy --save

这里使用http-proxy,新建一个index.js,输入如下代码

require('babel-polyfill')
require('babel-register')
const http = require('http')
const httpProxy = require('http-proxy')
// 创建一个Proxy Server对象
const proxy = httpProxy.createProxyServer({})
// 捕获异常
proxy.on('error', () => {
res.writeHead(500, {
'Content-Type': 'text/plain'
})
res.end('服务端错误')
})
const server = http.createServer((req, res) => {
const host = req.headers.host
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress
console.log(`your ip is ${ip},host is ${host}`)
switch (host){
case 'nekomiao.me':
case 'www.nekomiao.me':
proxy.web(req, res, { target: 'http://localhost:8080' })
break;
case 'test.nekomiao.com':
proxy.web(req, res, { target: 'http://localhost:8081' })
break
default:
res.writeHead(200, {
"Content-Type": 'text/plain'
})
res.end('welcome to my server')
}
})
console.log('listening to port 80')
server.listen(80)

http中默认的端口的是80,如果监听80的话,那么浏览器输入地址就可以不用带端口。

在shell中执行如下命令:

sudo node index.js

  • 注意: Mac系统自带的Apache会占用80端口

在shell中输入如下命令,停止80端口的占用

sudo /usr/sbin/apachectl stop

域名解析

设置完之后,用户想要在浏览器输入test.nekomiao.me实现跳转到localhost:8081,还需要进行域名设置。
如果是阿里云,直接在设置如下:

记录类型 主机记录 记录值
A test 服务器公网IP

即可。