JMeter 压测 Nginx 并发限流功能

JMeter 简介

Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测
试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。本文主要使用 JMeter
测试部署在 Nginx 上的 web 应用,验证 Nginx 的限流相关功能。

安装

官网下载 http://jmeter.apache.org/download_jmeter.cgi

JMeter 压测 Nginx 并发限流功能_第1张图片
目前最新版本为 5.1.1

下载解压后运行 ApacheJMeter.jar或.bat

JMeter 配置

测试计划

新建测试计划
JMeter 压测 Nginx 并发限流功能_第2张图片

线程组

在测试计划下添加线程组
JMeter 压测 Nginx 并发限流功能_第3张图片
JMeter 压测 Nginx 并发限流功能_第4张图片
线程数:并发请求数

时间:多长时间内执行完毕

循环次数:每个线程在时长内的发送次数

这样的配置表示为 100 个请求来源在 1 秒内总并发请求 100 次

HTTP 请求

在线程组下添加 HTTP 请求
JMeter 压测 Nginx 并发限流功能_第5张图片
JMeter 压测 Nginx 并发限流功能_第6张图片
这里的配置请求访问 Nginx 转发的服务 URL,如果有请求参数也可以添加

注意:如果是需要限制总并发数,那么访问的 URL 需要配置为具体的服务地址,如果只配
置 Nginx 的静态页面地址,测试限流会不成功。

观察结果树

在线程组下添加观察结果树
JMeter 压测 Nginx 并发限流功能_第7张图片
添加汇总报告
JMeter 压测 Nginx 并发限流功能_第8张图片
用于查询测试结果

Nginx 配置

通过在 nginx.conf 文件中的配置,对 Nginx 代理的静态网页访问做限流的功能,在 Nginx 中
的限流有三种方式:

limit_conn_zone
limit_req_zone
ngx_http_upstream_module

并发限制

limit_conn_zone 用来限制同一时间连接数,即并发限制

场景配置示例

  1. 同一 ip 的客户端,并发限制为 10 个

http 下的配置:

http {
limit_conn_zone $binary_remote_addr zone=perip:10m;

参数$binary_remote_addr 为限制同一客户端 ip 地址

参数 zone 为自定义存储区的名字

10m 是存储会话的大小,1m 能存 32000 个并发会话

server 下的配置:

server {
limit_conn perip 10;

perip 对应配置的 zone

如果在 location 下配置则限制此转发路径的请求

2. Nginx 服务器全局并发限制为 100 个

http 下的配置:

http {
limit_conn_zone $server_name zone=perserver:10m;

参数$server_name 为限制同一服务器的最大并发

参数 zone 为自定义存储区的名字

10m 是存储会话的大小,1m 能存 32000 个并发会话

server 下的配置:

server {
limit_conn perserver 100;

perserver 对应配置的 zone

速率限制

limit_req_zone 用来限制单位时间内的请求数,即速率限制

场景配置示例

同一 ip 的客户端,访问速率限制为每秒 5 个

http 下的配置:

http {
limit_req_zone $binary_remote_addr zone=req_one:10m rate=5r/s;

参数 rate 为每秒的请求上限

server 下的配置:

server {
limit_req zone=req_one burst=5 nodelay;

req_one 对应配置的 zone

burst 指超过上限的请求后可以有 N 个进入延迟队列,在请求结束后响应,如果不加则超
过的直接被拒绝
nodelay 表示超过上限的请求立即被拒绝,如果没有该字段会造成大量的 tcp 连接请求等

后端限流

ngx_http_upstream_module 提供了后端限流功能,1.11.5 版本后非商用版可用

http 下的配置:
http {
upstream node{
server 127.0.0.1:8080 max_conns=1;
}

#超出的请求会返回 502 状态码

压测

场景为限制 nginx 服务器全局并发上线为 5

配置如下:

http {
	#对总并发数限制
	limit_conn_zone $server_name zone=perserver:10m;
	include mime.types;
	default_type application/octet-stream;
	#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 	# '$status $body_bytes_sent "$http_referer" '
 	# '"$http_user_agent" "$http_x_forwarded_for"';
	#access_log logs/access.log main;
	sendfile on;
	#tcp_nopush on;
	#keepalive_timeout 0;
	keepalive_timeout 65;
	#gzip on;
	
server {
	listen 8080;
	server_name localhost;
	limit_conn perserver 5;
	#charset koi8-r;
	#access_log logs/host.access.log main;
	
	location / {
 		root dist;
		index index.html;
	}

启动测试线程组
JMeter 压测 Nginx 并发限流功能_第9张图片
查看结果树

JMeter 压测 Nginx 并发限流功能_第10张图片
100 个中成功了 5 个

查看汇总报告
在这里插入图片描述
异常率为 95%

你可能感兴趣的:(测试)