Nginx之反向代理与负载均衡

反向代理

反向代理概念

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
Nginx之反向代理与负载均衡_第1张图片
    从图中,可以知道,对于浏览器来说,发送一个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的功能就是把请求转发给后面的服务器,决定哪台目标主机来处理当前请求

Nginx之反向代理与负载均衡_第2张图片

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
Nginx之反向代理与负载均衡_第3张图片




负载均衡

引言

    前文已经有了反向代理(即是实现客户端请求的转发)的基础,再学习负载均衡就很简单了,负载均衡是在反向代理基础上的。

    如下图所示,接下来做这样一个假设,假如后端连接着几台,几十台用于相同服务的服务器(Tomcat服务器),这个时候Nginx做同样的反向代理,对于如此之多的后台服务器,本次客户端的请求,通过Nginx进行选择使用哪台后端服务器去提供服务,使后台服务器的负载尽可能的均衡,资源最大限度地利用,这就是负载均衡地价值和意义所在。
Nginx之反向代理与负载均衡_第4张图片

负载均衡策略

平均轮询、权重轮询、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://开头
Nginx之反向代理与负载均衡_第5张图片

你可能感兴趣的:(Nginx)