在我们写代码的过程中,尤其是模拟线上环境的时候,我们经常接触到hosts
文件。
域名是如何定位到资源的
域名和IP
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
我们可以通过一个IP地址去寻找到一台主机,或者说一台主机对应一个IP地址。
例如我们访问220.181.38.148
这个IP,可以进入百度的首页。类似的,我们也可以通过访问其他网站的IP进入其首页。
然而通过IP地址访问网站门户具有很多的缺陷和问题,例如:
- IP地址不便记忆
- IP地址无法表现出网站门户的主要业务或性质。例如我们知道
www.gov.cn
是中国政府网,但是我们无法确认IP116.162.121.91
是干嘛的。 - 一个网站门户的IP地址在某些情况下会更换。如在负载均衡场景下,一个网站门户可以拥有多台主机,即拥有多个IP,在此场景下,如果有一台服务器挂掉,那么该主机的IP就无法正常为用户提供服务。
- ......
出于种种原因,人们设计出域名,即用一串用点分割的名字组成的一台或计算机组的名称,可以解决上述缺陷和问题。
域名解析系统(DNS,Domain Name System)
能够寻找到主机的只有IP,而域名无法寻找到主机,为了解决这个问题,人们设计出DNS系统。
该系统可以将域名和IP地址相互映射,使人们可以通过域名直接映射到IP地址,从而定位到相应的资源或服务。
DNS系统是如何工作的
通常,在一台计算机上会有DNS服务器设置。
DNS服务器是一台专门提供DNS服务的服务器,当人们在计算机上通过域名访问某网站时,会映射到对应的IP。通常DNS服务器不止一个配置。
在计算机上,有一个特殊的文件——hosts
,该文件的作用可以充当本地DNS服务器。
当人们通过域名访问某网站时,会首先去hosts
文件中查找是否有对应的映射,如果没有则去DNS1
(第一个DNS服务器配置)、DNS2
、DNS3
...中寻找映射,直到找到为止。
即优先级为:hosts
文件、DNS1
、DNS2
...
如果找不到,则会出现DNS_PROBE_FINISHED_NXDOMAIN
错误。
hosts
文件
在任意一种支持网络的操作系统中,都存在hosts
文件。
在Windows操作系统中,hosts
文件存在于C:\Windows\System32\drivers\etc
目录中;在类Unix系统中(Max OS、Linux等),hosts
文件存在于/etc
目录中。
其格式为:
127.0.0.1 localhost localhost1
172.18.0.2 master hadoop_master master.net
IP和域名中间使用TAB
分割,如果一个IP需要解析到多个域名,域名之间使用空格隔开。
通过修改hosts
文件,可以达到本地IP映射到域名的效果,模拟线上环境;同时也可以满足某些服务的特殊要求,如Hadoop的namenode
web端,需要通过域名访问才可以正常上传。
修改hosts
文件不生效的情况(系统代理)
一些同学有懂得都懂的上网需求,使用系统代理的软件,如Clash
等。在使用系统代理时,由于通过域名访问的网站都会直接走系统代理的解析,会直接越过hosts
和DNS
配置,因此不会生效。
解决方案:
方法一:更换软件,可以使用PAC
代理模式的软件,如V2ray
、shadowrocket
、win to ray
等。
方法二:更改Clash
的配置文件
点击Open Folder
打开Clash的配置文件目录,找到config.yaml
文件中cfw-setting
字段或者cfw-setting.yaml
文件,在bypassText
字段下添加通过hosts
文件自定义解析的域名:
Nginx 反向代理不生效也可以用同样方法解决。