反向代理缓存
一、传统代理
很久以前,我们通常需要通过代理服务器来访问互联网上的Web站点,代理服务器本身接入了互联网,而我们通过内部网络与代理服务器相连。即便是现在,有些时候为了访问一些由于某种原因无法直接访问的站点,我们也会通过特定的代理服务器,绕过某些限制来访问目标站点。
现在,我们普遍已经不使用代理服务器了,当我们的PC处于内部网络时,网关会使用NAT(网络地址转换)技术,将PC的内部IP地址和网关的外网IP地址进行相互转换,使得PC发出的请求可以顺利到达外部网络的Web服务器,同时将返回的数据正确的传送给内部网络的PC。
在某种意义上,NAT在这里起到的作用等同于代理服务器,但是他们的不同在于,代理服务器工作在应用层,所以只有当它支持某个协议的时候才可以转发该协议的数据,而NAT的工作在应用层以下,它可以透明地转发应用层协议的数据,比如HTTP、FTP、SMTP、等。不过,他们都用共同的一点,也是代理的特点,那就是用户的PC隐藏在了代理服务器或者NAT网关之后,换句话说,Web服务器只知道是代理服务器或者网关发来的请求,而并不知道还存在幕后操作者。
这样以来,我们的PC便不用直接暴露在互联网中,有效提高了安全性能,因为攻击者是无法主动找到我们的,代理服务器或者网关就像一道防火墙保护者我们,但在实际情况中,我们的一些主动行为往往带来了更大的安全问题,遗憾的是,安全性不是我们讨论的主题,你可以阅读其他的相关资料。
另外,正式因为代理服务器工作在应用层,所以它可以很容易地提供基于缓存的加速功能,比如一个机构的内部网络通过代理服务器上网,一旦某个用户访问过的网页被缓存在代理服务器上,那么随后一段时间内,内部网络的其他用户便可以快速获得这个网页,而不需要再次经过外部网络请求Web服务器,随之还带来的另一个好处就是节省了带宽。
二、何为反向
回想刚才提到的传统代理服务器的特点,即用户隐藏在代理服务器之后,那么,反向代理服务器的特点便与此刚好相反,那就是Web服务器隐藏在代理服务器之后。我们将这种代理机制称为反向代理(Reverse Proxy),同时,实现这种机制的服务器,便称为反向代理服务器(Reverse Proxy Server)
隐藏在反向代理服务器之后的Web服务器,我们习惯称它为后端服务器(Back-end Server),相对的,反向代理服务器在这里便成了前端服务器(Front-end Server)。通常,反向代理服务器暴露在互联网中,而后端Web服务器通过内部网络与他相连,当然,你也可以将反向代理服务器和Web服务器运行在同一台物理服务器上。
引入反向代理后,用户将通过反向代理服务器来间接访问Web服务器,不过用户并不关心这些,因为反向代理服务器可以完美的充当用户心中的Web服务器,至于反向代理服务器和后端Web服务器的沟通,则仍然是基于HTTP,这一点和传统代理的本质是一样的。
将Web服务器隐藏在后端,这样也带来了一定的安全性,但这不是反向代理的主要目的,因为完全可以使用iptables来作为防火墙以达到相同的安全性目的。
三、在反向代理上创建缓存
的确,就像Web服务器缓存和浏览器缓存一样,我们同样可以将内容缓存在反向代理服务器上,所有缓存机制的实现仍然采用HTTP/1.1协议(缓存协商/过期时间)。
1.Nginx作为反向代理服务器
我们知道反向代理只是Nginx上网一个扩展模块,并且它的缓存机制到目前为止还在不断完善,所以我们暂且放弃它。
2.Squid作为反向代理服务器
Squid在这方面家喻户晓,不过,除了作为反向代理,他还热衷于其他很多的工作,比如传统代理、访问控制、身份验证、流量管理等,正式因为这样,它呈现出过于重量级的身躯,而且它的配置也过于复杂。
3.Varnish作为反向代理服务器 但是在这里我们我们需要的很简单,仅仅是基于反向代理缓存的加速功能,所以我们选择了Varnish,它更加专注与反向代理,而且对于后面要介绍的负载均衡也有很好的支持。
相关文章
- php手动编译fileinfo扩展
某些同学在执行php composer.phar install时,出现错误 90%可能是漏装了PHP的fileinfo扩展了,用宝塔的请直接在宝塔里安装 下载并解压PHP源码包(内含fileinfo
- 使用宝塔面板定时任务不执行问题处理
定时任务不执行 不用宝塔自带的计划任务,因为宝塔自带的计划任务无法以www:www身份去执行任务,会导致面板无法正常写入日志 在vps中输入:crontab -e -uwww ,然后贴上 * * *
- 使用create-react-app快速搭建react环境
使用create-react-app快速搭建react环境 npm install create-react-app -g cd test_dir create-react-app demo_rea
- redis aof日志持久化
一、aof的原理 问题: 1、每个命令重写一次aof? 2、某个key修改100次,产生100行记录,aof文件会很大,怎么解决? aof重写(简化) 二、aof的配置 appendfsync
- 高并发下的分布式锁
public String deductStrck() throws InterruptedException{ String lockKey = "product_001"; //用
随机推荐
- php手动编译fileinfo扩展
某些同学在执行php composer.phar install时,出现错误 90%可能是漏装了PHP的fileinfo扩展了,用宝塔的请直接在宝塔里安装 下载并解压PHP源码包(内含fileinfo
- 使用宝塔面板定时任务不执行问题处理
定时任务不执行 不用宝塔自带的计划任务,因为宝塔自带的计划任务无法以www:www身份去执行任务,会导致面板无法正常写入日志 在vps中输入:crontab -e -uwww ,然后贴上 * * *
- 使用create-react-app快速搭建react环境
使用create-react-app快速搭建react环境 npm install create-react-app -g cd test_dir create-react-app demo_rea
- redis aof日志持久化
一、aof的原理 问题: 1、每个命令重写一次aof? 2、某个key修改100次,产生100行记录,aof文件会很大,怎么解决? aof重写(简化) 二、aof的配置 appendfsync
- 高并发下的分布式锁
public String deductStrck() throws InterruptedException{ String lockKey = "product_001"; //用