内容简介:今天花点时间记录下nginx的反向代理知识,之前也是有用过,但是我觉得还是依旧简单地记录下来,好记性不如烂笔头,说不定你以后学了新知识,又把它忘记了,回过头想重新学习,又得百度一下这找博客,那找博客,学习成本多大呀!无论是正向代理,还是反向代理,说到底,就是代理模式的衍生版本罢了。我们都学习过代理设计模式,都知道代理模式中有代理角色和被代理角色,为什么这么说,因为这两个角色对于我们理解正向和反向代理非常重要,下面会讲到。下面我将引入这样一个场景,很多时候我们上网的网速特别慢,或者说由于翻墙问题导致我们无法
今天花点时间记录下nginx的反向代理知识,之前也是有用过,但是我觉得还是依旧简单地记录下来,好记性不如烂笔头,说不定你以后学了新知识,又把它忘记了,回过头想重新学习,又得百度一下这找博客,那找博客,学习成本多大呀!
1、正向代理和反向代理的概念
无论是正向代理,还是反向代理,说到底,就是代理模式的衍生版本罢了。我们都学习过代理设计模式,都知道代理模式中有代理角色和被代理角色,为什么这么说,因为这两个角色对于我们理解正向和反向代理非常重要,下面会讲到。
下面我将引入这样一个场景,很多时候我们上网的网速特别慢,或者说由于翻墙问题导致我们无法访问到国外的网站,通常这些情况我们会通过给浏览器配置一个网速快的、可以翻墙的代理ip及端口号来解决我们的问题,那么配置好之后,大概的请求流程如下图所示:
我们首先请求代理服务器,然后代理服务器帮我们去快速访问国外的网站,对于这种代理方式,我们就称之为正向代理。请记住,上面说到代理模式的两个角色中,我们当前的角色为 被代理者 ,也就是浏览器这个角色。更重要的是,正向代理的本质是我们去请求外部的资源,如果以生产者、消费者模式来区分,我们属于消费者。
总结:
- 1、正向代理,我们的角色是 被代理者
- 2、正向代理,我们不对外提供服务,反而是对外消费服务,属于消费者
反向代理,很显然,就是和正向代理相反,如果说正向代理是男,那么反向代理就是女了,亲,此处不再纠结其他情况!下面我用一副图片解释下反向代理:
看完上面的图片,请你想象一下这么一个场景,假设你现在是某公司技术总监,你们公司需要对外提供一套web服务,那么你打算怎么做呢?
答案是可以通过反向代理来完成。通常你们公司拥有自己的IDC机房,机房通讯通常采用局域网交换机,internet网用户请求是无法直接访问到局域网内的web服务的,因此这个时候,你需要一台反向代理服务器来接收internet web请求,然后将请求分发到局域网中的不同主机上进行处理,处理完成之后再做出响应。因此,反向代理大概就是这么一个场景。请记住,反向代理中,我们的角色是 局域网 web服务 。
总结:
- 1、反向代理,我们的角色是 局域网 web服务
- 2、反向代理,我们对外提供服务,属于服务提供者
2、nginx正向代理和反向代理实例解析
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_host$request_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
以上所述就是小编给大家介绍的《Nginx 学习系列(一) ------------- 正向代理与反向代理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- JAVA 动态代理学习记录
- Nginx学习笔记(反向代理&搭建集群)
- mybatis源码学习:从SqlSessionFactory到代理对象的生成
- 实战docker,构建nginx反向代理tomcat,学习link和docker-compose
- 实战docker,构建nginx反向代理tomcat,学习link和docker-compose
- 正向代理、反向代理和透明代理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript Web应用开发
[阿根廷] Nicolas Bevacqua / 安道 / 人民邮电出版社 / 2015-9 / 59.00元
本书是面向一线开发人员的一本实用教程,对最新的Web开发技术与程序进行了全面的梳理和总结,为JavaScript开发人员提供了改进Web开发质量和开发流程的最新技术。本书主要分两大块,首先是以构建为目标实现JavaScript驱动开发,其次介绍如何管理应用设计过程中的复杂度,包括模块化、MVC、异步代码流、测试以及API设计原则。一起来看看 《JavaScript Web应用开发》 这本书的介绍吧!