You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置PgBouncer实现同一数据库的peer与host认证?

问题根源

你当前的[databases]配置里重复使用*通配符,PgBouncer会只保留最后一条匹配规则(也就是host=/tmp port=5432),导致所有客户端连接PgBouncer时,都会通过unix socket连接后端PostgreSQL,触发peer认证。这就导致外部TCP客户端因为操作系统用户和后端数据库用户不匹配,出现认证失败的情况。

解决方案

下面提供两种可行的配置方案,按需选择:

方案一:数据库别名 + HBA规则区分连接方式

这种方案不需要启动多个PgBouncer进程,通过别名和HBA规则限制不同连接方式对应不同的后端连接逻辑:

  1. 修改pgbouncer.ini的[databases]段:
[databases]
# 本地socket连接专用别名,后端使用unix socket(触发peer认证)
local_db = host=/tmp port=5432 dbname=%n
# TCP连接专用别名,后端使用TCP(触发host认证)
remote_db = host=localhost port=5432 dbname=%n

%n表示客户端请求的真实数据库名称,确保别名能映射到后端对应的数据库。

  1. 配置pgbouncer_hba.conf,限制连接方式与别名的绑定:
# 允许本地unix socket连接到local_db,使用peer认证
local   local_db      all                     peer
# 允许外部所有IP通过TCP连接到remote_db,使用scram-sha-256认证(可替换为你需要的host认证方式)
host    remote_db     all         0.0.0.0/0   scram-sha-256
# 可选:允许本地TCP连接到remote_db
host    remote_db     all         127.0.0.1/32 scram-sha-256
  1. 重启PgBouncer使配置生效:
pgbouncer -d -R /path/to/pgbouncer.ini
  1. 客户端连接配置:
  • pgwatch2通过unix socket连接local_db,例如:psql -h /tmp -p 6432 -d local_db -U pgwatch2
  • 外部客户端通过TCP连接remote_db,例如:psql -h your-server-ip -p 6432 -d remote_db -U external-user

方案二:启动两个独立的PgBouncer进程(分离监听端点)

如果希望客户端无需区分数据库别名,可启动两个PgBouncer进程,分别处理unix socket和TCP连接:

  1. 创建两个配置文件:
  • pgbouncer_socket.ini(处理本地socket连接):
[pgbouncer]
listen_addr = unix
unix_socket_dir = /tmp
listen_port = 6432
auth_type = peer
auth_file = /path/to/userlist.txt
logfile = /var/log/pgbouncer_socket.log
pidfile = /var/run/pgbouncer_socket.pid

[databases]
* = host=/tmp port=5432
  • pgbouncer_tcp.ini(处理TCP连接):
[pgbouncer]
listen_addr = *
listen_port = 6433
auth_type = scram-sha-256
auth_file = /path/to/userlist.txt
logfile = /var/log/pgbouncer_tcp.log
pidfile = /var/run/pgbouncer_tcp.pid

[databases]
* = host=localhost port=5432
  1. 分别启动两个PgBouncer进程:
# 启动处理socket连接的实例
pgbouncer -d /path/to/pgbouncer_socket.ini
# 启动处理TCP连接的实例
pgbouncer -d /path/to/pgbouncer_tcp.ini
  1. 客户端连接配置:
  • pgwatch2通过unix socket连接6432端口:psql -h /tmp -p 6432 -d postgres -U pgwatch2
  • 外部客户端通过TCP连接6433端口:psql -h your-server-ip -p 6433 -d postgres -U external-user

内容的提问来源于stack exchange,提问作者student10101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:30:34