Dan Langille:将 pg_hba.conf 和 postgresql.conf 的本地设置移出 PGDATA
内容提要
作者借鉴FreeBSD配置思路,将PostgreSQL的pg_hba.conf和postgresql.conf移出PGDATA,改用include_dir引入外部目录,便于用Ansible等工具管理,升级时无需重新解析原文件。文中展示了postgresql.local.conf中的监听地址、SSL证书、内存及日志设置,以及pg_hba.local.conf中按主机和用户配置的访问规则。
延伸解读
借鉴 FreeBSD 的配置覆盖思路
作者将 FreeBSD 中默认配置与用户覆盖分离的做法引入 PostgreSQL。在 FreeBSD 里,/etc/defaults/rc.conf 提供默认值,用户可在 /etc/rc.conf 中覆盖。类似地,作者在 postgresql.conf 和 pg_hba.conf 末尾使用 include_dir 引入外部目录,把本地定制设置集中存放,避免直接修改 PGDATA 内的原始配置文件。
便于自动化管理与升级
将本地设置移出 PGDATA 后,可以用 Ansible 等工具直接投放一个包含所有偏好值的文件,而无需解析现有配置文件。这样在 PostgreSQL 发布新版本时,也不必因为原文件有细微变化而重新调整或刷新副本,降低了升级时的维护成本。
实际配置示例与注意事项
文中展示了 postgresql.local.conf 中的监听地址、SSL 证书路径、内存参数和日志设置,以及 pg_hba.local.conf 中按主机和用户配置的访问规则。需要注意的是,部分 SSL 相关参数修改后需要重启数据库才能生效,且配置文件权限应妥善设置,避免未授权访问。
Q&A
如何将PostgreSQL的pg_hba.conf和postgresql.conf移出PGDATA目录?
在postgresql.conf末尾添加include_dir '/usr/local/etc/postgresql.conf.d',在pg_hba.conf末尾添加include_dir '/usr/local/etc/postgresql.pg_hba.d',然后将自定义配置放在这些目录下的文件中,如postgresql.local.conf和pg_hba.local.conf。
为什么要把PostgreSQL配置文件移出PGDATA?
借鉴FreeBSD的默认值与用户覆盖分离的思路,便于用Ansible等自动化工具管理配置,只需放置一个包含所有偏好值的文件,无需解析现有文件,升级时也无需重新解析原文件。
postgresql.local.conf中可以配置哪些参数?
可以配置监听地址(listen_addresses)、SSL相关设置(ssl、ssl_cert_file、ssl_key_file、ssl_ca_file)、内存参数(work_mem、maintenance_work_mem)、WAL大小(max_wal_size、min_wal_size)、检查点目标(checkpoint_completion_target)、日志设置(client_min_messages、log_min_messages、log_min_error_statement、log_checkpoints、log_connections、log_disconnections、log_duration、log_lock_waits、log_statement、log_timezone)以及时区(timezone)等。
pg_hba.local.conf中如何配置访问规则?
可以按主机和用户配置规则,例如:hostssl freshports.org www 127.163.0.80/32 md5,表示允许来自127.163.0.80的主机使用www用户通过SSL连接freshports.org数据库,认证方式为md5。还支持local规则,如local postgres snmpd md5。
使用include_dir方式管理PostgreSQL配置有什么好处?
便于用自动化工具(如Ansible)管理,只需放置一个文件而无需解析现有文件;升级PostgreSQL时无需重新解析原配置文件,因为自定义设置独立于默认配置。
如何用Ansible管理PostgreSQL的pg_hba.conf和postgresql.conf?
通过将自定义配置放在include_dir指定的目录中,Ansible只需管理这些目录下的文件(如postgresql.local.conf和pg_hba.local.conf),无需修改或解析PGDATA中的原始配置文件。