ZBLOG

don't know how to auth postgresql openresty的pgmoon报错

这是一个常见的 OpenResty + pgmoon 认证配置问题。以下是完整的解决方案:

1. 检查 PostgreSQL 认证配置

查看 pg_hba.conf

# 找到配置文件位置
psql -U postgres -c "SHOW hba_file;"

# 常见路径:
# /etc/postgresql/*/main/pg_hba.conf
# /var/lib/pgsql/data/pg_hba.conf

修改认证方式(示例)

# pg_hba.conf - 允许密码认证
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.1.0/24          md5

# IPv6 local connections:
host    all             all             ::1/128                 md5

# 或者使用 scram-sha-256(更安全)
host    all             all             0.0.0.0/0               scram-sha-256

重启 PostgreSQL 使配置生效

sudo systemctl reload postgresql
# 或
pg_ctl reload -D /path/to/data/directory

2. OpenResty + pgmoon 正确配置

nginx.conf 中的数据库配置示例

http {
    lua_package_path "/path/to/pgmoon/?.lua;;";
    
    upstream database {
        postgres_server 127.0.0.1 dbname=mydb user=myuser password=mypassword;
    }
    
    server {
        location /query {
            content_by_lua_block {
                local pgmoon = require("pgmoon")
                local pg = pgmoon.new({
                    host = "127.0.0.1",
                    port = "5432",
                    database = "mydb",
                    user = "myuser",
                    password = "mypassword"
                })
                
                local ok, err = pg:connect()
                if not ok then
                    ngx.say("Failed to connect: ", err)
                    return
                end
    
                local res, err = pg:query("SELECT * FROM users WHERE id = " .. ngx.var.arg_id)
                if not res then
                    ngx.say("Failed to query: ", err)
                    return
                end
    
                pg:keepalive()
                ngx.say(cjson.encode(res))
            }
        }
    }
}

3. 完整的 Lua 代码示例

connection_pool.lua(推荐使用连接池)

local pgmoon = require("pgmoon")
local cjson = require("cjson")

local _M = {}

function _M.new()
    local db_config = {
        host = os.getenv("PG_HOST") or "127.0.0.1",
        port = os.getenv("PG_PORT") or "5432", 
        database = os.getenv("PG_DATABASE") or "mydb",
        user = os.getenv("PG_USER") or "myuser",
        password = os.getenv("PG_PASSWORD") or "mypassword",
        -- PostgreSQL 14+ 可能需要指定加密方式
        ssl = false,
        ssl_verify = false,
        pool_size = 20,
        backlog = 10,
        timeout = 5000, -- 5秒超时
        
        -- PostgreSQL不同版本的认证方法适配  
        auth_type = 'md5' -- 'md5', 'scram-sha-256', 'trust'
    }
    
    return pgmoon.new(db_config)
end

function _M.query(sql, params)
    local pg = _M.new()
    
    local ok, err = pg:connect()
    if not ok then
        return nil, "Connection failed: " .. tostring(err)
    end
    
    -- PostgreSQL版本检测和兼容性处理  
    if params and #params >   then  
       sql=string.gsub(sql,"?","$%d") --参数化查询转换,如果支持的话。  
       for i,v in ipairs(params) do   
           params[i]=tostring(v):gsub("'","''")--简单转义,实际应用建议用占位符库如luasql-postgres等。  
       end   
       sql=string.format(sql,unpack(params))   
   end   
    
   local res,err=pg:query(sql)   
   if not res then   
      pg:close()   
      return nil,"Query failed:"..tostring(err)   
   end   

   --保持连接用于后续请求(连接池)  
   pg:keepalive()  

   return res  
end  

return _M  

##4.环境变量配置

创建.env文件:

PG_HOST=localhost  
PG_PORT=5432  
PG_DATABASE=mydatabase  
PG_USER=myuser  
PG_PASSWORD=mypassword123!  

在Nginx配置中加载:

init_by_lua_block {  
   require"resty.core"  

   --从环境变量读取数据库配置,避免硬编码密码到代码中。     
} 
location/api/{      
     access_by_lua_file conf/db_auth.lua;--专门处理数据库认证逻辑的文件。        
} 

##5.常见错误及解决

错误信息 原因 解决方案
password authentication failed for user 密码错误或用户不存在 检查用户名密码,确认PostgreSQL中用户存在
no pg_hba.conf entry for host IP不在白名单中 pg_hba.conf中添加对应IP段的记录
connection refused PostgreSQL未启动或端口错误 检查服务状态和端口配置
FATAL: Peer authentication failed for user 使用了peer认证 改为md5或password认证

##6.调试步骤

###测试连接:

psql-hlocalhost-Umyuser-dmydatabase-W#手动测试连接,输入密码确认可连通性。     
\q退出psql shell后继续排查OpenResty端问题。     

###查看详细日志:
在nginx.conf中添加调试日志:

location/test-db{          
     content_by_lua_block{           
         local pg=require"pgmoon".new({...})           
         ngx.log(ngx.DEBUG,"Connecting to:",cjson.encode(pg.config))           
         ...           
     }          
}         

通过以上步骤应该能解决你的pgmoon认证问题!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=8525

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?