[前端]代理知识入门介绍

主要目的是帮助我们了解代理和反向代理,以及熟悉它们的工作原理,帮助我们更好的在开发过程中进行使用,提高工作效率。

本内容主要围绕Http反向代理进行介绍,其他不常用的代理大家可自行了解。

什么是代理?代理有哪些类型?

代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。

协议

功能

  1. 提高访问速度: 通常代理服务器都设置一个较大的缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
  2. 隐藏真实IP(网络安全)。
  3. FQ:允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。
  4. 负载均衡。

种类

根据协议区分

FTP代理服务器、HTTP代理服务器、SSL/TLS代理、RTSP代理、Telnet代理、POP3/SMTP代理、SOCKS代理

根据类型区分

正向代理、反向代理、透明代理、分布式代理等

什么是反向代理?

反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端。

功能

  • 加密和SSL加速
  • 负载平衡
  • 缓存静态内容
  • 压缩
  • 安全
  • 隔离内外网

和正向代理的区别

  1. 正向代理需要客户端进行设置,在网络请求中设置代理地址;而反向代理不需要客户端进行任何设置。
  2. 客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端;反向代理正好相反,对于客户端而言它就像是原始服务器。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。
  3. 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身;反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

常见的反向代理

由于代理本身只是一种网络通信模式,所以只要遵循相应的协议规则,任何人都可以开发属于自己的反向代理服务;目前常用的功能完善的反向代理服务主要有nginxapache httpdSquid等。

Nginx 反向代理设置

轻量级,目前使用最广泛,Mac需要安装Nginx才可使用。

注:仅介绍反向代理相关内容,不研究nginx

proxy_pass http://127.0.0.1:88;   # 核心配置
proxy_redirect off;       # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m;    #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;       #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90;      #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90;      #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90;    #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k;    #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;   #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k;     #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传

Apache 反向代理设置

重量级,功能强大,历史悠久,但Mac自带Apache服务,启动就好!

MAC中的目录:/etc/apache2
启动命令:sudo apachectl start 或 sudo apachectl restart

#off表示开启反向代理,on表示开启正向代理ProxyRequests Off
 ProxyMaxForwards 100
 ProxyPreserveHost On

 ProxyPass / http://www.junjunfudao.com/
 ProxyPassReverse / http://www.junjunfudao.com/

前端与反向代理

前端开发本来并不关心反向代理问题,但如果为了提高前端代码的运行效率和开发体验。非常有必要加深对服务器端web容器配置的了解。而反向代理的应用对于提高前端工程的开发效率有很大帮助。

