一台主机就只跑一个node服务有点暴舔天物了.主流的方案是使用nginx做代理, 但是我懒学nginx, 于是尝试了一下用nodejs做反向代理.
正片开始
本次会用到 http-proxy 它同时支持http和https
1.下载http-proxy
yarn add -D http-proxy
这货周下载量超百万, 看样子和我臭味相投人不少😁
2.开始写我们的代理服务
const http = require('http')
const http_proxy = require('http-proxy');
const proxy_server = http_proxy.createProxyServer({});
// 捕获异常
proxy_server.on('error', function (err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong.');
});
// 这里是一个普通的http服务, 通过host(域名)来判断要发给哪个服务
const server = http.createServer((req, res) => {
const {host} = req.headers;
switch(host){
case 'www.foo.com':
// 通过proxy_server.web来转发到实际的服务
proxy_server.web(req, res, { target: 'http://localhost:4001' });
break;
case 'www.bar.com':
proxy_server.web(req, res, { target: 'http://localhost:4002' });
break;
default:
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello Wrold!');
}
});
console.log("listening on port 80")
server.listen(80);
下面是https的写法
1.创建代理服务
和http不同之处在于要加上证书
const https = require("https");
const ssl = {
key: fs.readFileSync('valid-ssl-key.pem', 'utf8'),
cert: fs.readFileSync('valid-ssl-cert.pem', 'utf8')
}
const secure_proxy_server = httpProxy.createServer({
ssl,
secure: true
})
// 异常捕获
// ...
const https_server = https.createServer(ssl, (req, res) => {
switch(host){
case 'www.baz.com':
// 同样通过secure_proxy_server.web来转发到实际的服务
secure_proxy_server.web(req, res, { target: 'https://localhost:4003' });
break;
// ...
}
});