全链路性能测试:Nginx 负载均衡的性能分析和调优

发布于 更新于
本文目录
  1. 前言
  2. 什么是Nginx
  3. Nginx: 是一个用 C 语言编写的高性能HTTP服务器、反向代理web服务器,具备占用内存少 + 并发能力强的优点。主要作为, 集群、负载均衡的软件、反向代理服务器、web服务器。
  4. nginx安装
  5. Nginx与项目集群的负载均衡实战
  6. Nginx的均衡策略
  7. 1、weight 权重 : 值越大,转发到的流量越多。 按照比例关系来分配流量。
  8. 2、轮询:默认策略,max_fails 在fail_timeout时间内最大失败次数,如果所有都失败,任务服务器已停就会踢掉这个服务器,不再分配流量给他【这个按照默认配置就可】
  9. 3、least_conn最小连接:此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况 【会自动检测服务器的性能进行分配 处理时间短的服务器就会多分配,长时间的少分配】
  10. 4、ip_hash和url_hash用的会相对少一些,以为这两种方案都是在服务缓存不共享的情况用,但是现在大部分公司都是redis这种缓存共享机制,所以用的很少。
  11. 5、fair响应时间: 借助收费的第三方插件,也比较少。愿意花钱的,效果还是比较好的。
  12. Nginx对性能测试调优

技术文章性能测试

为什么性能测试很多同学觉得是一个比较难以自学上岸的测试领域,是因为真正做全链路的性能测试是比较难的。所谓的全链路就是在项目的整个链路上任何一环节都有可能存在性能测试瓶颈,我们都需要能够通过分析性能的监控指标找到对应的问题。

前言

为什么性能测试很多同学觉得是一个比较难以自学上岸的测试领域,是因为真正做全链路的性能测试是比较难的。所谓的全链路就是在项目的整个链路上任何一环节都有可能存在性能测试瓶颈,我们都需要能够通过分析性能的监控指标找到对应的问题。

我们今天要讲的Nginx负载均衡就是属于项目链路的一个环节,如果这个环节出了问题,那么也会造成性能瓶颈问题。所以,我们就需要深入了解一下具体什么是Nginx,以及Nginx出了问题会带来什么样问题以及如何解决这些问题。

什么是Nginx

Nginx: 是一个用 C 语言编写的高性能HTTP服务器、反向代理web服务器,具备占用内存少 + 并发能力强的优点。主要作为, 集群、负载均衡的软件、反向代理服务器、web服务器。

那么,这里讲到的反向代理又是什么?跟我们之前了解到的正向代理有什么区别呢?

  • 正向代理:是给客户端做代理, 服务器收到的都是代理给我发过来的数据,不知道是哪个客户端;应用场景是客户端有集群时,代表就是VPN;

图片.png
  • 反向代理: 是给服务器做代理,客户端访问服务器其实访问的都是代理的地址,不知道服务器是哪个 服务器地址不会暴露;应用场景就是有服务器集群时,代表是Nginx,可以保护服务器的地址不会暴露,也可以做负载均衡。

因为所有的流量都要经过这个反向代理,所以这个性能要求非常高,Nginx就是一个内存占用少,并发能力强的一种反向代理,所以使用非常广泛。

图片.png

我们要学习Nginx就需要先安装部署一个Nginx服务,然后才能演示看到其工作原理。

nginx安装

  • 第一步:安装依赖:yum install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel -y ,因为是C语言写的 所以要安装一些C语言的依赖;

  • 第二步:安装pcre:wget **https://sourceforge.net/projects/pcre/files/pcre/8.44/pcre-8.44.tar.gz/download --no-check-certificate

    • 解压 : tar -xzvf download ,得到一个pcre-8.44 文件夹

    • 进入解压后的文件夹: cd pcre-8.44/

      • ./configure ,做编译,配置加载检查

      • make && make install ,安装和编译

  • 第三步:下载安装Nginx安装包:wget **http://nginx.org/download/nginx-1.19.5.tar.gz # 解压 进入nginx解压后的文件夹

    • ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

    • make && make install

  • 第四步: 启动nginx:

    • 1)cd /usr/local/nginx/sbin

    • 2)./nginx 【启动进程】

    • 3)ps -ef | grep nginx : 检查是否启动,启动master 和worker两个进程,说明启动成功了

图片.png
  • 第五步:访问一下这个Nginx服务是否可以访问成功

    • web页面访问:默认端口是80,地址: http://服务器ip地址, 能打开看到如下页面就说明成功了

图片.png

Nginx与项目集群的负载均衡实战

nginx配置负载均衡肯定是因为有多个相同的服务,至少2个以上,所以我们要启动2项目:

  • 1、修改nginx.conf配置文件,把 两个项目做成集群

vim /usr/local/nginx/conf/nginx.conf
upstream web_app {

 	server 项目1的IP地址:端口 weight=1 max_fails=2 fail_timeout=30s;
	server 项目2的IP地址:端口 weight=1 max_fails=2 fail_timeout=30s;
	}
location / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host  $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://web_app;
            root   html;
            index  index.html index.htm;
        }
  • 2、配置完后,所有经过Nginx的流量,都会走到location里:location里的代理匹配web_app,就会找到upstream里进行负载均衡,按照权重的配置走到对应的服务器。

  • 3、配置完成后,测试一下配置文件以及重新加载配置文件:

图片.png
  • 4、然后没有问题,就可以直接访问的是Nginx网关,由网关去做分配具体访问到哪个服务器。

Nginx的均衡策略

1、weight 权重 : 值越大,转发到的流量越多。 按照比例关系来分配流量。

  • 此策略 比较适合服务器的硬件配置差别比较大的情况【性能好的服务器权重大,性能差的服务器权重小】但是这 个权重需要自己去计算,并进行压测去检验这个权重是否这是合理。*

2、轮询:默认策略,max_fails 在fail_timeout时间内最大失败次数,如果所有都失败,任务服务器已停就会踢掉这个服务器,不再分配流量给他【这个按照默认配置就可】

  • 不区分后台服务是什么样的,就是轮着来分配流量。此策略适合服务器配置相当,无状态且短平快的服务使用。

  • fail_timeout: 失败轮询时长;一直会轮训查询,因为可能会恢复 恢复了就正常分配流量了;

  • fail_timeout 服务器被认为停机的时长,默认10s

3、least_conn最小连接:此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况 【会自动检测服务器的性能进行分配 处理时间短的服务器就会多分配,长时间的少分配】

4、ip_hash和url_hash用的会相对少一些,以为这两种方案都是在服务缓存不共享的情况用,但是现在大部分公司都是redis这种缓存共享机制,所以用的很少。

5、fair响应时间: 借助收费的第三方插件,也比较少。愿意花钱的,效果还是比较好的。

图片.png

Nginx对性能测试调优

当按照如上配置好Nginx之后,可以对Nginx发起性能测试请求,有Nginx按照Nginx策略分发到不同的服务器上。

如果在测试时候,我们可以通过prometheus+grafana监控Nginx和服务器集群的压力情况:

图片.png
  • server connection: 可以看到服务器有几个处理请求,waiting特别多的话,就说明很多请求在等待,服务器很繁忙

  • Upstream : 可以看到Nginx的负载均衡是否合理。如果压力都在某一台机器上,或者没有按照你配置的策略进行分配的话,那么可能就是你的负载均衡策略配置有问题或者失效了,需要去调整。

来源:testingpai

继续阅读