PgBouncer跨主机连接报错:Peer认证失败问题求助
问题排查与解决
你遇到的跨主机连接失败,核心原因是PgBouncer与PostgreSQL之间的连接触发了Peer认证,但未通过。本地连接正常是因为此时PgBouncer连接PostgreSQL的方式/用户刚好符合现有规则,而远程连接时不满足。
具体原因分析
- 本地连接时,PgBouncer通过Unix socket连接PostgreSQL,匹配你配置的
local all all trust规则,直接信任通过。 - 远程客户端连接时,PgBouncer连接PostgreSQL的请求大概率匹配了pg_hba.conf中优先级更高的
peer认证规则(比如默认的local all all peer),而PgBouncer运行的操作系统用户与数据库用户someuser不一致,导致Peer认证失败。
解决步骤
1. 调整pg_hba.conf规则顺序
确保local all all trust规则放在所有local类型规则的最前面,让PostgreSQL优先采用信任认证:
# 把这条规则放在pg_hba.conf的最顶部 local all all trust # 其他原有规则放在后面,比如: # local all postgres peer # local all all peer # host all all 127.0.0.1/32 scram-sha-256
2. 强制PgBouncer使用Unix socket连接PostgreSQL
修改pgbouncer.ini的databases段,明确指定Unix socket目录,确保连接走local规则:
[databases] someuser = dbname=someuser host=/var/run/postgresql auth_user=someuser
(/var/run/postgresql是你的unix_socket_dir,和pgbouncer.ini中配置一致)
3. 重新加载配置
- 重新加载PostgreSQL配置:
或用系统服务命令:pg_ctl reload -D /path/to/postgresql/datasystemctl reload postgresql - 重启PgBouncer生效:
或:pgbouncer -d /path/to/pgbouncer.inisystemctl restart pgbouncer
4. 验证连接
从远程主机测试连接:
psql -h <pgbouncer_host> -p 6432 -U someuser someuser
如果成功连接,说明问题解决。
内容的提问来源于stack exchange,提问作者Masson
相关产品推荐
相关产品推荐

