高并发下jmeter性能压测及性能提升解决方案(二)nginx反向代理负载均衡

单机容量问题:

    随着并发量提高,单机cpu使用率增高,memory占用增加,网络带宽使用增加。

解决:

    需要水平扩展,做nginx反向代理+负载均衡策略,把同一个域名代理到多个不同的application服务器上。就要把后端的tomcat服务器集群以一个统一的域名暴露出去。

如上图架构,就需要四台虚拟机来做水平扩展,一台用于nginx反向代理,一台用于mysql,两台用于jar。

注意设置数据库的远程访问权限:

grant all privileges on *.* to root@'%' identified by 'root'; //授权任何域名用户访问对应root账号并且基于所有的权限

flush privileges;  //刷新配置生效

接入nginx反向代理:

nginx一般用于做静态web服务器,动静分离服务器,反向代理服务器。

扩展后的架构图:

 所有请求静态资源resource的通过nginx走本地磁盘(线上用NAS代替),非静态请求走服务器。前端需要修改全局映射地址,用来既可以在本地调试,又可以在云端调试:

gethost.js:

//设置全局变量h_host,在所有文件引入替换掉ajax请求路径,在线上可在改为公网地址,nginx映射后需要更改映射名称
var g_host="localhost:8090";

nginx不支持热部署,需要在加载前就确定需要使用的模块,所以建议使用OpenResty做nginx的开发框架。OpenResty是基于nginx上另外开发包装了可以支持lua,Redis的一些应用。

1.下载OpenResty

OpenResty地址:openresty.org

使用OpenResty需要前置安装pcre和openssl:

yum install pcre-devel openssl-devel gcc curl

安装OpenResty:

./configure

 编译安装: 

make

make install

 安装完成:

 2.将nginx指定成对应的web服务器

以指定配置文件的方式启动nginx:

sbin/nginx -c conf/nginx.conf  //默认80端口启动

netstat -an | grep 80  //查看启动状态

 访问后端地址,出现一下画面即安装完成:

 3.在OpenResty上完成前端资源的部署

前端资源部署:

scp -r * root@ip:/usr/local/openresty/nginx/html/

 location节点Path设置特定resource,请求走静态代理到本地磁盘:

vim conf/nginx.conf

server{
    listener 80;
    server_name localhost;

    locatin /resources/ {  //加上resources目录,注意两边都有/
        alias /usr/local/openresty/nginx/html/resources/;  //alias把路由在/resources/上的请求替换成此地址
        index index.html index.html;
    }
}

 在本地html文件下创建resources目录并执行:

mv *.html resources/

mv gethost.js resources/

cp -r static resources/

 修改配置后平滑无缝(连接不会断,但是进程号改变)重启nginx:

sbin/nginx - s reload

如图,真正起作用的是worker process。

location节点其他路径,设置nginx反向代理做动态代理

修改conf配置,设置upstream server,开启proxy pass路径:

vim conf/nginx.conf

//添加nginx反向代理,设置轮询为相等
upstream backend_server{
    server ip1 weight=1;
    server ip2 weight=1;
}

//开启反向代理
server{
    listener 80;
    server_name localhost;

    locatin /resources/ {
        alias /usr/local/openresty/nginx/html/resources/;
        index index.html index.html;
    }

    //除开resources外其他请求走一下动态资源
    location / {
        proxy_pass http://backend_server;  //proxy_pass:当前路径访问此节点时nginx不处理请求,把它代理到backend_server上(见上方配置),前端h_host需要配置
        proxy_set_header Host $http_host:$proxy_port;  //对应host传入http_host变量内,不然拿不到对应的host
        proxy_set_header X-Real-IP $remote_addr;  //真正的IP地址是远端的地址,不然拿到backend_server的地址是上面配置的地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  //nginx作为代理服务器转发了对应请求
    }
}

执行reload:sbin/nginx -s reload

