proxy代理与服务器

什么是proxy(代理)

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

代理分类

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

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

  • 反向代理: 经过访问一个内网的表明,咱们能访问到这整个内网内的数据。这个表明就称做反向代理服务器。bash

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

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

应用

设置正向代理

通常咱们在公司里须要经过一台链接到外网的服务器做为代理来访问外网。怎么给咱们本身设置这个代理服务器呢? 一图顶千言 网络

代理

咱们一般所说的代理是指正向代理,嗯。。能帮助咱们作一些不可描述的事情♂。优化

通常来讲一个代理软件会改变咱们本地的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:一个完整的服务器 虚拟主机:你获得的只是此服务器上的一个目录ui

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

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

虚拟机与反向代理

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

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

www.a.com http://localhost
www.b.com http://localhost
复制代码

能够看到,这两个解析都指向localhost,同一台服务器 为了在同一台服务器上经过访问不一样域名访问到应该指向的网站,咱们须要将域名进行一个映射,映射到服务器上不一样的端口号上

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

这样咱们再访问不一样站点时,只需从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' } }
复制代码
相关文章
相关标签/搜索