proxy代理

什么是proxy(代理)

代理(英語(yǔ):Proxy)隅居,也稱網(wǎng)絡(luò)代理曹铃,是一種特殊的網(wǎng)絡(luò)服務(wù)署浩,允許一個(gè)網(wǎng)絡(luò)終端(一般為客戶端)通過(guò)這個(gè)服務(wù)與另一個(gè)網(wǎng)絡(luò)終端(一般為服務(wù)器)進(jìn)行非直接的連接扮休。一些網(wǎng)關(guān)蔗怠、路由器等網(wǎng)絡(luò)設(shè)備具備網(wǎng)絡(luò)代理功能。一般認(rèn)為代理服務(wù)有利于保障網(wǎng)絡(luò)終端的隱私或安全它匕,防止攻擊展融。

代理分類

代理主要分為兩大類,正向代理和反向代理豫柬。

  • 正向代理:
    通過(guò)一個(gè)連接了外網(wǎng)的服務(wù)器作為中轉(zhuǎn)站告希,幫助或代理區(qū)域網(wǎng)內(nèi)的用戶訪問(wèn)外網(wǎng)。這個(gè)連接了外網(wǎng)的服務(wù)器叫做正向代理服務(wù)器烧给。

  • 反向代理:
    通過(guò)訪問(wèn)一個(gè)內(nèi)網(wǎng)的代表燕偶,我們能訪問(wèn)到這整個(gè)內(nèi)網(wǎng)內(nèi)的數(shù)據(jù)。這個(gè)代表就稱作反向代理服務(wù)器础嫡。

正向代理和反向代理的區(qū)別

正向代理時(shí)指么,用戶在url欄中訪問(wèn)的是直接目標(biāo),并不需要關(guān)心代理服務(wù)器是什么。
反向代理時(shí)伯诬,用戶訪問(wèn)的目標(biāo)是反向代理服務(wù)器晚唇,這個(gè)反向代理服務(wù)器會(huì)從內(nèi)網(wǎng)中拿取數(shù)據(jù)再傳給用戶,但用戶并不知道這些數(shù)據(jù)其實(shí)并不是反向代理服務(wù)器本身的姑廉。

應(yīng)用

設(shè)置正向代理

一般我們?cè)诠纠镄枰ㄟ^(guò)一臺(tái)連接到外網(wǎng)的服務(wù)器作為代理來(lái)訪問(wèn)外網(wǎng)。怎么給我們自己設(shè)置這個(gè)代理服務(wù)器呢翁涤?
一圖頂千言


image

image

代理

我們通常所說(shuō)的代理是指正向代理桥言,嗯。葵礼。能幫助我們做一些不可描述的事情♂号阿。

一般來(lái)說(shuō)一個(gè)代理軟件會(huì)改變我們本地的host指向,當(dāng)我們?cè)趗rl中輸入一個(gè)網(wǎng)址(域名)時(shí)鸳粉,先會(huì)解析到代理服務(wù)器上(這個(gè)服務(wù)器要和我們的目標(biāo)網(wǎng)址連的上)扔涧,然后才是代理服務(wù)器幫助我們向用戶的目標(biāo)地址發(fā)起請(qǐng)求,當(dāng)?shù)玫侥繕?biāo)地址響應(yīng)后代理服務(wù)器再轉(zhuǎn)將響應(yīng)信息傳輸給客戶端届谈。

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

// 代理服務(wù)器
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)

//--- --- ---

// 目標(biāo)地址服務(wù)器
let http = require('http');

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

proxyServer.web()方法實(shí)現(xiàn)思路

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);
  });
}

虛擬機(jī)

服務(wù)器與虛擬主機(jī)

首先我們來(lái)看看服務(wù)器和虛擬主機(jī)的區(qū)別
以阿里云等為例枯夜,
彈性計(jì)算云服務(wù)器 ECS:一個(gè)完整的服務(wù)器
虛擬主機(jī):你得到的只是此服務(wù)器上的一個(gè)目錄

這里有個(gè)問(wèn)題,一臺(tái)ECS上能創(chuàng)建多個(gè)虛擬主機(jī)(網(wǎng)站)艰山,但我們?cè)L問(wèn)的時(shí)候都是通過(guò)同一個(gè)端口號(hào)訪問(wèn)的湖雹,眾所周知,一個(gè)端口只能有一個(gè)程序曙搬,這么多個(gè)站點(diǎn)怎么就會(huì)不報(bào)錯(cuò)呢摔吏?

這就是通過(guò)反向代理來(lái)實(shí)現(xiàn)了。

虛擬機(jī)與反向代理

下面我們通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)演示反向代理怎么來(lái)實(shí)現(xiàn)虛擬機(jī)的纵装。

為了演示征讲,首先我們?cè)趀tc下的hosts添加兩個(gè)解析


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

可以看到,這兩個(gè)解析都指向localhost橡娄,同一臺(tái)服務(wù)器
為了在同一臺(tái)服務(wù)器上通過(guò)訪問(wèn)不同域名訪問(wèn)到應(yīng)該指向的網(wǎng)站诗箍,我們需要講域名進(jìn)行一個(gè)映射,映射到服務(wù)器上不同的端口號(hào)上挽唉。

[tip] req.headers['host']長(zhǎng)這樣


image

這樣我們?cè)僭L問(wèn)不同站點(diǎn)時(shí)扳还,只需從req中拿到的host,再根據(jù)host查找到映射到的那個(gè)端口就可以找到運(yùn)行在該端口上的站點(diǎn)橱夭。

示例源碼

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);

請(qǐng)求報(bào)文中的user-agent

此代理非彼代理氨距,這里是指客戶端(瀏覽器和操作系統(tǒng)計(jì)算機(jī)硬件)的一些信息。我們可通過(guò)req.headers['user-agent']拿到這些信息棘劣,并根據(jù)這些信息對(duì)我們的應(yīng)用進(jìn)行一定的定制優(yōu)化俏让。

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' } }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子首昔,更是在濱河造成了極大的恐慌寡喝,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勒奇,死亡現(xiàn)場(chǎng)離奇詭異预鬓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赊颠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)格二,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人竣蹦,你說(shuō)我怎么就攤上這事顶猜。” “怎么了痘括?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵长窄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我纲菌,道長(zhǎng)挠日,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任翰舌,我火速辦了婚禮肆资,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灶芝。我一直安慰自己郑原,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布夜涕。 她就那樣靜靜地躺著犯犁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪女器。 梳的紋絲不亂的頭發(fā)上酸役,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音驾胆,去河邊找鬼涣澡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丧诺,可吹牛的內(nèi)容都是我干的入桂。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼驳阎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抗愁!你這毒婦竟也來(lái)了馁蒂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜘腌,失蹤者是張志新(化名)和其女友劉穎沫屡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體撮珠,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沮脖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芯急。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勺届。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖志于,靈堂內(nèi)的尸體忽然破棺而出涮因,到底是詐尸還是另有隱情废睦,我是刑警寧澤伺绽,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站嗜湃,受9級(jí)特大地震影響奈应,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜购披,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一杖挣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刚陡,春花似錦惩妇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蝙云,卻和暖如春氓皱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勃刨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工波材, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人身隐。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓廷区,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贾铝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躲因,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容