无法使用mod_lua从PostgreSQL获取数据

这是我的设置:

操作系统:Linux Ubuntu 14.04 64位

数据库:Postgres 9.4(从官方Postgres repo安装)

Apache:2.4.7与mod_lua手动编译源代码在Apache 2.4.20中并安装

数据库初始脚本如下所示:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client VARCHAR(20)NOT NULL UNIQUE,
  secret VARCHAR(20) NOT NULL
);

INSERT INTO users(client,secret)VALUES('John''John');
INSERT INTO users(client,secret)VALUES('apple''orange');
INSERT INTO users(client,secret)VALUES('kiwi''pear');
INSERT INTO users(client,secret)VALUES('peach''berry');

Apache启用了mod_dbd,配置如下:

<IfModule dbd_module>
  DBDriver      pgsql
  DBDPersist    on
  DBDMax        20
  DBDParams     "host='localhost' port='5432' dbname='demousers' user='postgres' password='postgres'"
  DBDPrepareSQL 'SELECT u.secret FROM users u WHERE u.client=%s' client_secret
</IfModule>

还有mod_lua配置如下:

<IfModule lua_module >
  LuaRoot              /vagrant/luatest
  LuaScope             thread
  LuaCodeCache         stat
  LuaHookAccessChecker /vagrant/luatest/cookie_handler.lua handler early
  LuaHookAccessChecker /vagrant/luatest/handler.lua        handler late
</IfModule>

这是我试图在handler.lua中执行的示例代码,但失败了:

require "string"
require "apache2"

local inspect = require "inspect"

function handler(r)
    local db,err  = r:dbacquire()
    if not db then
        r:debug("[500] DB Error: " .. err)
        return 500
    end
    r:debug("已获得数据库"local statement,errmsg = db:prepared(r,"client_secret"if not statement then
        r:debug("[500] DB Error: " .. errmsg)
        db:close()
        return 500
    end
    r:info("已获得准备好的语句"local secret
    local result,emsg = statement:select("john"if not emsg then
        r:info("提取行"local rows = result(0,true)
        r:debug("行 " .. inspect(rows))
        for k,row in pairs(rows)do
            r:info("传" .. k .. inspect(row))
            if row[1] then
                secret = string.format("%s",row [1])
            end
        end
    else
        r:debug("错误:".. emsg)
    end

    db:close()

    return 403
end

查看Postgres sql日志,我发现查询已正确执行并传递参数。问题在于我得到了没有值的记录,只有lua表中的nil占位符-行是这样的

{{}}

那么,这是一个bug还是我的错?

点赞
用户120806
用户120806

很不幸,这是一个 bug。详细情况请见:

https://bz.apache.org/bugzilla/show_bug.cgi?id=56379

2016-06-29 17:28:41
用户120806
用户120806

这是解决问题的方案

# 安装带有工作mod_lua的后备存储库的Apache 2.4.10
sudo apt-get install -y -t trusty-backports apache2 apache2-dev apache2-utils
sudo apt-get install -y libaprutil1-dbd-pgsql

# 安装lua依赖项
sudo apt-get build-dep -y lua5.1
sudo apt-get install -y lua5.1
sudo apt-get install -y liblua5.1-0-dev

# 获取源代码
APACHEVER='2.4.10'
cd /tmp/
apt-get source -y apache2="$APACHEVER"
mv "apache2-$APACHEVER/modules/lua/lua_dbd.c" "apache2-$APACHEVER/modules/lua/lua_dbd.c_original"
# 为 https://bz.apache.org/bugzilla/show_bug.cgi?id=56379 应用补丁,如果没有它,dbd + lua + postgres将无法工作-您需要先准备补丁文件
cp -u /vagrant/lua_dbd.c "apache2-$APACHEVER/modules/lua/"
cd "apache2-$APACHEVER/modules/lua"

# 构建和安装修补的lua模块
sudo apxs -I/usr/include/lua5.1 -cia mod_lua.c lua_*.c -lm -llua5.1
sudo service apache2 restart
2016-06-30 11:37:20