前言

学习 nginx 过程中,了解到反向代理 一词,以前听说过很多次,但没有具体了解到底为什么叫反向代理,那同时应该也有对应的正向代理一说。因此查阅了一下,下面记录一下学习结果。

先上结论:

  • 正向代理代理的是客户端,隐藏真实客户端;
  • 反向代理代理的是服务端,隐藏真实服务端。

什么是正向代理

知乎上有个很好的例子这里拿来用一下:

A同学在大众创业、万众创新的大时代背景下开启他的创业之路,目前他遇到的最大的一个问题就是启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。

我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些科学上网工具扮演的就是典型的正向代理角色。用浏览器访问 http://www.google.com 时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求 google.com ,代理把请求返回的相应结构再返回给我。

正向代理示意图

什么是反向代理

大家都有过这样的经历,拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。

反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

反向代理

反向代理的实现过程

  1. 需要有一个负载均衡设备来分发用户请求,将用户请求分发到空闲的服务器上;
  2. 服务器返回自己的服务到负载均衡设备;
  3. 负载均衡将服务器的服务返回用户。

以上的潜台词是:用户和负载均衡设备直接通信,也意味着用户做服务器域名解析时,解析得到的IP其实是负载均衡的IP,而不是服务器的IP,这样有一个好处是,当新加入/移走服务器时,仅仅需要修改负载均衡的服务器列表,而不会影响现有的服务。

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

代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介。

  • 正向代理:刚开始的时候,代理多数是帮助内网client访问外网server用的(比如HTTP代理),从内到外
  • 反向代理:后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网client的请求forward到内网server,从外到内
  • 正向代理中,代理和客户端同属一个LAN,对服务端透明;
  • 反向代理中,代理和服务端同属一个LAN,对服务端透明。

实际上不论正/反代理做的事都是代为收发请求和响应。

代理服务器应用的场景

场景一

如果不采用代理,用户的IP、端口号直接暴露在Internet(尽管地址转换NAT),外部主机依然可以根据IP、端口号来开采主机安全漏洞,所以在企业网,一般都是采用代理服务器访问互联网。同时,如果有安全漏洞,由于代理服务器数量有限,因此相对于修补千千万万的用户主机,修补代理服务器的安全漏洞更方便会计。

场景二

在一个超大型局域网,德高望重的家长觉得小盆友们“幼稚”、“有时还有点单纯”,外部的世界是洪水猛兽,为了不让小盆友们学坏,决定不让小盆友们访问一些网站,可小盆友们有强烈的逆反心理,侬越是不让我看,我越是想看,于是小盆友们使用了代理服务器,这些代理服务器将禁止访问的网页打包好,然后再转交给小盆友,仅此而已。

当然关键的关键是代理服务器不在禁止名单当中!

