前言:本文主要谈理解
一:IP地址
查看IP地址的代码
ipconfig # Windows
ifconfig # linux(我这里使用的是Ubuntu)
首先,基于IP协议,IP地址可以看作一台服务器的身份证,我们可以根据IP来指定连接到某一台服务器(前提是对外开放)。例如下图,通过ping指令查看是否可以连接到该地址。
ping xxx.xxx.xxx.xxx # 填入实际的IP
目前几乎所有可以通过浏览器访问的网站,需要联网的程序,软件,APP等。都需要部署到一台或多台服务器上,假设我们需要访问这台服务器中的web服务,可以通过指定IP地址以及端口来实现,例如:如果没有程序运行并指定端口。
这里我在本地运行了一个web服务并制定了5000端口。
由此我们想到三个问题,
1.IP地址是可能变化的
2.我们不可能记住每一个需要使用的网站的IP
3.对于腾讯/百度/华为等大企业,他们的某个程序不可能只运行在一个服务器上,会布置到多个服务器上,这样就有多个IP地址。
所有我们需要用统一的名字来描述,例如,百度的IP地址很多,但是我们不需要知道百度的IP是什么,我们只需要知道https://www.baidu.com这个名字,就可以直接访问百度的网站。
二:域名
当前我们访问百度的顺序是:协议(https)+域名(www.baidu.com)+后缀(这个会在输入查询条件的时候生成),例如我在百度询问11+11等于多少,会生成一个URL。
11+12等于多少?_百度搜索 (baidu.com)https://www.baidu.com/s?wd=11%2B12%E7%AD%89%E4%BA%8E%E5%A4%9A%E5%B0%91%3F&rsv_spt=1&rsv_iqid=0xa9d069f20000c31d&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=29&rsv_sug1=30&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&prefixsug=11%252B12%25E7%25AD%2589%25E4%25BA%258E%25E5%25A4%259A%25E5%25B0%2591%25EF%25BC%259F&rsp=6&inputT=10830&rsv_sug4=16684 可以看到,还是有 协议(https)://域名:(www.baidu.com),后面出现了后缀
/s?wd=11%2B12%E7%AD%89%E4%BA%8E%E5%A4%9A%E5%B0%........
这就是完整的访问一个网站的步骤
现在我们来分析,为什么我们访问域名就能访问到指定的服务器上,并访问到指定的程序?
下图是计算机网络的五层模型和七层模型
下图是访问服务和域名解析过程:
简单来说就是,我们使用浏览器输入一个URL,根据HTTP/HTTPS确定协议,根据域名自动访问到一个最优解的服务器上(最近,访问量最小,曾经访问过......)然后通过后缀调用具体的服务,最后获取返回结果,在浏览器渲染。
这个过程就是顺着计算机网络的模型一步一步往下执行的。
显然,上面的域名引申出多个问题,我们为什么能通过域名访问到指定的IP地址?会不会访问到别的IP地址?如何保障安全性?我如何让我的IP地址能对应一个域名?如何支持很多人同时访问我的服务?
三:代理
代理就像一个中间商,从客户段获取到数据(URL,参数等等)后,将这些参数发送给服务端,然后代理获取到服务端的返回值后,再返回给客户端。
就像张三需要买盐,就是张三拿着十元钱到王五处买一包盐,王五把盐给张三,结束。这个是没有代理的的访问。
而代理就是,张三给了李四10元钱,并指定买一包盐。李四拿着钱去王五那买了一包盐,王五把盐给李四。李四把盐给张三,结束。
上述情况中,因为有李四的介入,张三和王五并没有直接接触,但是张三和王五都获取到了自己需要的资源。这样就引出了代理的两个方向,正向代理和反向代理。
正向代理:客户端通过代理访问服务端,但是服务端不知道客户端是谁。
例如:我在中国想购买海外商店A的产品,可是我又不能出国,所以我让代理人出国帮我购买,代理人可以出国并在A处购买产品,然后把东西带回国并交给我。
反向代理:客户端通过代理访问一个网站,但是不指定具体的服务端。
例如:我现在需要购买一瓶水,我不在意这瓶水是谁生产的,也不在乎从哪买的,这时候代理人拥有好几家店铺的位置,他可以去任意一家店买,这时候我让代理去买,代理会根据设置好的逻辑寻找一个合适的店铺去买。最后我只需要拿到代理给我的水就行。
这里我通过nginx为代理工具来讲解代理的作用。
1.中间层转发
2.负载均衡
3.安全性增强
4.反向代理
5.web缓存
6.SSL/TLS终止等等
nginx配置:
server { # 一个config文件中一般只有一个server
listen 80; # 监听的端口
server_name example.com; # 代理后的域名
location / { # “/”表示后缀
proxy_pass http://backend_server; # 指定服务的IP地址和端口
proxy_set_header Host $host; # 请求host
proxy_set_header X-Real-IP $remote_addr; # 请求IP
}
location /abc { # “/abc”为后缀
proxy_pass http://test_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
我们可以通过server代理服务器配置,location表示访问这个域名+后缀的时候被哪个loaction处理。例如我访问http://example.com/会访问http://backend_server,访问http://example.com/abc会访问到http://test_server。
通过上述的代理方法,我们可以直接更改url的后缀来实现调用不同的服务。
四:总结
基于现在网络通讯的发展,大部分成熟的业务都需要通过代理来实现各种功能。
在开发部署中需要使用代理工具来保证程序能更好运行。
我会在其他文章中具体描述代理,IP,URL具体的使用方法和工具等。