Test::Nginx能指定现成的nginx.conf,而不是自动生成一个吗?

301 views
Skip to first unread message

Celebi

unread,
Aug 1, 2016, 10:51:36 PM8/1/16
to openresty
我看Test::Nginx主要用来测给nginx写的C模块或者lua模块,能用来测完整的nginx web服务吗?

比如我有现成的写好的整套nginx配置文件,包含nginx.conf和其他location用到的业务.lua文件,我怎么用Test::Nginx测我的整个web应用?

我看Test::Nginx的说明,都需要写--- config section来生成nginx.conf,但如何用我现成的nginx.conf呢?
如果我不写--- config,会报错找不到--- config section

当然我可以指定TEST_NGINX_NO_NGINX_MANAGER和TEST_NGINX_CLIENT_PORT来测现成的nginx进程。
但如果我想同时使用Test::Nginx每次单独起一个nginx实例监听TEST_NGINX_PORT=1989,测试完自动关掉这个实例呢?

DeJiang Zhu

unread,
Aug 3, 2016, 10:00:29 AM8/3/16
to open...@googlegroups.com
Hello

你可以把你的需要的配置段加入进来,足够自动生成你需要的


--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

Celebi

unread,
Aug 5, 2016, 3:54:21 AM8/5/16
to openresty
谢谢,我不写perl的,所以之前没想过看cpan上的这个文档,确实是不错的文档。

但我看过文档之后,如果我要用这种方法实现我的目的,我需要手动(或者写个工具)将现有的nginx.conf拆开,然后写到不同的section中去。还是有点麻烦。
不过看过文档之后,好像现在也没有很好的办法实现。
或者要自己修改Test::Nginx,增加section指定nginx.conf文件路径

Yichun Zhang (agentzh)

unread,
Aug 5, 2016, 5:25:42 PM8/5/16
to openresty
Hello!

2016-08-05 0:54 GMT-07:00 Celebi:
> 谢谢,我不写perl的,所以之前没想过看cpan上的这个文档,确实是不错的文档。
>
> 但我看过文档之后,如果我要用这种方法实现我的目的,我需要手动(或者写个工具)将现有的nginx.conf拆开,然后写到不同的section中去。还是有点麻烦。

或许你可以用 nginx 的 include 指令来加载核心的 nginx 配置?比如

=== TEST 1: App
--- config
include ../../../conf/app-core.conf;
--- request
GET /t
--- response_body
hello world
--- no_error_log
[error]

假设你的项目目录结构是这样的:

t/
└── a.t
conf/
└── app-core.conf

nginx.conf 的 boilter-plate 由 Test::Nginx 来自动生成是必要的,否则我们无法实现这里列举的
Test::Nginx 的各种高级测试模式:

https://openresty.gitbooks.io/programming-openresty/content/testing/test-modes.html

Regards,
-agentzh
Message has been deleted

Celebi

unread,
Aug 9, 2016, 5:49:43 AM8/9/16
to openresty
这个思路不错。

但如果我的app-core.conf里面如果有 include 或者 content_by_lua_file 使用了相对路径,就会导致错误
有什么办法可以避免Test::Nginx一套相对路径,线上环境一套相对路径吗?只能用绝对路径了?

Celebi

unread,
Aug 9, 2016, 10:56:13 PM8/9/16
to openresty
仔细看了你给的链接的各种test mode,如果不由Test::Nginx生成nginx.conf的话,

Benchmark Mode是可以的,貌似用外部工具(weighttp/ab)做性能测试,

HUP Reload Mode是可以的,每次给现有的nginx进程发HUP signal

Valgrind Mode是不可以的,因为不能控制nginx的启动结束

Naive Memory Leak Check Mode是可以的,因为是外部ps命令检查nginx内存增长情况

剩下的Mockeagain Mode,Manual Debugging Mode,SystemTap Mode链接里没有介绍,不了解情况。


不知道我理解得对不对。

不由Test::Nginx生成nginx.conf对于那些高级测试模式有什么限制,有具体例子吗?



On Saturday, August 6, 2016 at 5:25:42 AM UTC+8, agentzh wrote:

Zexuan Luo

unread,
Aug 10, 2016, 3:31:55 AM8/10/16
to openresty
一个思路是在拼配置字符串时使用perl变量。
举个例子:

my $pwd = cwd();
our $HttpConfig = qq{
lua_package_path "$pwd/src/?.lua;;";
};
our $Config = qq{
location = /rank {
content_by_lua_file $pwd/src/increment_rank_api.lua;
}
};

run_tests();

__DATA__
=== TEST 1: /rank ok
--- http_config eval: $::HttpConfig
--- config eval: $::Config

这里 $pwd 是一个在测试运行时赋值的变量。

在 2016年8月9日星期二 UTC+8下午5:49:43,Celebi写道:

Celebi

unread,
Aug 10, 2016, 8:52:19 AM8/10/16
to openresty
我本来的目的是使用现成的conf文件,如果像你举的例子那样做,就违背了初衷了。不过可以写perl去批量读每个文件替换路径,但这就麻烦了

你用变量的思路提醒了我,可以用nginx本身的变量,set $test_path "../../.."; 然后用这个$test_path,或者使用环境变量,用set_by_lua 设个变量来用
但这种方法有一个缺陷,set和set_by_lua只能在server和location里使用,没法在http里使用,因此http下的init_by_lua_file的路径问题无法解决
Reply all
Reply to author
Forward
0 new messages