ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu 22.04 安装配置PostgreSQL 16:从仓库配置到生产级安全部署

Ubuntu 22.04 安装配置PostgreSQL 16:从仓库配置到生产级安全部署 1. 项目概述为什么要在Ubuntu上安装PostgreSQL 16最近在规划一个数据密集型应用的后端数据库选型上PostgreSQL 16简称pgsql16的几个新特性让我眼前一亮。比如逻辑复制的并行应用大幅提升了数据同步效率还有pg_stat_io视图能更细致地监控I/O负载这对性能调优太关键了。虽然Ubuntu的官方仓库更新很快但为了第一时间用上这些新特性直接从PostgreSQL官方仓库安装最新稳定版成了我的首选方案。这篇文章就是记录我在Ubuntu 22.04 LTS系统上从零开始安装、配置PostgreSQL 16的全过程。目标很明确不只是把数据库服务跑起来而是要搭建一个安全、性能基线良好、便于后续维护的生产级预备环境。无论你是刚接触PostgreSQL的开发者还是需要升级现有数据库的运维这篇手把手的实操指南应该都能帮你避开我当初踩过的一些坑。整个过程会涵盖仓库配置、安装、初始化、基础安全设置、远程连接配置以及简单的性能检查。2. 安装前的系统准备与规划在动手敲命令之前花几分钟做好规划和检查能让后续过程顺畅很多。盲目安装往往会导致权限混乱、配置冲突甚至需要推倒重来。2.1 系统环境确认与用户规划首先确认你的Ubuntu版本。虽然PostgreSQL 16支持多个版本但为了获得最佳兼容性和长期支持建议使用Ubuntu 20.04 LTS或22.04 LTS。打开终端输入以下命令查看lsb_release -a输出会显示类似Ubuntu 22.04.3 LTS的信息。接下来是用户规划。默认情况下安装PostgreSQL会创建一个名为postgres的系统用户用于运行数据库服务。这是一个安全最佳实践意味着数据库进程将以一个非root的专用用户身份运行。注意强烈建议不要使用root用户直接操作PostgreSQL。所有管理操作都应通过postgres用户或具有相应权限的数据库角色进行。此外考虑一下你的数据存储位置。默认的数据目录是/var/lib/postgresql/16/main。如果你的系统有单独的、更大容量的数据盘比如挂载在/data最好在初始化之前就规划好避免后期迁移数据的麻烦。检查磁盘空间df -h /var # 查看默认分区空间 # 或者如果你有自定义分区 df -h /data确保目标分区有足够的空间建议至少预留10GB以上用于初始数据和未来的增长。2.2 配置PostgreSQL官方APT仓库Ubuntu自带的仓库可能不是最新的PostgreSQL 16。为了确保获取官方维护的最新版本和安全更新我们需要添加PostgreSQL全球开发组PGDG维护的官方APT仓库。安装必要的依赖包这些工具用于管理仓库和密钥。sudo apt update sudo apt install -y wget curl gnupg software-properties-common导入仓库签名密钥这一步至关重要它确保了从该仓库下载的软件包未被篡改。sudo mkdir -p /etc/apt/keyrings curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg这个命令创建了密钥目录并从PostgreSQL官网下载了公钥将其转换为APT可识别的格式。添加仓库源文件接下来为APT创建一个源列表文件。echo deb [signed-by/etc/apt/keyrings/postgresql.gpg] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main | sudo tee /etc/apt/sources.list.d/pgdg.list这个命令会自动填充你的Ubuntu版本代号如jammy并指定仓库地址。更新本地软件包索引让系统识别新添加的仓库。sudo apt update执行后你应该能在更新信息中看到来自https://apt.postgresql.org的索引。实操心得有时候网络原因可能导致添加仓库或更新失败。如果apt update时连接apt.postgresql.org超时可以多试几次或者检查系统的DNS设置和网络连通性。也可以暂时使用速度更快的镜像源但务必确保是官方认可的镜像以保证安全性。3. 安装与初始化PostgreSQL 16仓库配置好后安装过程本身反而非常简单。但初始化步骤中的选择会直接影响数据库的初始状态。3.1 执行安装与基础服务管理使用以下命令安装PostgreSQL 16的服务器包和常用的客户端工具sudo apt install -y postgresql-16 postgresql-client-16postgresql-16包含数据库服务器核心程序、默认配置和基础工具。postgresql-client-16包含psql等客户端连接工具方便在本机管理数据库。安装完成后系统会自动创建postgres用户和用户组并启动postgresql服务它实际管理着所有已安装版本的PostgreSQL服务。检查服务状态sudo systemctl status postgresql你应该看到服务是active (exited)或active (running)。PostgreSQL使用一种叫做“簇”cluster的概念在这里可以理解为一个独立的数据库服务实例它包含一组使用同一端口监听、共享配置和运行环境的数据库。默认安装后已经初始化了一个名为main的簇。你可以查看所有簇的状态sudo pg_lsclusters输出会显示版本16、簇名main、端口号通常是5432、状态online/down、数据目录和日志文件路径。3.2 理解并验证初始化结果安装程序已经帮你完成了初始化但了解初始化做了什么很重要。初始化数据库簇主要完成了创建了数据目录/var/lib/postgresql/16/main及其下的所有子目录和文件。创建了默认的数据库编码通常是UTF8和本地化设置。创建了默认的template0和template1数据库模板。创建了初始的数据库超级用户角色这个角色与系统用户postgres同名。现在我们来验证安装。切换到postgres用户并连接至其命令行客户端psqlsudo -u postgres psql这会进入psql的交互界面提示符变为postgres#。执行几个简单命令验证-- 显示当前连接的数据库和版本 SELECT current_database(), version(); -- 列出所有数据库 \l -- 退出psql \q如果这些命令都能正常执行并返回信息说明数据库服务安装和初始化成功。注意事项在psql中以--开头的行是SQL注释。SQL命令以分号;结束。\开头的命令是psql特有的元命令如\l列出数据库\q退出。4. 基础安全与访问控制配置一个刚安装好的PostgreSQL默认只允许本地连接且认证方式可能不适合生产环境。接下来我们进行最基本的安全加固。4.1 修改默认超级用户密码默认的postgres数据库用户没有密码仅通过本地操作系统认证。这在本机管理时没问题但为了安全尤其是后续可能启用密码认证时必须设置一个强密码。sudo -u postgres psql -c ALTER USER postgres WITH PASSWORD YourStrongPassword123!;将YourStrongPassword123!替换为你自己的、复杂的密码。请务必记录并妥善保管此密码。重要提示在生产环境中密码应该通过密码管理器生成和保存并且避免在命令行历史中留下明文密码痕迹。上面这种直接在命令中写密码的方式虽然方便演示但存在安全风险。更安全的方式是使用psql交互模式或者使用PGPASSWORD环境变量但也要注意其作用域。4.2 配置客户端认证pg_hba.confPostgreSQL使用pg_hba.confHost-Based Authentication文件来控制哪些主机、哪些用户、通过哪种方式可以连接哪些数据库。这是访问控制的核心。找到配置文件对于通过包安装的PostgreSQL 16主配置文件通常在/etc/postgresql/16/main/postgresql.conf而pg_hba.conf在同一个目录下。sudo nano /etc/postgresql/16/main/pg_hba.conf理解默认配置文件末尾通常已有一些规则。默认规则可能类似# TYPE DATABASE USER ADDRESS METHOD local all all peer host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256local: 指本地Unix域套接字连接。peer表示使用操作系统用户名进行认证。host: 指TCP/IP连接。127.0.0.1/32和::1/128分别代表IPv4和IPv6的本机地址。scram-sha-256是当前推荐的加密密码认证方式。添加远程访问规则谨慎操作如果你需要从其他服务器连接需要添加规则。强烈建议将ADDRESS范围限制在最小的必要网络内例如只允许特定IP或内网网段。# 允许来自内网 192.168.1.0/24 网段的所有IP使用密码加密连接所有数据库 host all all 192.168.1.0/24 scram-sha-256绝对不要为了方便而添加host all all 0.0.0.0/0 trust这样的规则允许任何IP无需密码连接这是极其危险的。保存并生效修改后需要重新加载PostgreSQL配置使其生效无需重启服务不影响现有连接sudo systemctl reload postgresql4.3 配置监听地址与端口postgresql.conf默认情况下PostgreSQL只监听本地回环地址localhost。要接受远程连接还需要修改主配置文件。打开主配置文件sudo nano /etc/postgresql/16/main/postgresql.conf找到listen_addresses参数。默认可能是listen_addresses localhost # what IP address(es) to listen on;将其修改为*监听所有IP地址仅建议在受信任的内网环境或配合严格防火墙规则使用。localhost, 192.168.1.100监听本地和指定IP。 例如改为监听所有地址后续用防火墙控制listen_addresses *同时确认port参数是5432默认值或者根据你的需要修改。保存文件并重启PostgreSQL服务使监听地址生效sudo systemctl restart postgresql踩坑记录我遇到过修改了pg_hba.conf但忘记改listen_addresses导致始终无法远程连接。也遇到过相反的情况。所以配置远程访问时这两步必须都检查。重启后务必用sudo ss -tlnp | grep 5432命令检查PostgreSQL是否正在预期的IP和端口上监听。5. 防火墙配置与远程连接测试在服务配置好后系统的防火墙是保护它的最后一道屏障。Ubuntu 22.04默认使用ufw作为防火墙管理工具。5.1 配置UFW防火墙规则如果系统启用了UFW你需要开放PostgreSQL的默认端口5432。检查UFW状态sudo ufw status如果状态是inactive防火墙未启用可以跳过此步但生产环境建议启用并精细配置。如果状态是active添加规则允许特定IP访问5432端口是最佳实践。例如只允许IP192.168.1.50访问sudo ufw allow from 192.168.1.50 to any port 5432如果暂时需要开放给整个子网同样仅限内网或测试sudo ufw allow from 192.168.1.0/24 to any port 5432应用规则sudo ufw reload再次检查状态确认规则已添加。5.2 从远程客户端进行连接测试现在可以从网络内的另一台机器进行测试。假设那台机器也安装了psql客户端。psql -h 你的Ubuntu服务器IP -p 5432 -U postgres -d postgres系统会提示你输入之前为postgres用户设置的密码。如果连接成功会进入psql提示符。如果连接失败可以按以下顺序排查服务器端检查sudo systemctl status postgresql服务是否运行sudo ss -tlnp | grep 5432是否在0.0.0.0:5432或指定IP上监听sudo tail -f /var/log/postgresql/postgresql-16-main.log查看日志连接尝试是否有错误信息通常认证失败或规则拒绝会有明确日志网络检查从客户端ping 服务器IP网络是否通从客户端telnet 服务器IP 5432或nc -zv 服务器IP 5432端口是否开放防火墙检查在服务器上sudo ufw status规则是否正确检查云服务商如AWS安全组、阿里云安全组的防火墙规则。6. 基础优化与日常管理入门安装配置完成后进行一些基础优化和了解日常管理命令能让数据库运行得更顺畅。6.1 基础性能参数调优入门级对于刚安装的实例调整postgresql.conf中的几个关键内存相关参数可以带来立竿见影的效果。编辑配置文件sudo nano /etc/postgresql/16/main/postgresql.conf找到并修改以下参数数值需根据你的服务器实际内存调整这里以4GB内存的服务器为例# 共享缓冲区用于缓存数据和索引。通常设置为系统内存的25%。 shared_buffers 1GB # 工作内存用于排序、哈希等操作。如果查询复杂可以设置大一些。 work_mem 16MB # 维护工作内存用于VACUUM、CREATE INDEX等维护操作。 maintenance_work_mem 256MB # 预写式日志缓冲区 wal_buffers 16MB修改后重启服务生效sudo systemctl restart postgresql参数计算心得shared_buffers不是越大越好。超过一定大小通常超过8GB后收益递减且会占用操作系统缓存的空间。对于内存小于1GB的小型实例设置为内存的15%-20%可能更合适。work_mem需要谨慎因为它是对每个操作、每个后端进程分配的。如果有大量并发复杂查询work_mem * 最大连接数可能超过物理内存导致交换swapping性能急剧下降。6.2 常用管理与维护命令掌握这些命令足以应对日常大部分管理任务启动/停止/重启/重载服务sudo systemctl start postgresql # 启动 sudo systemctl stop postgresql # 停止 sudo systemctl restart postgresql # 重启中断连接 sudo systemctl reload postgresql # 重载配置不中断连接 sudo systemctl status postgresql # 查看状态数据库簇管理sudo pg_ctlcluster 16 main start # 启动特定版本和簇 sudo pg_ctlcluster 16 main stop # 停止 sudo pg_ctlcluster 16 main restart # 重启 sudo pg_lsclusters # 列出所有簇通过psql进行基础操作sudo -u postgres psql # 以postgres用户登录在psql中CREATE DATABASE mydb; -- 创建数据库 CREATE USER myuser WITH ENCRYPTED PASSWORD mypass; -- 创建用户 GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser; -- 授权 \c mydb -- 切换到mydb数据库 \dt -- 列出当前数据库的所有表 \du -- 列出所有用户/角色 \? -- 获取psql元命令帮助 \h -- 获取SQL命令帮助备份与恢复基础# 使用pg_dump进行逻辑备份自定义格式压缩 sudo -u postgres pg_dump -Fc mydb mydb_backup.dump # 恢复 sudo -u postgres pg_restore -d mydb mydb_backup.dump # 备份所有数据库全局对象 sudo -u postgres pg_dumpall --globals-only globals.sql6.3 启用基础监控PostgreSQL 16新增的pg_stat_io视图是监控I/O的利器。可以定期查看了解数据库的I/O模式。-- 在psql中查看I/O统计 SELECT * FROM pg_stat_io LIMIT 10;此外启用慢查询日志对性能调优很有帮助。在postgresql.conf中设置logging_collector on log_destination stderr log_directory log log_filename postgresql-%Y-%m-%d_%H%M%S.log log_min_duration_statement 1000 # 记录执行时间超过1000毫秒的语句修改后重载配置即可。日志文件通常位于/var/lib/postgresql/16/main/log/或/var/log/postgresql/。安装和基础配置PostgreSQL 16只是第一步。把它用好在实际项目中还需要结合应用特点设计表结构、建立索引、规划备份策略并持续进行监控和调优。不过有了一个稳固、安全的起点后续的这些工作就有了可靠的基础。如果在配置过程中遇到任何问题多查看/var/log/postgresql/下的日志文件那里通常藏着最直接的答案。
返回列表