image-20210405123709832.adb9bc75
这里简单说使用域名绑定 IP,那么可以通过访问域名,DNS 拿到 IP 后访问到我们的服务,IP 有可能会变动,那么更改 IP 后,DNS 也会解析到最新的 IP,这就很方便了

这个在 HTTP 协议中有介绍,访问之前会先通过 DNS 拿到对应的 IP 地址,再通过 TCP/IP 协议与目标 IP 地址建立连接

对于我们的服务集群,来看看示意图
image-20210405124325282.78bb1731
域名绑定的是一个公网 IP,代理服务器与目标服务器是在同一个局域网内,通过内网 IP 通信

使用 SwitchHosts 模拟域名解析访问

可以通过 hosts 文件进行域名和 IP 的映射,像笔者这里是 mac 系统,前面章节为了解决跨域的问题,自己配置了几个域名,还有操作系统自己默认的 localhost 域名映射等信息

127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
127.0.0.1 kubernetes.docker.internal

192.168.56.105 shop.shop.cn
192.168.56.107 api.shop.cn

上面修改文件的反射是手动的,还有一种更好的方式来达到效果,就是使用一些工具来做这件事情

SwitchHosts 是一个管理 hosts 文件的应用,安装后就可以进行添加,然后按需切换
image-20210405130932112.a6e92d16
注意:它的原理是帮你配置的内容覆盖掉 /etc/hosts 中内容,因此在你需要切换的时候,需要将系统默认的配置先复制一份出来,方便切换回去

使用 Nginx 解决跨域问题

既然涉及到域名了,就会出现跨域问题,如下图所示
image-20210405131336983.78efa15f
域名不同,使用 ajax 访问则会出现跨域错误

CORS 跨域资源共享

全称是 Cross-Origin Resource Sharing,允许浏览器向跨 Origin 的服务器发起 js 请求获取响应

可以使用:如下几种方式解决:
● Jsonp:这种方式需要前服务端做特殊的处理
● SpringBoot Cors
前面章节已经配置过,但是由于当时笔者对 boot jar 包部署方式改成 war 包部署方式,使用起来不方便,后来想到用 hosts 模拟域名方式也没有测试通过跨域是可以的,正常情况下是可以解决的
● Nginx:反向代理

Nginx 配置静态资源防盗链

通过 ajax 有跨域的限制,但是图片等资源,跨域通过标签直接引用,就不存在跨域问题了,比如在 demo.html 中增加 img 标签

<img src="http://shop.cn:92/images/header-bg1.jpg">

在你本地打开也是能看到该图片的,设置防盗链

server {
   listen       92;
   server_name  localhost;

   # 允许跨域请求的域, * 代表所有
   add_header 'Access-Control-Allow-Origin' *;
   # 允许带上 cookie 请求
   add_header 'Access-Control-Allow-Credentials' 'true';
   # 允许请求的方法,如 GET/POST
   add_header 'Access-Control-Allow-Methods' *;
   # 允许请求的 header
   add_header 'Access-Control-Allow-Headers' *;

   # =========  静态资源防盗链配置
   # 对源站点验证
   valid_referers    *.shop.cn;
   # 非法引入会进入下方判断,响应 404
   # 该变量是 nginx 的内置变量
   if ($invalid_referer) {
   	return 404;
   }
   
   location ^~ /images {
       root   /home/foodie-shop/;
   }
}

这样配置之后,通过 ajax 和 img 标签访问都不能访问了,通过 img 标签访问的会响应 404 状态码,通过 ajax 访问的会显示跨域
image-20210405140050432.d647a3c8
因此如果在 http://shop.cn:93/demo.html 上测试的话,因为至少端口不一样,但是域名是一样的,按道理来说是可以访问的,但是这里的配置是 valid_referers *.shop.cn;

域名对应不上,这里要改成 valid_referers shop.cn; 就可以访问到了