posted @ 2017-08-12 23:07 九二 阅读(454) 评论(0) 推荐(0) 编辑
摘要: 当SSH远程连接到服务器上,然后运行一个程序,eg: `./test.sh`, 然后把终端开闭(切断SSH连接)之后,发现该程序中断. 阅读全文
posted @ 2017-06-20 12:42 九二 阅读(10654) 评论(0) 推荐(1) 编辑
摘要: 用ctags搜索代码时, 用 `ctrl + ]` 后,只有一个匹配项直接跳转,有多个则列出所有匹配项选择跳转 阅读全文
posted @ 2017-06-03 00:39 九二 阅读(1341) 评论(0) 推荐(0) 编辑
摘要: pymongo 是 mongodb 的 python Driver Editor. 记录下学习过程中感觉以后会常用多一些部分,以做参考。 阅读全文
posted @ 2015-09-01 18:03 九二 阅读(18666) 评论(0) 推荐(0) 编辑
摘要: ssh 协议框架中最主要的部分是三个协议;ssh 的安全验证;使用XShell连接服务器(SSH模式);阻止基于密码登陆的方式(只允许SSH登陆) 阅读全文
posted @ 2015-06-25 17:08 九二 阅读(4434) 评论(0) 推荐(0) 编辑
摘要: 个人使用github,但是公司使用的是 GitLab 。那么在一个电脑上进行处理时,由于先设置了 github 的,导致没办法从 GitLab 上处理 git 。其实是由于 ssh 的问题。 阅读全文
posted @ 2015-05-31 00:03 九二 阅读(1406) 评论(0) 推荐(0) 编辑
摘要: 最近思考到这样一个题目:在STL的set和vector容器里存储了1亿个QQ号,编写函数删除奇数QQ号。算法题中的说存储在set和vector中,其实其内部存储是不一样的,删除的实现原理也是不同的。但都可以用同一个接口erase()去实现!及时这时候添加说还存储在list和deque中,也是可以使用的。我们可以写两个函数去实现这个功能,但由于在两个容器中,而调用的接口又都是一样的,所以自然而然想到可以使用模板函数!这是其一。 阅读全文
posted @ 2015-04-13 22:42 九二 阅读(1453) 评论(2) 推荐(1) 编辑
摘要: 总结一下主要的坑:负数时返回的字符串第一位要有 '-' 号,正数从人的角度上考虑不该加 '+';转换的字符串在结尾要有 '\0',否则可能出错;怎么返回非法输入的结果,并且怎么进行区分;转换为整型后,可能会溢出,怎么进行溢出判断;非法输入: - 空指针,空字符串 - 只有一个正负号,正负号不是出现在第一个位置 - 字符串中含有非正负号和数字的其他字符 阅读全文
posted @ 2015-04-13 01:18 九二 阅读(11740) 评论(0) 推荐(1) 编辑
摘要: 这里介绍的是一款Chrome的插件:红杏,由于正常情况下无法登陆谷歌浏览器的应用商店下载这个插件,所以这里提供一个下载链接,按照以下教程安装后即可。红杏使用的是邀请制,下载链接下是邀请链接。 在后面,为证实可用,我贴了几个比较出名的网站的截屏。 阅读全文
posted @ 2015-04-11 22:57 九二 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 由于转到了Ubuntu下,本来在Windows平台下使用的一直是MarkdownPro2,而且进行了破解,十分好用。转到Ubuntu下后,MarkdownPro2不能够使用了,找了下Linux平台中的ReText算是比较好用的(也测试了一下CuteMarkEd,但感觉不如ReText)。只是,刚安装好的ReText是不算好用的,这里记录一下我的配置路:添加中文输入支持、添加自定义CSS、 添加数学公式支持、 添加语法高亮 阅读全文
posted @ 2015-04-11 19:38 九二 阅读(6252) 评论(3) 推荐(2) 编辑
摘要: 这个问题从我第一次在Ubuntu上使用Qt便困扰着我,奈何之前一直没认真去解决掉这个问题。今天作死想想,这个不可能解决不掉的。因为那么多人用Ubuntu,而且又那么多人用Qt的产品,比如Retext。不可能都不能用中文吧,按照这个思路,我决定把这个问题搞清除。 阅读全文
posted @ 2015-04-11 19:32 九二 阅读(3214) 评论(4) 推荐(0) 编辑
摘要: 引用必须初始化。因为引用一经定义,它就不能再指向其他对象了,所以需要进行初始化。引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如字符串常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问它。这时当引用用来作为函数形参时就引入了const引用问题。 阅读全文
posted @ 2015-04-04 01:12 九二 阅读(783) 评论(1) 推荐(0) 编辑
摘要: 本文为两个题:【三数和(3Sum)】与【最近三数和(3Sum Closest)】问题 第一部分分析**3Sum**问题,第二部分分析**3Sum Closest**问题,由于两个问题的思路很像,所以这里放到一起分析。 其中**3Sum**问题好像还是计算机科学领域暂未解决的问题之一,当然,还没找到更好的解决方案。 阅读全文
posted @ 2015-03-16 18:07 九二 阅读(1158) 评论(0) 推荐(0) 编辑
摘要: 按照最简单的暴力方法求解,逐步进行分析优化,使用位操作符进行算法的优化,得出一个比较好的算法。 阅读全文
posted @ 2015-03-14 19:17 九二 阅读(1372) 评论(0) 推荐(0) 编辑
摘要: Write a function to find the longest common prefix string amongst an array of strings. 求字符串数组中字符串的最长公共前缀。 阅读全文
posted @ 2015-03-13 23:04 九二 阅读(289) 评论(0) 推荐(0) 编辑
摘要: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 意思就是: 给出一个罗马数字,返回其对应的整数 num( 03999 阅读全文
posted @ 2015-03-13 23:00 九二 阅读(247) 评论(0) 推荐(0) 编辑
摘要: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 意思就是: 给出一个整数 num( 0=num=3999),返回其对应的罗马数字表示; 阅读全文
posted @ 2015-03-13 22:57 九二 阅读(738) 评论(0) 推荐(1) 编辑
摘要: QIODevice QFileDevice QBuffer QProcess 和 QProcessEnvironment QFileDevice QFile QFileInfo 阅读全文
posted @ 2015-02-05 14:17 九二 阅读(6097) 评论(0) 推荐(0) 编辑
摘要: 附:升级密钥一枚 找到配置文件 启用Markdown扩展模式 Markdown处理器:Github风格 语法检查设置 自动保存设置 找到配置文件 阅读全文
posted @ 2015-02-03 09:13 九二 阅读(2547) 评论(0) 推荐(1) 编辑
摘要: QWidget 及其子类都有右键菜单,主要因为其有两个与右键菜单相关联的函数: 阅读全文
posted @ 2015-02-02 22:35 九二 阅读(6772) 评论(1) 推荐(1) 编辑
点击右上角即可分享
微信分享提示