简单的说HTTP代理就是处于HTTP客户端和服务器端之间,中转消息的中间人。

一种代理是代客户端去请求服务器,叫做Forward Proxy正向代理;另一种是代理真正的服务器来接收用户请求,叫做Reverse Proxy反向代理。下边分别介绍。

  • 先说正向代理,也是最常见的。

为什么需要?客户端不能直接建立连接到目的服务器。比如大公司的内网(或者大T朝内网),你不能直接PING到外网服务器,根本没有路由器帮你传送IP包到外网(或者某部分外网)。这时候又需要允许内网访问网页,比如百度一下什么的。这时候HTTP代理就是不二选择了。HTTP服务器这时候既要接受内网的请求,又要能连接外网。所以这时候HTTP服务器必须位于所谓的DMZ非军事区或者内外两个网卡非别连接内外网。

正向代理要求客户端必须知道代理服务器的地址和端口,并且显式配置。

浏览器或者其它客户端在使用代理的情况下行为与不使用代理有所不同:

1. 所有网页不再连接目标主机,改为建立TCP连接到代理。

2.发送请求时,必须发送完整URL,比如GET http://www.luoxq.com/index.html,而不能再简单发送GET /index.html。因为代理服务器要知道客户端究竟要访问哪个网站。而不用代理的情况下,客户端已经直接连接到www.luoxq.com了,没必要发主机名。(实际上也有必要,但是历史原因一般通过Host头部发送了)。

3.对与HTTPS连接要特别处理。因为HTTPS就是要保证安全,如果代理能从中看到客户端和服务器的通信就不安全了。比如你不希望使用支付宝的时候代理服务器还看到你发送的信息吧:)。那怎么做到呢?代理协议有个特殊的方法,叫CONNECT。这时候客户端发送一个 CONNECT www.luoxq.com:443请求。代理服务器呢,只是简单的帮客户端连接服务器的443端口,并且以二进制的方式(不去解读,也无法解读内容)中转两方的TCP数据流。客户端和服务器会利用这个隧道连接传送数字证书和公钥。利用PKI公钥机制,代理服务器完全无法解读他们的通信。这样就安全了。说道这里,我们可以想象如果客户端并不是请求页面,代理服务器也无法获知客户端与服务器究竟是不是在做HTTP通信。也就是说通过这个隧道实际上可以建立到外网的任意TCP连接。呵呵。

我们可以想想一个代理服务器 的内部逻辑不会太复杂,对头部的一些解读,然后就是中转数据流。当然一个真正的完整的代理服务器有很多功能,比如缓存等。

  • 下面说说反向代理。也许只有系统管理员才熟悉这个。

反向代理对客户端不可见。也就是说你访问www.luoxq.com很可能你是在访问一个反向代理,但是你并不知道。其实反向代理也可以说是一个门面服务器。反向代理主要起到以下作用:

1. 集群和负载均衡。一个大网站可以由多台服务器提供服务。这些服务器可以位于不可见的内网。反向代理服务器将多个用户请求分发给多台服务器处理。这里当然有比较复杂的配置,比如分发算法,粘住会话,探测服务器状态等。

2.提供业务服务器业务逻辑之外的功能。比如数字证书,单点登录,日志,更好的静态文件性能等。

Apache HTTPD是最常用的代理服务器之一。它既可以配置为正向代理,还可以配置为反向代理,并且它有丰富的插件支持各种功能,或者只是用它作为应用服务器 – 使用PHP, CGI等。官方文档有很好的说明。也可以同时配置成正向和反向代理,并行不悖,并且可以同时给正向代理配置安全属性 – 如果你需要这个可以给我留言。

HTTP代理浅说的更多相关文章

  1. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. nginx配置反向代理或跳转出现400问题处理记录

    午休完上班后,同事说测试站点访问接口出现400 Bad Request  Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...

  3. Visual Studio Code 代理设置

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...

  4. DynamicObject - 代理对象的种类

    开箱即用,DynamicProxy提供了多种代理对象,主要分成两个大类: 基于继承(Inheritance-based) 基于继承的代理是通过继承一个代理类来实现,代理拦截对类的虚(virtual)成 ...

  5. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 后台创建了一个DntHub的集线器 前台在调用的时候出现了问题(经检查是代理对象 ...

  6. 实现代理设置proxy

    用户在哪些情况下是需要设置网络代理呢? 1. 内网上不了外网,需要连接能上外网的内网电脑做代理,就能上外网:多个电脑共享上外网,就要用代理: 2.有些网页被封,通过国外的代理就能看到这被封的网站:3. ...

  7. 23种设计模式--代理模式-Proxy

    一.代理模式的介绍       代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...

  8. 使用Java原生代理实现AOP

    ### 本文由博主柒.原创,转载请注明出处 ### 完整源码下载地址 [https://github.com/MatrixSeven/JavaAOP](https://github.com/Matri ...

  9. Javascript 代理模式模拟一个文件同步功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. matlab mse函数

    mse是检验神经网络算法的误差分析; mse是平均平方误差性能函数,是网络性能函数.平方误差就是指误差的平方.

  2. UIAlertAction 弹出对话框9.0后有点变化

    ios 9.0后再用以前的UIAlertAction 已经不行了 被弃用了 改用这种方法了 UIAlertController *alertController = [UIAlertControlle ...

  3. NodeJS 学习笔记一

    他创造NodeJS的目的是为了实现高性能Web服务器,他首先看重的是事件机制和异步IO模型的优越性,而不是JS.但是他需要选择一种编程语言实现他的想法,这种编程语言不能自带IO功能,并且需要能良好支持 ...

  4. PHP signal 信号

    最早写php时,发现在终端执行一个php文件,会一直等待程序执行完成以后,终端才能继续下面的操作,若不小心按了下Ctrl+C会导致php程序退出,闭避免这种情况发生,将会使用php的系统编程,即sig ...

  5. 在Dll中创建对话框并调用

    1.第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”. 2.添加一对话框资源到工程中,从 ...

  6. 开源日志系统比较:scribe、chukwa、kafka、flume

    1. 背景介绍 许多公司的平台每天会产生大量的日志(一般为流式数据,如,搜索引擎的pv,查询等),处理这些日志需要特定的日志系统,一般而言,这些系统需要具有以下特征: (1) 构建应用系统和分析系统的 ...

  7. NSBundle的用法

    bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBu ...

  8. MJExtension的使用

    1. Plist → 模型数组 控制器中引用#import "MJExtension.h" 模型数组 = [模型类名 objectArrayWithFilename:@" ...

  9. js截取文件名

    str = 'C:\fakepath\ll.doc'; str.substring(str.lastIndexOf("\\")+1,str.lastIndexOf(".& ...

  10. Bitmap和Drawable浅谈

    一.概念区别 Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB8888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一 ...