JMeter 简介
Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测
试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。本文主要使用 JMeter
测试部署在 Nginx 上的 web 应用,验证 Nginx 的限流相关功能。
安装
官网下载 http://jmeter.apache.org/download_jmeter.cgi
目前最新版本为 5.1.1
下载解压后运行 ApacheJMeter.jar或.bat
JMeter 配置
测试计划
新建测试计划
线程组
在测试计划下添加线程组
线程数:并发请求数
时间:多长时间内执行完毕
循环次数:每个线程在时长内的发送次数
这样的配置表示为 100 个请求来源在 1 秒内总并发请求 100 次
HTTP 请求
在线程组下添加 HTTP 请求
这里的配置请求访问 Nginx 转发的服务 URL,如果有请求参数也可以添加
注意:如果是需要限制总并发数,那么访问的 URL 需要配置为具体的服务地址,如果只配
置 Nginx 的静态页面地址,测试限流会不成功。
观察结果树
在线程组下添加观察结果树
添加汇总报告
用于查询测试结果
Nginx 配置
通过在 nginx.conf 文件中的配置,对 Nginx 代理的静态网页访问做限流的功能,在 Nginx 中
的限流有三种方式:
limit_conn_zone
limit_req_zone
ngx_http_upstream_module
并发限制
limit_conn_zone 用来限制同一时间连接数,即并发限制
场景配置示例
- 同一 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;
}
启动测试线程组
查看结果树
100 个中成功了 5 个
查看汇总报告
异常率为 95%