Docker部署PostgreSQL 13外部连接报no encryption错误排查
你遇到的no pg_hba.conf entry伴随no encryption报错,按以下优先级排查即可:
第一步:确认你修改的是PG实际加载的配置文件
很多人改了镜像内无关路径的示例配置做无用功,进入容器执行以下两条命令,拿到真实生效的配置路径:psql -U postgres -c "SHOW config_file;" psql -U postgres -c "SHOW hba_file;"确认你修改的
postgresql.conf和pg_hba.conf就是上述命令返回的路径下的文件。修改完成后必须执行psql -U postgres -c "SELECT pg_reload_conf();"重载配置,或者直接重启容器,否则配置不会生效。第二步:针对
no encryption报错补全非SSL连接规则
PostgreSQL 13开始对连接加密校验逻辑调整,普通host规则默认优先匹配SSL连接,未配置SSL的非加密连接会被直接拒绝。在pg_hba.conf所有规则的最顶部添加如下规则:hostnossl all all 0.0.0.0/0 md5重载配置后再尝试连接,这是该类报错最高频的诱因。如果测试环境不需要SSL加密,保留该规则即可;生产环境建议后续配置SSL证书,替换为SSL连接规则。
第三步:确认端口映射没被宿主机服务占用
在宿主机执行以下命令,查看5432端口的实际监听进程:ss -tulpn | grep 5432如果返回的进程不是docker-proxy,说明宿主机本地安装的PostgreSQL服务占用了5432端口,你之前的连接实际打到了宿主机本地的PG实例上,和容器内的配置无关,要么停掉宿主机的PG服务,要么把容器端口映射改成其他端口比如
-p 15432:5432再试。第四步:检查pg_hba.conf的规则匹配顺序
pg_hba.conf的规则是从上到下逐行匹配,命中第一条规则就停止校验,你添加的允许规则必须放在所有拒绝规则之前。执行以下命令查看容器内所有生效的非注释规则:cat /var/lib/postgresql/data/pg_hba.conf | grep -v "^#" | grep -v "^$"确认你添加的允许规则排在列表靠前位置,没有被前面的拒绝规则提前拦截。
低概率场景排查
- 执行
psql -U postgres -c "\du"确认你要登录的admin用户确实存在,且拥有登录权限 - 检查宿主机防火墙、云服务器安全组是否放开5432端口入站规则(如果是网络拦截会报连接超时,不会返回PG层面的pg_hba报错,优先级靠后)
- 启动容器时不要额外修改
PGDATA环境变量到自定义路径,避免出现配置文件加载混乱
- 执行
内容的提问来源于stack exchange,提问作者David

