proxy代理

什么是proxy(代理)

代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。

代理分类

代理主要分为两大类,正向代理和反向代理。

  • 正向代理:
    通过一个连接了外网的服务器作为中转站,帮助或代理区域网内的用户访问外网。这个连接了外网的服务器叫做正向代理服务器。

  • 反向代理:
    通过访问一个内网的代表,我们能访问到这整个内网内的数据。这个代表就称作反向代理服务器。

正向代理和反向代理的区别

正向代理时,用户在url栏中访问的是直接目标,并不需要关心代理服务器是什么。
反向代理时,用户访问的目标是反向代理服务器,这个反向代理服务器会从内网中拿取数据再传给用户,但用户并不知道这些数据其实并不是反向代理服务器本身的

应用

设置正向代理

一般我们在公司里需要通过一台连接到外网的服务器作为代理来访问外网。怎么给我们自己设置这个代理服务器呢?
一图顶千言


image

image

代理

我们通常所说的代理是指正向代理,嗯。。能帮助我们做一些不可描述的事情♂。

一般来说一个代理软件会改变我们本地的host指向,当我们在url中输入一个网址(域名)时,先会解析到代理服务器上(这个服务器要和我们的目标网址连的上),然后才是代理服务器帮助我们向用户的目标地址发起请求,当得到目标地址响应后代理服务器再转将响应信息传输给客户端。

let http = require('http');
let proxy = require('http-proxy');
let proxyServer = proxy.createProxyServer();
let {inspect} = require('util');

// 代理服务器
let server = http.createServer(function(req,res){
    proxyServer.web(req,res,{
        target:'http://localhost:9999'
    })
    proxy.on('error', function (err) {
        console.log(inspect(err));
        res.end('somthing wrong');
    });
}).listen(8888)

//--- --- ---

// 目标地址服务器
let http = require('http');

let server = http.createServer(function(req,res){
  res.write('9999,');
  res.end('9999');
}).listen(9999);

proxyServer.web()方法实现思路

function web(req,res,options){
  let {host,port,pathname} = url.parse(req.url);

  let opts = {
    host
    ,port
    ,method:req.method
    ,path:pathname
    ,header:req.headers
  };
  opts.host = options.target;
  console.log('-----------')
  http.request(opts,function(response){
    console.log(response);
    response.pipe(res);
  });
}

虚拟机

服务器与虚拟主机

首先我们来看看服务器和虚拟主机的区别
以阿里云等为例,
弹性计算云服务器 ECS:一个完整的服务器
虚拟主机:你得到的只是此服务器上的一个目录

这里有个问题,一台ECS上能创建多个虚拟主机(网站),但我们访问的时候都是通过同一个端口号访问的,众所周知,一个端口只能有一个程序,这么多个站点怎么就会不报错呢?

这就是通过反向代理来实现了。

虚拟机与反向代理

下面我们通过一个简单的示例来演示反向代理怎么来实现虚拟机的。

为了演示,首先我们在etc下的hosts添加两个解析


image
www.a.com http://localhost
www.b.com http://localhost

可以看到,这两个解析都指向localhost,同一台服务器
为了在同一台服务器上通过访问不同域名访问到应该指向的网站,我们需要讲域名进行一个映射,映射到服务器上不同的端口号上

[tip] req.headers['host']长这样


image

这样我们再访问不同站点时,只需从req中拿到的host,再根据host查找到映射到的那个端口就可以找到运行在该端口上的站点。

示例源码

let http = require('http');
let proxy = require('http-proxy');
let proxyServer = proxy.createServer();

let config = {
  "www.a.com":"http://localhost:8080"
  ,"www.b.com":"http://localhost:9000"
};
let server = http.createServer(function(req,res){
  let host = req.headers['host'];
  console.log(host);
  let target = config[host];
  console.log(target);
  if(target){
    proxyServer.web(req,res,{
      target
    })
  }else{
    res.end(host);
  }

}).listen(80);

//--- --- ---

// a.com
let http = require('http');

let server = http.createServer(function(req,res){
  res.end('8080');
}).listen(8080);

//b.com
let http = require('http');

let server = http.createServer(function(req,res){
  res.end('9000');
}).listen(9000);

请求报文中的user-agent

此代理非彼代理,这里是指客户端(浏览器和操作系统计算机硬件)的一些信息。我们可通过req.headers['user-agent']拿到这些信息,并根据这些信息对我们的应用进行一定的定制优化。

let http = require('http');
let userAgentParser = require('user-agent-parser');
let server = http.createServer(function(req,res){
  let userAgent = req.headers['user-agent'];
  console.log(userAgent);
  let userAgentObj = userAgentParser(userAgent);
  console.log(userAgentObj);
}).listen(8080);

<<< userAgentObj
{ browser: { name: 'Chrome', version: '64.0.3282.186', major: '64' },
  engine: { name: 'WebKit', version: '537.36' },
  os: { name: 'Windows', version: '7' },
  device: { model: undefined, vendor: undefined, type: undefined },
  cpu: { architecture: 'amd64' } }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容