代理技术 | 重磅,代理服务器背后的故事(正向、反向代理)
传说中的代理服务技术是一门很古老的技术,互联网早期就已经出现,一般来说,实现实现代理技术的实现就是在服务器上安装代理软件,成为代理服务器,从而配置实现代理技术。
其实网络代理的玩法真的很多。之前知道如何使用,今天我们看看代理背后的故事。
我们以nginx为例,常用的代理技术有:正向代理、反向代理和透明代理。真正项目中常用的是反向代理和正向代理,透明代理我们了解一下就可以,本文重点讲正向代理和反向代理。
老规矩,走一波概念:
1正向代理
正向代理(forward proxy):是一个位于客户端(用户A)和原始服务器(origin server)(目标服务器)之间的服务器(代理服务器),为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标(原始服务器),然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的配置才能使用正向代理。一般情况下,如果没有特别说明,代理技术默认是指正向代理技术。
从上面的概念中,我们可以知道,所谓的正向代理,就是代理服务器替代客户端(用户A),来访问原始服务器(目标服务器)。
举个例子:
我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
还不懂?看下图:
正向代理的作用:
1:访问本来无法访问的资源
我们抛除复杂的网络路由情节来看图,图中路由器从左到右为R1,R2假设最初用户A要访问目标服务器需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问目标服务器了。但是如果用户A让代理服务器去代替自己访问目标服务器,由于代理服务器没有在路由器R1或R2节点中,而是通过其它的路由节点访问目标服务器,那么用户A就可以得到目标服务器的数据了。现实中的例子就是“访问外国网站”。不过自从V**技术被广泛应用外,“访问外国网站”不但使用了传统的正向代理技术,有的还使用了V**技术。
2:可以做缓存,加速访问资源
主要是提高代理服务器的宽带流量,目前不流行了。
Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。还如上图所示,如果在用户A访问目标服务器某数据之前,已经有人通过代理服务器访问过目标服务器上得数据,那么代理服务器会把数据保存一段时间,如果有人正好取该数据,那么代理服务器不再访问目标服务器,而把缓存的数据直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器,那么这些用户都可以直接从代理服务器中取得数据,而不用千里迢迢的去目标服务器下载数据了。
3:对客户端访问授权,上网进行认证
防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服务器上做限制)这样用户A因为授权,可以通过代理服务器访问到目标服务器,而用户B因为没有被代理服务器授权,所以访问目标服务器时,数据包会被直接丢弃。
4:代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
目标服务器并不知道访问自己的实际是用户A,因为代理服务器代替用户A去直接与目标服务器进行交互。如果代理服务器被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼
2反向代理
反向代理(reverse proxy):和正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
反向代理的作用:
1:保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击
(大型网站,通常将反向代理作为公网访问地址,Web服务器是内网)
用户A始终认为它访问的是目标服务器而不是代理服务器,但实用际上反向代理服务器接受用户A的应答,从目标服务器中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器访问目标服务器。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了目标服务器,但用户A并不知情。
2:负载均衡,通过反向代理服务器来优化网站的负载
当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问目标服务器的时候,让不同的代理服务器去应答不同的用户,然后发送不同用户需要的资源。
3透明代理
透明代理:透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。 透明代理实践的例子就是时下很多公司使用的行为管理软件
4nginx如何配置正向代理和反向代理
直接上代码,纯干货,你值得收藏。
正向代理
server{
resolver 10.1.23.4;
resolver_timeout 30s;
listen 8888;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}
注意:
1:不能有hostname
2:必须有resolver, 即dns,超时时间可选项
3:配置缓存大小,关闭磁盘缓存读写减少I/O、代理连接超时时间
4:配置代理服务器 Http 状态缓存时间
配置好后,重启nginx,以浏览器为例,要使用这个代理服务器,则只需将浏览器代理设置为http://IP:8888,即可使用了。
反向代理
http {
#省略了前面一般的配置,直接从负载均衡这里开始
#设置地址池,后端3台服务器
upstream servermap {
server 192.168.1.1:8080 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.1.2:8080 weight=3 max_fails=2 fail_timeout=30s;
server 192.168.1.38080 weight=4 max_fails=2 fail_timeout=30s;
}
#一个虚拟主机,用来反向代理http_server_pool这组服务器
server {
listen 80;
#外网访问的域名
server_name www.test.com;
location / {
# 后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_pass http://servermap;
proxy_set_header Host www.test.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log logs/www.test.com.access.log combined;
}
}
- 颠覆者的游戏:程序语言
- CTF| SQL注入之login界面
- 懒惰的力量
- 让AI自动修复程序中的bug:微软亚洲研究院新研究 | 附论文
- OpenDaylight与Mininet应用实战之OpenFlow1.0协议分析二
- Javascript: 世纪机器语言?
- OpenDaylight与Mininet应用实战之基本环境搭建一
- 永恒不变的魅力
- MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App
- OpenDaylight与Mininet应用实战之流表操作三
- 天啊,这个围笑代表什么?麻省理工的AI比你更懂 | 论文+Demo
- elixir:灵丹妙药?or 徒有其名?
- OpenDaylight与Mininet应用实战之三层转发机制四
- 程序员效率指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TypeScript - 类型声明、枚举、函数、接口
- Vue - 简单实现一个命令式弹窗组件
- Vue - 组件通信之$attrs、$listeners
- 多线程系列(一)多线程基础
- Python自动化运维之iptables和安全概述
- Python自动化运维之shell终极指南
- SQL 中判断条件的先后顺序,会引起索引失效么?
- Maven工程java -jar时提示xxx-SNAPSHOT.jar中没有主清单属性
- Kotlin 1.4 版本正式发布:新功能一覽
- 聊聊java中的哪些Map:(二)HashMap中的TreeNode
- 用innodb_ruby分析InnoDB的页管理
- react获取运行环境是开发还是生产环境。
- 函数节流与函数防抖
- antd3.x中的form
- 使用RAP2模拟假数据实现前后端分离