如何解决Django容器连接Azure PostgreSQL的pg_hba.conf错误?
核心问题分析
你遇到的两个错误指向两个关键问题:
FATAL: password authentication failed for user "welzijn":用户密码认证失败,可能是密码错误、用户权限不足或认证方式不匹配FATAL: no pg_hba.conf entry for host ..., no encryption:Azure PostgreSQL未允许当前主机的无加密连接,或Django连接配置未适配SSL设置
注意:Azure托管的PostgreSQL不允许直接修改pg_hba.conf和postgresql.conf,你在本地机器修改这些文件完全无效——数据库实例运行在Azure云端,所有连接控制需通过Azure门户配置。
分步解决方法
1. 修正Azure PostgreSQL云端安全配置
防火墙规则检查:
登录Azure门户,进入你的PostgreSQL实例,找到「连接安全性」→「防火墙规则」,添加Docker容器所在主机的公网IP(临时可添加0.0.0.0/0测试,生产环境务必删除),确保Azure允许该IP访问数据库。SSL设置适配:
即便关闭了require_secure_transport,也需要让Django明确禁用SSL连接。在Django的数据库配置OPTIONS中添加对应参数:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': os.environ.get('DB_HOST'), 'PORT': os.environ.get('DB_PORT'), 'OPTIONS': { 'sslmode': 'disable' } } }用户认证方式确认:
Azure PostgreSQL默认使用scram-sha-256认证,确保welzijn用户的密码是该方式加密的。可在Azure门户重置密码,重置时会自动套用正确加密规则。
2. 核对本地配置准确性
.env变量检查:
确保.env.prod中的DB_USER、DB_PASSWORD、DB_HOST、DB_NAME完全正确:- 密码含特殊字符(如
@、!)时,用单引号包裹避免shell解析错误 DB_HOST必须是Azure PostgreSQL实例的完整FQDN(格式:<instance-name>.postgres.database.azure.com)
- 密码含特殊字符(如
Docker Compose变量传递检查:
确认docker-compose-deploy.yml正确加载.env.prod并注入Django容器:services: web: env_file: - .env.prod # 其他配置...
3. 直接测试数据库连接(排除Django问题)
进入Django容器,用psql直接测试连接,确认数据库本身可访问:
docker exec -it <你的Django容器名称> psql -h <DB_HOST> -U welzijn -d <DB_NAME>
连接失败则是数据库端问题;连接成功再排查Django配置错误。
4. 重置用户密码(解决认证失败)
若上述步骤无效,直接在Azure门户重置welzijn用户密码:
- 进入PostgreSQL实例→「服务器管理员」→「重置密码」
- 设置符合要求的新密码
- 等待1-2分钟生效后,重新测试Django连接
内容的提问来源于stack exchange,提问作者mightycode Newton

