Nginx 反向代理、动静分离、负载均衡及配置实例


Nginx

Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx
的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

聊到Nginx, 那就必定要讲他最基本的三大功能

  • 反向代理
  • 动静分离
  • 负载均衡

代理

这里的代理指的是网络代理中的正向代理与反向代理,是代理模式的一种应用实例,如果需要拓展了解代理模式,可以看看我的趣谈设计模式系列博客
趣谈设计模式 | 代理模式(Proxy):利用代理来控制对象的访问

正向代理

当我们需要访问一些网站的时候,可能由于服务器距离过远,又或者是网络限制,使得我们不能够直接访问一些服务器,这时候就需要用到正向代理。

正向代理,就是让代理服务器给客户端做代理。即代理服务器将客户端的请求转发给目标服务器
在这里插入图片描述

流程如上图,客户端将请求发送给代理服务器,代理服务器再代替客户端向目标服务器发送请求,目标服务器收到请求后将响应返回给代理服务器,代理服务器再将相应的结果返还给客户端。这样就借助代理服务器,通过转发的方式使得原本不能通信的两端实现通信。


反向代理

反向代理,即让代理服务器为目标服务器做代理。在这种情况下,客户端对代理其实是无感知的,因为它没有做任何的配置,所以在它眼里,代理服务器就是目的服务器。所以在这种情况下,对外暴露的只有一个反向代理服务器,而隐藏了真实服务器

当客户端将请求发送给代理服务器时,再由代理服务器进行选择,将请求转发给内部真实的目标服务器,获取数据后将结果返回给客户端。流程如下图
在这里插入图片描述


配置实例

目标
根据访问的路径转发到不同的服务器中

流程

1.准备两台HTTP服务器以及测试页面
2.配置nginx

首先准备了两个http服务器,分别绑定在了本地的8081和8082端口,并分别存放一个html文件用于标识

//服务器1
<h1>port 8081: test1!!!<h1>

//服务器2
<h1>port 8082: test2!!!<h1>

接着打开nginx的配置文件

vim /usr/local/nginx-1.18.0/conf/nginx.conf

接着在http块中增加一个新的server节点,让其提供反向代理服务,端口号为9000,并通过配置location来设置转发规则

server {
    
    
        listen       9000;				//端口号
        server_name  192.168.220.128;	//主机号

		//正则表达式,当url中包含test1时,将其转发到下面的服务器中
        location ~ /test1/  {
    
    
                proxy_pass http://192.168.220.128:8081;
        }

        location ~ /test2/ {
    
    
                proxy_pass http://192.168.220.128:8082;
        }
    }

根据上面设置,转发情况如下

访问:http://192.168.220.128:9000/test1/ -------> 转发至:192.168.220.128:8081
访问:http://192.168.220.128:9000/test1/ -------> 转发至:192.168.220.128:8082

在这里插入图片描述
在这里插入图片描述
配置成功


动静分离

概念

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力,这就是动静分离
在这里插入图片描述
动静分离简单来说就是当客户端向代理服务器发送请求的时候,代理服务器会把动态跟静态请求分开,并将其转发到对应的服务器上。由于静态资源不需要进行交互,所以这样将其划分开一定程度上减少了服务器的压力。

动静分离从目前实现角度来讲大致分为以下两种

  1. 把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
  2. 动态跟静态文件混合在一起发布,通过nginx来将其分开。

由于我本地没有其他的服务器,因此下面我们就以第二种方式来实现


配置实例

目标
将静态资源转发到静态服务器中

流程

1.准备好静态资源
2.配置nginx

由于我本地没有其他的服务器,因此就将在本机中完成转发,假设根目录下的data文件夹即是静态资源服务器,我分别将一个html文件和一个图片存放在/data/www, data/image中,当url中包含www或者image这些静态资源时,将其转发到/data/即静态服务器中

下面开始配置,直接对nginx配置文件中的http块下的server配置即可

通过location指定不同的后缀名实现不同的请求转发

server {
    
    
        listen       80;
        server_name  192.168.220.128;

        location /www/ {
    
    
            root /data/;	//静态资源服务器
            index index.html index.htm;
        }

        location /image/ {
    
    
            root /data/;
            autoindex on;	//文件索引列表
        }
}

根据上面设置,转发情况如下

访问:http://192.168.220.128/www/ -------> 转发至:192.168.220.128/data/www/
访问:http://192.168.220.128/image/ -------> 转发至:192.168.220.128/data/imgae/

下面进行测试
在这里插入图片描述
在这里插入图片描述


负载均衡

概念

负载均衡即根据服务器的负载情况,按照分配策略将请求分发到不同的服务器上,让各个服务器的负载均衡,即避免了忙闲不均的问题,又保证了服务的高可用、高性能。
在这里插入图片描述
在当今的互联网时代,由于信息与用户的爆炸性增长,服务器的压力越来越大,早已不是原理那个单机就能满足的年代了。要想保证服务的稳定,那就必须要在服务器这方面下功夫,我们首先想到的就是提高服务器的性能,但是如今硬件缓慢的性能提升以及抵不上流量增加的速度,即使我们将机器全部换到顶级配置也无法解决这个问题。

因此我们将视角放在了横向发展,即通过不断增加服务器的数量来构造出一个集群,将请求均衡的分发到集群中的各个服务器上,这样就能够以低成本、高效果的方式缓解了日益增长的压力,这也就是负载均衡的应用场景。


分配策略

轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

//当没有指定时默认使用
upstream serverlist {
    
    
        server 192.168.220.128:8081;	
        server 192.168.220.128:8082;
    }

权重(weight):weight代表权重,默认为 1。采用了加权Round-Robin算法,权重越高则被分配的概率也就越大。通过通过设置不同的权重来控制访问量,解决后端服务器性能不均的问题

upstream serverlist {
    
    
        server 192.168.220.128:8081 weight = 4;	//没有指定权重时默认为1	
        server 192.168.220.128:8082 weight = 3;
    }

ip_hash每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。但是在扩容以及服务器宕机时,由于服务器数量发生变化,hash算法的计算结果也会不一样,就会导致大范围的缓存失效或者扩容困难等问题,因此hash模块中又引入了一致性哈希算法,在这里就不展开讲了,有兴趣的小伙伴可以看看我以前的博客
分布式存储与一致性哈希

upstream serverlist {
    
    
		ip_hash;
        server 192.168.220.128:8081;	
        server 192.168.220.128:8082;
    }

fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream serverlist {
    
    
        server 192.168.220.128:8081;	
        server 192.168.220.128:8082;
        fair;
    }

配置实例

目标
将静态资源转发到静态服务器中

流程

1.准备两个http服务器以及测试用html文件
2.配置nginx

负载均衡的配置方法如下,首先需要在http块中添加负载服务器列表

upstream serverlist {
    
    
		//可以在这里设置分配策略,默认为轮询分配
        server 192.168.220.128:8081;	//默认权重为1
        server 192.168.220.128:8082;
    }

接着在server中设置将请求转发到上述列表中

server {
    
    
        listen       80;
        server_name  192.168.220.128;

        location / {
    
    
            proxy_pass http://serverlist;	//设置转发列表
            root   html;
            index  index.html index.htm;
        }
}

配置完成后由于nginx默认采用轮询分配,因此我们每次刷新都会在两个服务器中轮询
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35423154/article/details/109566169