认识中间件之Nginx

认识中间件之Nginx

Administrator 33 2024-06-28

一、什么是Nginx

  Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。其特点是占有内存少,并发能力强。我们可以理解Nginx是客户端和服务端的中间件,可以进行对实例的策略管理,提供反向代理、负载均衡和流量控制等策略。

二、Nginx反向代理

  正常情况下,我们可以使用浏览器访问国内的网页,而对于像谷歌、油管等国外网站,则需要通过设置代理服务器,才能访问,这就是正向代理。也可以理解为代理了客户端。

image.png

  而反向代理的意思就是:代理了服务器,客户端通过一个ip地址,经由反向代理的服务器(Nginx),再访问到多台服务器的某一台。

image.png

三、 Nginx应用场景

1)实现反向代理

  例如作者部署本博客后,会有对应ip的端口号(8080),一般还需要购买域名,而域名默认指向的端口都是80端口,想指向其他端口就需要依赖Nginx反向代理。

image.png

配置Niginx反向代理如下:

  1. 使用命令打开nginx配置文件
sudo vi /etc/nginx/nginx.conf   //打开nginx配置文件
  1. 在配置文件中找到监听80端口的部分,修改成监听8080端口,如下所示
        location / {
          proxy_pass http://0.0.0.0:8080;
     }

2)实现负载均衡

  负载均衡是将客户端的请求分摊到多个服务器上进行执行,也就是将负载分担到多个操作单元上共同完成工作任务。

image.png

可实现的负载策略有:

  • 轮巡规则。 例如有2个实例 A B,命中规则是A B A B A B,交替进行。

配置规则如下(打开nginx配置文件):

  1. 在http下定义一个共享内存区域,配置要轮巡的实例对象
    upstream myapp {                     # myapp: 变量名
    server 127.0.0.1:8771;              # server: 实例对象
    server 127.0.0.1:8772;
 }
  1. 修改端口监听下的location配置,添加映射对象
       location / {
       proxy_pass http://myapp;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
  • 权重分配。 假如有2个实例 A B,A配置1,B配置4, 命中规则是 B A B B B ,根据权重来随机分配。

配置规则如下(打开nginx配置文件):
修改myapp的配置,增加weight的配置项,值为整数,权重分配比例根据所配置的整数进行划分,比方说2:8

    upstream myapp {                  
    server 127.0.0.1:8771 weight=2;             
    server 127.0.0.1:8772 weight=8;
 }

3)实现流量控制

  通过Nginx可以限制客户端的请求次数,达到限流的效果。例如我们可以设置两个参数:

  • 1)每秒一个请求
  • 2)超出设置请求之后最多可接收的请求数量为5。

  那么如果一个ip发送超过了1个请求,Nginx会开始限制该ip,最多允许它发送额外5个请求。

配置规则如下(打开nginx配置文件):

  1. 在http下定义一个共享内存区域,配置要轮巡的实例对象
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;     #mylimit: 变量名,rate: 每秒请求不能>=1次
  1. 修改端口监听下的location配置,添加limit_req 的描述,burst指的是最多可接收的请求数量
     location / {
         limit_req zone=mylimit burst=10 nodelay;   
         proxy_pass http://myapp;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

四、Nginx测试策略

  • 测试对象:被测服务中nginx机制的正确性
  • 负载均衡:模拟多个请求,通过服务的日志结果验证负载均衡的策略是否符合期望值
  • 流量控制:模拟多个请求,触发限流规则,验证限流规则是否生效(如果是短时间多个请求,一般可以通过python的多线程来实现)