用 nodejs 做反向代理服务器
来源:互联网 发布:特朗普 金正恩 知乎 编辑:程序博客网 时间:2024/06/04 17:42
时下不少场景,都是申请一个 VPS 主机来托管运行 Web 项目的,小弟我也不例外——购买了一个小型的 CentOS VPS 使用着。在使用的过程中,面临一个问题,就是同一类型的服务端环境还好——但如果是一个 PHP、一个 ASP、 一个 JSP 的三种类型的服务端项目并存着,该怎么分配唯一的 80 端口呢?因为商业 WWW 网站的话,往往只能占用 80 端口,——当然,如果只是做服务的话,如接口服务之类的,使用了其他端口就不会与 80 端口冲突。因此,许多开发者都会面临到 80 端口这个问题,并且实际情况会受到成本的限制。如果为一个项目就单独买一个 VPS 的话,着实不太经济、不太合算,管理起来也不方便。这样的话,我们就应该好好考虑一下,怎么在提供一个 80 端口的情况下,分发到多种服务端那里去,最终让不同的主机执行各自的 Web 项目。
亲,那么这项需可以实现的吗?是的,这并不是什么“神奇的技术”,也不是什么复杂的技术。不知你是否有了解,网络服务中的“反向代理(Reverse Proxy)”,其中的一个功能就是可以完成端口的分发的。我们不妨以域名为路由分发:凡是 AA.com 域名请求的,分发到 PHP 82 端口执行;凡是 BB.com 域名请求的,分发到 ASP 83 端口执行;…… 如此类推。当然这里的端口只说说明用而已,您可以任意配置,反正就是从 80 端口接收回来的请求,先作一次处理,进而分发。反向代理,通俗地讲,就是左手转右手而已。
每当提起反向代理器,人们通常一想到的就是 Nginx,但是今天我们暂时忽略大名鼎鼎的 Nginx,采用同样也是使用单线程、事件循环的服务端小弟——Node 来达成。首先 Node 采用 JS 作服务端编程,而不是 Nginx 写配置或 Lua,比较符合我的味口,其次自己对 Node 也比较熟悉,配置各方面什么的更为顺手。
完成该项功能的是 node-http-proxy 包。下载、安装请键入:
npm install http-proxy安装完毕后,新建一个 proxy.js 文件,输入:
var http = require('http'), 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.');});// 另外新建一个 HTTP 80 端口的服务器,也就是常规 Node 创建 HTTP 服务器的方法。// 在每次请求中,调用 proxy.web(req, res config) 方法进行请求分发var server = require('http').createServer(function(req, res) { // 在这里可以自定义你的路由分发 var host = req.headers.host, ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; console.log("client ip:" + ip + ", host:" + host); switch(host){ case 'aaaa.com': case 'bbs.aaaa.com': proxy.web(req, res, { target: 'http://xyd.bbbbb.com:82' }); break; case 'vps.cccc.com': proxy.web(req, res, { target: 'http://xyd.bbbbb.com:8080' }); break; case 'dddd.com': case 'www.dddd.com': proxy.web(req, res, { target: 'http://localhost:81' }); break; case 'eeeeee.com.cn': case 'www.eeee.com.cn': proxy.web(req, res, { target: 'http://eeeee.com.cn:8082' }); break; default: res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Welcome to my server!'); }});console.log("listening on port 80")server.listen(80);
除此之外,还可以利用 node-http-proxy 做负载均衡、Websocket (使用 proxy.ws() 语法)等相关的工作。
若说使用代理服务器的代价,可能就是会比不用消耗多的资源,消耗多的 CPU 运算罢了。
使用问题:不能指定文件夹 proxy.web(req, res, { target: 'http://housecn.com.cn:81/foo/' });
可以在一个主机上配置多个网站了:2015--5-28:
switch(host){ case '5222222.com': case 'www.5222222.com':if(req.url.indexOf('/grand') != -1){proxy.web(req, res, { target: 'http://127.0.0.1:8081' }); }else{res.writeHead(302, {// 'Location': 'http://new.5222222.com:8080/grand/' 'Location': 'http://5222222.com/grand/'});res.end();} break; ....}
资源:
- 另外一个 node 反向代理,仅仅 600多行代码,源码:https://github.com/skx/node-reverse-proxy.js
- 另外一个开源作品,国人所写,https://github.com/yiminghe/reverse-proxy,着重解决了 HTTPS 证书的问题(通过pem和SNI)。
- 《用nodejs搭建一个本地反向代理环境》
- 《使用反向代理(NodeJS)调试前端AJAX》
- 用 nodejs 做反向代理服务器
- 用 nodejs 做反向代理服务器
- 抛弃Nginx使用nodejs做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- apache做反向代理服务器
- 【转】apache做反向代理服务器
- 如何使用nginx做反向代理服务器?
- 微服务之使用NodeJS创建HTTP代理服务器(反向代理)
- 反向代理服务器
- mount 命令详解
- 单点登录和权限系统结合注入到自己的系统中
- 集成电路中的assert和deassert应该如何翻译?
- 深度探索Linux操作系统第二章:系统构建和原理解析-工具编译
- A Brief Summary of Yann's "Gradient-Based Learning Applied to Document Recognition"
- 用 nodejs 做反向代理服务器
- The LLDB Debugger
- k-means聚类及C代码实现
- linux系统启动加载流程纪要
- Navicat Premium 11.0.16
- URAL 1905 Travel in Time BFS(广度搜索)
- hdu1728 逃离迷宫 bfs
- Android中asset文件夹与raw文件夹的区别深入解析
- 算法之动态规划(LCS最长公共子序列, edit distance,交叉子串)