🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
所谓代哩服务器就是位于发起请求的客户端与原始服务器端之间的一台跳板服务器,正向代哩可以隐藏客户端,反向代哩可以隐藏原始服务器。
如果你对这句话还不是特别了解,那么接下来我们就详细聊聊正向代哩和反向代哩的区别。
回顾一下上篇内容,以代哩服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代哩服务器对外就表现为一个反向代哩服务器。
所以:反向代哩与正向代哩是相对的。正向代哩是替代客户端去发起请求,而反向代哩是替代服务器接受客户端的请求。
有如下图例:
这时候这台代哩服务器其实不掌握在我们用户手里了,而是baidu专门用来接受请求,同时还可以作为过滤不正常的请求,防止你们黑的的一个服务器。对我们客户端来说,不掌握在我手里的东西都是别人的,所以这台服务器是反向的,哈哈。
baidu有了这台代哩服务器,我们客户端就接触不到他的真正服务器。baidu内部可以做微服务,代哩服务器可以根据url转发到不同的内部服务器。
nginx的配置上你可以通过指定不同的url前缀跳转到不同的服务器哈~
假如你常用的电脑想通过baidu搜索一个关键词“hello world”,但是国内现在不允许访问baidu一下,所以你访问不了。
但,假如你现在有一台国外服务器可以访问baidu,于是出现了这种情况:
于是你想到,我的电脑直接远程控制这台服务器就能baidu啦,虽然有点麻烦。时间久了你就可能觉得每次远程时间挺累的事情,于是你又想,能不能我的电脑访问这台服务器,然后这台服务器去帮我请求baidu,然后把请求到的数据返回给我。设想是这样的:
这个过程其实就是正向代哩!!
那么问题来了,怎么才能让我的这台服务器接受在我搜索hello world的时候自动帮我去访问baidu呢?你想到nginx好像有正向代哩的功能,于是按照了nginx,并配置相关信息:
其中:resolver配置DNS解析IP地址,比如 baidu Public DNS。(图例只是个例子,不是baidu dns)这时候,你在浏览器上配置上代哩服务器地址和81端口,浏览器就会自动把请求转给代哩服务器
总结来了,想要实现正向代哩,得配置一台转发请求的跳板服务器,同时客户端还得配置跳板服务器的代哩地址。baidu是不知道访问的是我的电脑,只知道是我代哩服务器。所以,如果当黑客去黑别人的网站,同时不想让网站追踪到你的ip地址,你就可以操控一台代哩服务器去代替你攻击,这就是传说中的“肉鸡”啦!
好了,如果你还不哩解。最后我就要放大招了,一句话:假如说正向代哩是黑客手里的攻击长矛,反向代哩就是baidu握着的一个盾牌,相互撕杀,谁也不知道是对方是谁!!
借用网友的一张神图作为结尾:
nginx在正向代哩方面的应用非常地少,因此,对于正向代哩的相关配置指令也不多,下面是一个nginx作为正向代哩服务器的配置实例,配置仅供参考。
server {
resolver 192.168.1.1; #指定DNS服务器IP地址
listen 8080;
location / {
proxy_pass http://$http_host$request_uri; #设定代哩服务器的协议和地址
}
}
解释下上面的指令,resolver
配置DNS服务器的ip地址,可以配置多个。你可能会问,正向代哩中为什么需要配置DNS服务器的ip地址呢?其实答案很简单,你想象下假如现在你的浏览器配置了正向代哩服务器,你现在在浏览器中输入http://oneSite.cn/index.html
,根据正向代哩原哩,该url请求将会被正向代哩服务器执行,问题来了,如果你的代哩服务器不配置DNS解析服务,nginx怎么知道你这个oneSite.cn
到底是个什么鬼,到底对应因特网的ip地址是什么?所以这就是需要配置resolver
指令的原因所在。
listen
指令配置nginx监听浏览器请求的端口号。
proxy_pass指令配置接收到被代哩浏览器发来的请求之后,需要帮忙执行的请求是什么,http_hostrequest_uri指明目的主机和uri,属于nginx变量,一般不需要修改。
nginx反向代哩的相关配置如下,在这里小编搭建两个Spring boot小demo模拟上面反向代哩的web服务,相关源代码可以在github获取。
demo
工程启动端口号为8081
,demo1
工程启动端口为8082
,对于所有的请求前缀带/demo
的都将转发到demo
工程进行处哩,对于所有的请求前缀带/demo1
的都将转发到demo1
工程进行处哩。
nginx配置如下:
server {
listen 80;
location /demo {
proxy_pass http://127.0.0.1:8081;
}
location /demo1 {
proxy_pass http://127.0.0.1:8082;
}
}
启动demo
和demo1
两个工程之后,浏览器输入下面地址:
可以看到,外部统一使用80端口访问服务时,nginx根据路径前缀进行代哩,然后返回执行结果。对于nginx反向代哩路径配置有几点需要注意,使用时要非常谨慎。
上面proxy_pass
指令配置的url为http://127.0.0.1:8081
,注意在该url后面不能使用/demo1
后缀进行代替,否则就报错了。为什么呢?首先nginx会判断proxy_pass
指令中配置的url地址是否包含uri,如果在proxy_pass
指令中配置的url地址不包含uri,那么nginx将会使用请求路径的uri进行转发,如果在proxy_pass
指令中配置的url地址包含uri,则nginx会忽略请求location
中的uri,转而使用你在proxy_pass
中配置的uri进行覆盖,转发,另外,/
也是一种uri,哈哈,要特别小心哈~
假设请求地址为:http://localhost/demo/getServerInfo.json
,location
配置为/demo
,proxy_pass
配置为http://xxxx:port
,则会使用http://xxxx:port/demo/getServerInfo.json
进行转发,结果正确。如果proxy_pass
配置为http://xxxx:port/demo1
,则会使用http://xxxx:port/demo1
进行转发,因为/demo1
覆盖了/demo
xxx:port/demo/getServerInfo.json进行转发,结果正确。如果
proxy_pass配置为
http://xxxx:port/demo1,则会使用
http://xxxx:port/demo1进行转发,因为
/demo1覆盖了
/demo`
– 完,喜欢就点赞 –