JS如何实现代理

  • 正向代理实现方式

    /**
     * 正向代理示例
     */
    var http = require(‘http‘);
    var url = require(‘url‘);
    function request(cReq, cRes) {
        var u = url.parse(cReq.url);
        var options = {
            hostname: ‘http://www.junjunfudao.com‘,
            port: u.port || 80,
            path: u.path,
            method: cReq.method,
            headers: cReq.headers
        };
    
        var pReq = http.request(options, function(pRes) {
            cRes.writeHead(pRes.statusCode, pRes.headers);
            pRes.pipe(cRes);
        }).on(‘error‘, function(e) {
            cRes.end();
        });
        cReq.pipe(pReq);
    }
    http.createServer().on(‘request‘, request).listen(8080, ‘0.0.0.0‘);
  • 反向代理实现方式(使用http-proxy包来实现)
    /**
     * 反向代理示例
     */
    var http = require(‘http‘),
        httpProxy = require(‘http-proxy‘),     //http-proxy
        proxy = httpProxy.createProxyServer({}),
        fs = require(‘fs‘),
        path = require(‘path‘)
    var getConType = function (ext) {
        switch(ext){
            case ‘.html‘:
                return ‘text/html‘;
            case ‘.js‘:
                return ‘text/javascript‘;
            case ‘.css‘:
                return ‘text/css‘;
            case ‘.gif‘:
                return ‘image/gif‘;
            case ‘.jpg‘:
                return ‘image/jpeg‘;
            case ‘.png‘:
                return ‘image/png‘;
            case ‘.ico‘:
                return ‘image/icon‘;
            default:
                return ‘application/octet-stream‘;
        }
    };
    var server = http.createServer(function(req, res) {
        var _url = req.url; //获取请求的url
        var _file = _url.replace(/\?.*/ig,‘‘);
        var _localPath,
            _localFile,
            _stream;
        var _ext = path.extname(_file); // 文件扩展
        if(_ext){    // 如果是静态资源文件,则总本地读取
            //转换成本地路径
            _localPath = ‘/Users/yangyang.zhang/Work/wenba/fudao_activity/static/‘;
            _localFile = _localPath+_file;
            //判断文件是否存在
            if(fs.existsSync(_localFile)){//如果文件存在
                res.writeHead(200, {‘Content-Type‘: getConType(_ext) });
                _stream = fs.createReadStream(_localFile, {flags : ‘r‘, encoding : null});//只读模式 读取文件内容
                _stream.on(‘error‘,function(){//如果读取错误 返回404
                    res.writeHead(404, {‘Content-Type‘: ‘text/html‘});
                    res.end(‘<h1>404 Read Error</h1>‘);
                });
                _stream.pipe(res);//连接文件流和http返回流的管道,用于返回实际Web内容
                _stream.on(‘end‘,function(){
                    _stream = null;
                })
            }else{//返回404错误
                res.writeHead(404, {‘Content-Type‘: ‘text/html‘});
                res.end(‘<h1>404 Not Found</h1>‘);
            }
        }else{
            proxy.web(req, res, {target: ‘http://www.junjunfudao.com‘});
        }
    });
    console.log(‘listening on port 8080‘)
    server.listen(8080);
  • 反向代理实现  (使用request模块来实现)
    /**
     * 反向代理示例:使用request模块来实现反向代理
     */
    var nodeStatic = require(‘node-static‘).Server;
    var request = require("request");
    var fs = require(‘fs‘);
    var fileServer = new nodeStatic(fs.realpathSync("/Users/yangyang.zhang/Work/wenba/fudao_activity/static/"));
    var http = require("http");
    var httpServer = http.createServer(function(req, res) {
        var body =‘‘;
        req.addListener(‘data‘, function(chunk){
            body += chunk;
        })
        req.addListener(‘end‘, function() {
            fileServer.serve(req, res, function(err, result) {
                if (err && (err.status === 404)) {
                    var p = ‘http://qa01-activity.xuebadev.com‘+req.url;
                    req.headers[‘Host‘] = ‘qa01-activity.xuebadev.com‘;
                    request({
                        method: req.method,
                        url: p,
                        headers: req.headers,
                        body: body
                    }).pipe(res);
                }
            });
        }).resume();
    });
    httpServer.listen(8080);
    console.log(‘proxy listen in 8080‘);
    

参考文献

  1. 代理服务器-维基百科
  2. 正向代理与反向代理的区别
  3. NodeJS实现反向代理
  4. Nodejs实现一个http反向代理
  5. 用 nodejs 做反向代理服务器
  6. Nginx 配置介绍
时间: 2024-11-11 03:19:04

[前端]代理知识入门介绍的相关文章

Weka开发[9]—KMeans源码介绍

以前介绍的都是分类的内容,这一次介绍聚类,以最简单的SimpleKMeans源码为例. 分类中训练一个分类器是用buildClassifier(),在聚类中学习一个Clusterer是用buildCluster().分类中分类一个样本是用classifyInstance,而在聚类中是用clusterInstance.那我怎么知道这些的呢?(或者说:你怎么知道我是不是在骗你呢?)以ID3为例,你可以看出它继承自Classifier类,进入Classifier类,它有三个比较重要的函数,buildC

Weka开发[14]-AdaBoost源代码介绍

这一次讲的是Ensemble的东西,一位读者希望我讲一下Adaboost的内容,这种Ensemble看起来的确比较吓人,推荐一篇论文:Ensemble Based Systems in Decision Making. 在这里所有理论的东西我就不介绍了. 与以往一样,先看buildClassifier函数(我在函数中将不重要的代码全部去掉): super.buildClassifier(data); if ((!m_UseResampling)&& (m_Classifier instan

[转]安卓显示原理介绍

转自:http://djt.qq.com/article/view/987 作者:yearzhu,2011年进入腾讯公司,从事过Web端及移动端的测试工作,喜爱新鲜事物及新技术,目前在SNG开放平台测试组负责的移动互联SDK的测试工作. 现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大的学问.这也是我下篇文章——<Android应用流畅度测试分析>的基础. 首先,用一句话来概括一下Android应用程序显

[转载] SSH入门学习基础教程

在Linux系统中,OpenSSH是目前最流行的远程系统登录与文件传输应用,也是传统Telenet.FTP和R系列等网络应用的换代产品.其 中,ssh(Secure Shell)可以替代telnet.rlogin和rsh,scp(Secure Copy)与sftp(Secure FTP)能后替代ftp. OpenSSH采用密钥的方式对数据进行加密,确保数据传输的安全.在正式开始传输数据之前,双方首先要交换密钥,当收到对方的数据时,再利用密钥和相应的程序对数据进行解密.这种加密的数据传输有助于防止

足彩基础知识入门(4)赛事数据库与预测平台基础概念介绍(一)

在足球赛事数据库以及统计分析预测平台中,有很多概念,如果不搞懂,很难进行下一步的工作.所以为了配合团队人员的学习和任务进行,特意编写这篇文章.如果有其他问题和不懂的,请留言,将根据情况进行更新. 本文原文地址:足彩基础知识入门(4)赛事数据库与预测平台基础概念介绍(一) 1.指数1/2/3.... 我在 足彩基础知识入门(3)足彩赔率的本质 一文中介绍了赔率的概念,那么指数的概念和赔率以及结果是相关的.我们举个例子: 如上图的比赛,前面是竞彩非让球的赔率:1.74-3.25-4.15,也就是说

DOJO开发: 入门介绍

决定写么这么一个前端框架的系列文章, 还是很需要勇气的. 因为从现在软件开发岗位分工来说, 我一是个标准的后台开发岗, 所以前端的知识(html, css, javascript)还是捉襟见肘的, 所以大家还是多多包涵下, 如果文中有什么问题, 请帮忙指出来. 一般很多后端的同学有这样的需求: 一个人要开发完一个完整的管理系统, 而又没有前端开发资源, 这时候只能一切靠自己了. 嗯, 做一个全栈工程师, 我骄傲!  首先我介绍下我的前端知识体系. 对于html, css, javascript的

[翻译]The Neophyte&#39;s Guide to Scala Part 12: Type Classes

The Neophyte's Guide to Scala Part 12: Type Classes 过去的两周我们讨论了一些使我们保持DRY和灵活性的函数式编程技术,特别是函数组合,partial function的应用,以及currying.接下来,我将会继续讨论如何使你的代码尽可能的灵活. 但是,这次我们将不会讨论怎么使用函数作为一等对象来达到这个目的,而是使用类型系统,这次它不是阻碍着我们,而是使得我们的代码更灵活:你将会学到关于 type classes 的知识. 你可能会觉得这是一

Linux入门介绍

Linux入门介绍 一.Linux 初步介绍 Linux的优点 免费的,开源的 支持多线程,多用户 安全性好 对内存和文件管理优越 系统稳定 消耗资源少 Linux的缺点 操作相对困难 一些专业软件以及游戏支持度不足 Linux的应用 网络服务器 关键任务的应用(金融数据库.大型企业网管环境) 学术机构癿高效能运算任务 手持系统(PDA.手机.导航系统) 个人办公使用 Linux的吉祥物/Logo 企鹅(英文名:Tux),由来:因为Torvalds在小时候被企鹅咬过,因此印象非常深刻 在Linu

程序员Web面试之前端框架等知识

基于前面2篇博客: 程序员Web面试之jQuery 程序员Web面试之JSON 您已经可以顺利进入Web开发的大门. 但是要动手干,还需要了解一些已有的前端框架.UI套件,即要站在巨人肩膀上而不是从轮子开始造汽车. 下面就Web开发用到的前端框架.UI套件.UI插件一一列举(排名不分先后): jQuery UI jQuery UI以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件.包含了许多维持状态的小部件(Widget)