开启tomcat access log(异步存储,不会影响性能)验证:

        1.在项目文件下新建tomcat文件,更改777权限,写入配置:

application.properties:

server.tomcat.accesslog.enable=true
server.tomcat.accesslog.directory=/var/www/project/tomcat
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D //%h:远端host地址 %u:远端主机的user %t:处理时长 %r:打印出第一行的请求方法 %s:http的返回状态码 %b:对应请求response的大小 %D:对应处理请求的时长

        2.重启tomcat:kill+port然后启动

        3.异步查看tomcat下的日志文件:

tail -f access_log.2021-07-13.log

        4.同步到服务器2中:

scp application.properties root@ip2:/var/www/miaosha/

         5.配置777权限+重启

使用Jmeter进行压测:

之前把数据库和项目的代码放在同一台服务器上测试的结果是数据库耗时较大,所以我们把用于数据库服务器分离出来并做带宽提升到20Mbps,把带宽所产生的影响降至最低。

在jmeter中创建请求进行压测:

        把ip地址设为代理服务器的地址后,设置同样的请求路径:

        设置同样的线程数为1000,启动时间为5s,循环30次,得到下图:

 进入数据库的服务器,使用top -H查看当前系统实时的资源消耗情况:

可以看到实时的资源消耗情况,对于单机情况下的数据库服务的压力减小了许多。

小问题:

1.当数据库和项目代码不再同一台服务器上数据库连接的消耗?

通过druid连接池长连接的断链和建连解决。

2.nginx和程序之间短连接问题?

可以通过查看实时访问项目的端口号(netstat -an | grep ip | wc -l)看到一直在创建连接和断开连接,所以是短链接。这种消耗不科学。

需要改nginx配置:

vim conf/nginx.conf

upstream backend_server{
    server ip1 weight=1;
    server ip2 weight=1;
    keepalive 30;  //30s
}


server{
    listener 80;
    server_name localhost;

    locatin /resources/ {
        alias /usr/local/openresty/nginx/html/resources/;
        index index.html index.html;
    }

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $http_host:$proxy_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_verion 1.1;  //开启http1.1,1.0不支持长连接
        proxy_set_header Connection "";  //为空默认开启长连接
    }
}

然后重新roload:sbin/nginx -s reload

通过netstat -an | grep ip |grep ESTABLISH 查看已建立的连接为长连接。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 JMeter 对系统进行递增压测。以下是一些基本步骤: 1. 安装 JMeter:从 JMeter 官方网站下载并安装 JMeter。 2. 创建测试计划:在 JMeter 中创建一个测试计划。右键点击"Test Plan",选择"Add" > "Threads (Users)" > "Thread Group"来添加一个线程组。 3. 配置线程组:在线程组中设置并发用户数、循环次数和启动时间等参数。你可以通过修改线程组中的属性来调整这些配置。 4. 添加取样器:在线程组下添加取样器来模拟请求。常用的取样器包括 HTTP 请求、FTP 请求等。右键点击线程组,选择"Add" > "Sampler"来添加取样器。 5. 配置取样器:对每个取样器进行相应的配置,包括请求的 URL、方法、参数等。 6. 添加监听器:为了收集测试结果,你可以添加监听器来显示、分析和保存数据。常用的监听器包括聚合报告、查看结果树等。右键点击线程组,选择"Add" > "Listener"来添加监听器。 7. 配置监听器:对每个监听器进行相应的配置,例如选择要显示的字段、保存测试结果的文件路径等。 8. 运行测试:点击工具栏上的绿色三角形按钮,运行你的测试计划。 在运行测试之前,确保你的测试环境和服务器能够承受所设定的压力。递增压测需要逐渐增加并发用户数,以模拟真实世界中的负载情况。你可以通过修改线程组的属性来控制递增的速度和大小。 请注意,在进行压测时要小心,确保不会对生产环境产生负面影响。同时,了解系统的性能架构和限制,以便设计合理的测试方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值