反向代理
概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
从图中,可以知道,对于浏览器来说,发送一个http://www.a.com/uri请求到Nginx服务器,对于它来说,它认为数据就是从http://www.a.com/uri域中返回的,事实上,当http://www.a.com/uri到达Nginx服务器后,Nginx服务器会将其转发给http://www.b.com/uri,从http://www.b.com/uri域中取得数据并将其返回给浏览器,这个步骤浏览器是不知道的,也就是说,浏览器并不知道http://www.b.com/uri该域的存在,同理,http://www.b.com/uri所在的域(图中的Tomcat)也并不知道浏览器的存在,它也只对Nginx负责。Nginx的这么一个过程便称为反向代理。
Nginx作为反向代理服务器,表面上看是访问了Nginx的IP,实际上Nginx只是作为一个代理服务器,它只是将客户端的请求进行转发给真实的服务器,由真实的服务器处理请求。 当处理完请求后,再将处理结果交给Nginx,最后在回复给客户端。
可以看到,反向代理服务器的本质
仅仅是作为一个“中间代理”,对请求进行转发。
作用
1、增强了安全性
首先,你背后的服务器是在反向代理后面的,其不会暴露任何信息到网络上,所以可以防止恶意攻击。第二,可以防止DDoS( distributed denial-of-service)攻击,例如通过限制某一IP访问,限制每个客户端的访问次数等。
2、增强了可伸缩性与灵活性
因为客户端只能看到反向代理的Ip地址,所以我们就可以灵活的改变其后面服务器的配置。
3、加速Web访问速度。
第一:将返回结果压缩后交给客户端,这样就会节省网络带宽,从而加快速度。
第二:将请求的加密解密操作放在反向代理服务器上行执行。
第三:在反向代理服务器上做缓存。
4、为负载均衡和动静分离提供实现支持
负载均衡:使用反向代理同时代理多个相同内容
的应用服务器(比如tomcat),将客户端请求分发到各个应用服务器上并接收响应返回给客户端
负载均衡的作用:当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。 ==> 可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器
,然后将该访问请求引入该服务器。如此一来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
动静分离:运用Nginx的反向代理功能分发请求:所有动态资源
的请求交给应用服务器
,而静态资源的请求
(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx服务器
返回到浏览器
动静分离的作用:主要是nginx处理静态页面的效率远高于tomcat的处理能力,使用c语言开发的nginx对静态资源每秒的吞吐量是使用Java语言开发的tomcat的6倍,也远高于其它应用服务器
安装在目的主机端,主要用于转发客户机请求:后台有多个服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定哪台目标主机来处理当前请求
配置案例
Nginx配置反向代理服务器非常的简单,使用 proxy_pass 关键字,后面指定真实的服务器。 ==> 就表示nginx作为该真实服务器的代理。 详细配置请看下面案例中的示例(从网上找了几个比较经典的案例)
案例1:https://zhidao.baidu.com/question/2138875503677902868.html
浏览器 — 代理服务器127.0.0.1:80 — 真实的服务器localhost:80
浏览器 — 代理服务器127.0.0.1:80 — 真实的服务器158.37.70.143:80
解释:
a.1台nginx在前端作为反向代理服务器;后面有2台apache作为应用程序服务器);
b. nginx反向代理服务器(为127.0.0.1:80)仅仅包含一个静态页面index.html; 后台的两个apache服务器(分别为localhost:80和158.37.70.143:80),一台根目录放置phpMyAdmin文件夹和test.php(里面测试代码为print “server1“),另一台根目录仅仅放置一个test.php(里面测试代码为 print “server2“)。
c. nginx.conf的相关配置
location ^~ /phpMyAdmin/ {
proxy_pass 127.0.0.1:80 ;
}
location ~ .php$ {
proxy_pass 158.37.70.143:80 ;
}
当客户端访问localhost:8080/index.html的时候,前端的nginx会自动进行响应。
当客户端访问localhost:8080/test.php的时候,nginx服务器会自动pass给 158.37.70.143的apache服务器了。该服务器下的test.php就会被自动解析,然后将html的结果页面返回给nginx,然后 nginx 返回给客户端,输出结果为打印server2。
案例2:https://blog.csdn.net/xuanjiewu/article/details/79458266
浏览器 — Nginx代理服务器8081.max.com — web服务器http://192.168.72.49:8081
(1) 浏览器输入URL = 8081.max.com 、 192.168.72.49,表示浏览器向nginx反向代理服务器发起请求
(2) 由nginx反向代理服务器去请求 http://tomcatserver 、 http://192.168.72.49:8081 web服务器
upstream tomcatserver{
server 192.168.72.49:8081;
}
server {
listen 80;
server_name 8081.max.com; // Nginx反向代理服务器的IP host: 192.168.72.49 8081.max.com
location / {
proxy_pass http://tomcatserver; // tomcat服务器的IP
index index.html index.htm;
}
}
案例3:https://yq.aliyun.com/ziliao/333358
浏览器 — 代理服务器192.168.1.20 — web服务器http://192.168.1.10
(1) 浏览器输入URL = 192.168.1.20,表示浏览器向反向代理服务器发起请求
(2) 由反向代理服务器去请求 http://192.168.1.10 web服务器
server{
listen 80;
server_name 192.168.1.20; // Nginx反向代理服务器IP
location / {
proxy_pass http://192.168.1.10; // web服务器IP
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#error_page 404 /404.html;
案例4:https://jingyan.baidu.com/article/46650658deb079f549e5f8fa.html
浏览器 — 访问代理服务器localhost:80 — 真实的服务器localhost:8180
前文已经有了反向代理(即是实现客户端请求的转发)的基础,再学习负载均衡就很简单了,负载均衡是在反向代理基础上的。
如下图所示,接下来做这样一个假设,假如后端连接着几台,几十台用于相同服务的服务器
(Tomcat服务器),这个时候Nginx做同样的反向代理,对于如此之多的后台服务器,本次客户端的请求,通过Nginx进行选择使用哪台后端服务器去提供服务,使后台服务器的负载尽可能的均衡,资源最大限度地利用,这就是负载均衡地价值和意义所在。
策略
平均轮询、权重轮询、fair策略(根据服务器的响应能力动态weight策略)、ip_hash策略(根据用户的IP地址进行hash运算)、url_hash策略((根据URL进行hash运算)
案例
假设这里有三台后端服务器,IP地址分别为 http:// 192.168.1.62:8080、http:// 192.168.1.63:8080、http:// 192.168.1.64:8080。配置步骤:
(1) 使用upstream将3台服务器放在一起,并定义服务器群名tomcats
(2) 在 proxy_pass 中引用该服务器群名,格式为http://开头