# 测试

# 简易测试

运行下列命令,如果输出 403 则表示模块正常工作。

curl -I -o /dev/null --user-agent bench -s -w "%{http_code}\\n" https://example.com/

# 自动测试

本项目附带了许多测试用例,你可以通过下面的指令来运行全部的用例。

# 这行命令的执行时间比较长,但是以后再测试的时候就不需要运行了。
cpan Test::Nginx

# 你需要指定一个临时目录。
# 如果目录不存在会自动创建。
# 如果目录已经会被存在则会先**删除**再创建。
export MODULE_TEST_PATH=/path/to/temp/dir

# 如果你安装了动态模块则需要指定动态模块的绝对路径,反之则无需执行这行命令。
export MODULE_PATH=/path/to/ngx_http_waf_module.so

cd ./test/test-nginx
sh ./init.sh
sh ./start.sh ./t/*.t

正常情况下所有的用例都会通过,如果没有通过请告诉我们。

# 性能测试

# 示例测试

# 测试说明

  • ngx_waf v5.1.1。
  • 使用了约 21 万条 IPV4 白名单规则。
  • 使用了约 21 万条 IPV4 黑名单规则。
  • 使用了约 48000 条 IPV6 白名单规则。
  • 使用了约 48000 条 IPV6 黑名单规则。
  • 使用了十万条 URL 黑名单规则,通过随机字符串生成器获得。
  • 使用了十万条 URL 白名单规则,通过随机字符串生成器获得。
  • 使用了 5000 个随机字符串,通过随机字符串生成器获得。每次请求时从中随机挑选一个作为 URI 发送 GET 请求。
  • 测试持续 30 分钟。
  • 一共测试两次,一次开启防火墙,一次关闭防火墙。

注意

测试用的 IP 是从 IPdney (opens new window) 获得的。

测试时的配置

master_process on;
worker_processes  1;

http {
    server {
        listen 80;
        server_name  localhost;

        access_log off;
        
        waf on;
        waf_mode DYNAMIC !CC !POST;
        waf_rule_path /usr/local/src/ngx_waf/rules/;
        waf_cache capacity=6000 interval=1h percent=50;

        location / {
            default_type text/html;
            return 200 'hello';
        }
    }
}

# 测试命令

wrk -c 100 -d 30m -t 1 -s test/wrk/rand.lua --latency http://localhost/ -- /path/to/rand-str.txt

# 测试结果

开启防火墙后 RPS(每秒请求数) 降低了约 4%。

# waf on;
wrk -c 100 -d 30m -t 1 -s ngx_waf/test/wrk/rand.lua --timeout 1m --latency http://localhost/ -- /usr/local/src/ngx_waf/txt.txt

Running 30m test @ http://localhost/
  1 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    78.56ms  340.74ms   3.97s    94.52%
    Req/Sec    67.33k    25.42k   95.38k    86.58%
  Latency Distribution
     50%    1.14ms
     75%    1.48ms
     90%    4.84ms
     99%    1.97s
  120532104 requests in 30.00m, 17.06GB read
Requests/sec:  66959.26
Transfer/sec:      9.71MB


# waf off;
wrk -c 100 -d 30m -t 1 -s ngx_waf/test/wrk/rand.lua --timeout 1m --latency http://localhost/ -- /usr/local/src/ngx_waf/txt.txt

Running 30m test @ http://localhost/
  1 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   803.44us    0.87ms  40.32ms   95.23%
    Req/Sec    70.69k    10.46k  105.82k    81.15%
  Latency Distribution
     50%  590.00us
     75%  760.00us
     90%    1.25ms
     99%    4.25ms
  126562158 requests in 30.00m, 17.92GB read
Requests/sec:  70310.93
Transfer/sec:     10.19MB

# 自行测试

你可以使用 wrk (opens new window) 对本模块进行性能测试。

本项目提供了 wrk 的 lua 脚本用来辅助测试,脚本的路径为 test/wrk/rand.lua,其功能是使用随机的 URI 发送 GET 请求。你需要为其提供一个含有一定数量的随机字符串的文本文件,每行一个随机字符串。然后通过下面的命令进行测试。

wrk -c 100 -d 1m -t 1 -s test/wrk/rand.lua --latency http://localhost/ -- /path/to/rand-str.txt