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