如何配置PgBouncer实现同一数据库的peer与host认证?
问题根源
你当前的[databases]配置里重复使用*通配符,PgBouncer会只保留最后一条匹配规则(也就是host=/tmp port=5432),导致所有客户端连接PgBouncer时,都会通过unix socket连接后端PostgreSQL,触发peer认证。这就导致外部TCP客户端因为操作系统用户和后端数据库用户不匹配,出现认证失败的情况。
解决方案
下面提供两种可行的配置方案,按需选择:
方案一:数据库别名 + HBA规则区分连接方式
这种方案不需要启动多个PgBouncer进程,通过别名和HBA规则限制不同连接方式对应不同的后端连接逻辑:
- 修改
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表示客户端请求的真实数据库名称,确保别名能映射到后端对应的数据库。
- 配置
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
- 重启PgBouncer使配置生效:
pgbouncer -d -R /path/to/pgbouncer.ini
- 客户端连接配置:
- 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连接:
- 创建两个配置文件:
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
- 分别启动两个PgBouncer进程:
# 启动处理socket连接的实例 pgbouncer -d /path/to/pgbouncer_socket.ini # 启动处理TCP连接的实例 pgbouncer -d /path/to/pgbouncer_tcp.ini
- 客户端连接配置:
- 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
相关产品推荐
相关产品推荐

