犹记得很早之前本身搭建我的博客(如今的博客是 python-online.cn)的时候,那时候开始学习编程,什么东西都很陌生。建站成功后,我激动不已,还特意发了一个朋友圈得瑟。那是个人第一个 web 项目。python
回顾一下,流程差很少是这样的。web
一、到云厂商那里购买一个服务器;chrome
二、将本身的网站服务部署到服务器;编程
三、购买一个本身喜欢的域名;服务器
四、云解析这个域名指向你的服务器ip;负载均衡
五、最后就能够经过域名访问我的网站了。ide
若是你不想花钱购买域名,固然也能够直接使用 服务器ip 进行访问,和使用域名访问并不会有任何区别。工具
此次建站成功,也让我产生一种错觉(当时真的菜,毕竟还没工做),一个服务器对应一个网站,咱们只要能够经过域名访问,也就能够经过ip访问。性能
可事实有可能并非这样的。学习
这里用博客园为例,分析一下。
我用nslookup工具 对home.cnblogs.com作一个解析
$ nslookup home.cnblogs.com
Server: 172.20.10.1
Address: 172.20.10.1#53
Non-authoritative answer:
Name: home.cnblogs.com
Address: 116.62.82.159
获得服务器ip地址:116.62.82.159,将这个 ip 敲入 chrome 地址栏,回车。
发现并没有法访问。
这和咱们想象的彻底不同呀?
再找一个子域名看看,说不定能够呢。
再次用 nslookup 工具 对news.cnblogs.com 作一个解析
$ nslookup news.cnblogs.com
Server: 172.20.10.1
Address: 172.20.10.1#53
Non-authoritative answer:
Name: news.cnblogs.com
Address: 116.62.82.159
什么状况?这个ip和上面的那个ip竟是同一个。
这下明朗了,一个ip对应着多个域名。服务器哪里会知道咱们要访问哪一个域名呢?
这就像你在大街上,大喊一声「帅哥」,全部男的都回过头来看着你,可是他们并非知道你叫的究竟是谁。
带着这个问题,咱们来稍微深刻一下,这种一个ip对应多个域名是如何实现的?(今天的主题)
常见的大概有两种:
首先是虚拟主机技术,使得在一个服务器上能够提供多个 web 站点的访问服务。
具体的实现过程是这样的,首先经过配置域名解析,将多个域名都解析到同一个服务器ip,而后咱们在该主机上经过配置来让主机能够未来自不一样域名的请求转发给不一样的网站程序去处理。主机会截获到请求的请求头信息,而后获取到host这个请求头的值,这个值也就是该请求的来源域名。主机根据所配置的域名与网站程序的对应关系,未来自不一样的域名的请求转发给不一样的程序去处理。
举个例子,当咱们访问 news.cnblogs.com 时
一、会先作DNS解析,获得服务器ip地址:116.62.82.159
二、与服务器经过三次握手创建链接后,发送站点访问请求。
3、服务器接收到请求后,Apache 会取到报文中的 Host news.cnblogs.com 和本身的配置文件进行匹配获得站点的根目录
四、到对应的站点目录中寻找相关的内容并返回。
这里假想 Apache 的配置文件以下(虚构)
<VirtualHost *:80>
DocumentRoot /var/www/home
ServerName home.cnblogs.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/news
ServerName news.cnblogs.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/jobs
ServerName jobs.cnblogs.com
</VirtualHost>
这对于比较小的我的网站,是一套行之有效的方案。它的局限性就在,全部站点的服务都在一台服务器上,并无考虑到灾备与高可用。
当服务器因某种缘由,致使机器宕机,全部的站点也将瘫痪。
当服务器的硬盘损坏,假若没法恢复,全部的数据都将丢失。
当有一天访问量突增,单台压力过大,站点也没法正常访问。
在企业的生产环境中,通常都不会使用这种方案了吧?
有反向代理,必然有正向代理。
在这里摘录 @刘志军(Python之禅) 博客的一段比喻作为说明:
正向代理
正在创业之路摸爬滚打的 A 同窗,目前他遇到的最大的一个问题就是启动资金,因而他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,只能找关系开后门。
通过一番消息打探,原来A同窗的大学老师王老师是马云的同窗,因而A同窗找到王老师,托王老师帮忙去马云那借500万过来,固然最后事成了。
不过马云并不知道这钱是A同窗借的,马云是借给王老师的,最后由王老师转交给A同窗。这里的王老师在这个过程当中扮演了一个很是关键的角色,就是代理,也能够说是正向代理,王老师代替 A同窗 办这件事,这个过程当中,真正借钱的人是谁,马云是不知道的,这点很是关键。
反向代理
当你拨打 10086 客服电话,一个地区的 10086 客服有几个或者几十个,你永远都不须要关心在电话那头的是哪个,叫什么,男的,仍是女的,漂亮的仍是帅气的,你都不关心,你关心的是你的问题能不能获得专业的解答,你只须要拨通了 10086 的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。
那么这里的 10086 总机号码就是咱们说的反向代理。客户不知道真正提供服务的人是谁。
简单的说
正向代理,是向服务端隐藏真实的客户端,代理的对象是客户端;
而反向代理,是向客户端隐藏真实的服务端,代理的对象是服务端。
将正向代理和反向代理用一张图来解释,能够看下边,左边是正向代理,右边是反向代理。
当咱们访问 news.cnblogs.com 时,反向代理服务器会帮咱们把请求转发到提供真实计算的服务器那里去,Nginx 就是性能很是好的反向代理服务器,它能够用来作负载均衡。
使用了反向代理,完美地解决了上边 虚拟主机技术 我提出的三个问题。
某台机器宕机后,反向代理服务器会请求转发到仍然存活的节点上继续提供服务;
硬盘故障后,因为同一份数据在多个节点都会备份,不会有什么问题
当访问量突增时,能够弹性增长计算节点,来分流分压,当访问量恢复正常后再减小节点数量。
今天的内容大概就是这些,写得比较浅显易懂,但愿对你有所帮助。
若是以为写得还能够,还请点下右下角的好看支持一下!