离线下载
PDF版 ePub版

WenMing · 更新于 2017-12-16 11:00:59

如何对 nginx lua module 添加新 api

本文真正的目的,绝对不是告诉大家如何在 nginx lua module 添加新 api 这么点东西。而是以此为例,告诉大家 nginx 模块开发环境搭建、码字编译、编写测试用例、代码提交、申请代码合并等。给大家顺路普及一下 git 的使用。

目前有个应用场景,需要获取当前 nginx worker 数量的需要,所以添加一个新的接口 ngx.config.workers()。由于这个功能实现简单,非常适合大家当做例子。废话不多说, let's fly now !

获取 openresty 默认安装包(辅助搭建基础环境):

$ wget http://openresty.org/download/ngx_openresty-1.7.10.1.tar.gz
$ tar -xvf ngx_openresty-1.7.10.1.tar.gz
$ cd ngx_openresty-1.7.10.1

从 github 上 fork 代码

  • 进入lua-nginx-module,点击右侧的 Fork 按钮
  • Fork 完毕后,进入自己的项目,点击 Clone in Desktop 把项目 clone 到本地

预编译,本步骤参考这里

$ ./configure
$ make

注意这里不需要 make install

修改自己的源码文件

# ngx_lua-0.9.15/src/ngx_http_lua_config.c

编译变化文件

$ rm ./nginx-1.7.10/objs/addon/src/ngx_http_lua_config.o
$ make

搭建测试模块

安装 perl cpan 点击查看

$ cpan
cpan[2]> install Test::Nginx::Socket::Lua

书写测试单元

$ cat 131-config-workers.t
# vim:set ft= ts=4 sw=4 et fdm=marker:
use lib 'lib';
use Test::Nginx::Socket::Lua;

#worker_connections(1014);
#master_on();
#workers(2);
#log_level('warn');

repeat_each(2);
#repeat_each(1);

plan tests => repeat_each() * (blocks() * 3);

#no_diff();
#no_long_string();
run_tests();

__DATA__

=== TEST 1: content_by_lua
--- config
    location /lua {
        content_by_lua '
            ngx.say("workers: ", ngx.config.workers())
        ';
    }
--- request
GET /lua
--- response_body_like chop
^workers: 1$
--- no_error_log
[error]
$ cat 132-config-workers_5.t
# vim:set ft= ts=4 sw=4 et fdm=marker:
use lib 'lib';
use Test::Nginx::Socket::Lua;

#worker_connections(1014);
#master_on();
workers(5);
#log_level('warn');

repeat_each(2);
#repeat_each(1);

plan tests => repeat_each() * (blocks() * 3);

#no_diff();
#no_long_string();
run_tests();

__DATA__

=== TEST 1: content_by_lua
--- config
    location /lua {
        content_by_lua '
            ngx.say("workers: ", ngx.config.workers())
        ';
    }
--- request
GET /lua
--- response_body_like chop
^workers: 5$
--- no_error_log
[error]

单元测试

$ export PATH=/path/to/your/nginx/sbin:$PATH    #设置 nginx 查找路径
$ cd ngx_lua-0.9.15                     # 进入你修改的模块
$ prove t/131-config-workers.t          # 测试指定脚本
t/131-config-workers.t .. ok
All tests successful.
Files=1, Tests=6,  1 wallclock secs ( 0.04 usr  0.00 sys +  0.18 cusr  0.05 csys =  0.27 CPU)
Result: PASS
$ 
$ prove t/132-config-workers_5.t        # 测试指定脚本
t/132-config-workers_5.t .. ok
All tests successful.
Files=1, Tests=6,  0 wallclock secs ( 0.03 usr  0.00 sys +  0.17 cusr  0.04 csys =  0.24 CPU)
Result: PASS

提交代码,推动我们的修改被官方合并

  • 首先把代码 commit 到 github
  • commit 成功后,以次点击 github 右上角的 Pull request -> New pull request
  • 这时候 github 会弹出一个自己与官方版本对比结果的页面,里面包含有我们所有的修改,确定我们的修改都被包含其中,点击 Create pull request 按钮
  • 输入标题、内容( you'd better write in english ),点击 Create pull request 按钮
  • 提交完成,就可以等待官方作者是否会被采纳了(代码+测试用例,必不可少)

来看看我们的成果吧:

pull request : 点击查看

commit detail: [点击查看](https://github.com/membphis/lua-nginx-module/commit/9 d991677 c090 e1 f86 fa5840 b19 e02 e56 a4 a17 f86)