在轻量服务器(如阿里云 ECS、腾讯云 CVM、AWS EC2 等)上自行部署 PostgreSQL,通常意味着你需要从源码编译安装或使用包管理器安装,而不是直接使用云厂商提供的托管数据库服务。
以下是针对主流 Linux 发行版(以 Ubuntu/Debian 和 CentOS/RHEL 为例)的完整部署指南,包含安全配置和优化建议。
📌 前置准备
- 登录服务器:通过 SSH 连接到你的轻量服务器。
-
更新系统:
# Ubuntu/Debian sudo apt update && sudo apt upgrade -y # CentOS/RHEL sudo yum update -y - 确认权限:确保你拥有
sudo权限。
✅ 方法一:使用包管理器安装(推荐,简单稳定)
这是最常用、最安全的方式,适合大多数场景。
🔹 Ubuntu / Debian 系统
# 1. 安装 PostgreSQL
sudo apt install postgresql postgresql-contrib -y
# 2. 启动并设置开机自启
sudo systemctl enable postgresql
sudo systemctl start postgresql
# 3. 检查状态
sudo systemctl status postgresql
默认会创建名为 postgres 的系统用户和数据库超级用户。
🔹 CentOS / RHEL / AlmaLinux / Rocky Linux
# 1. 安装 PostgreSQL(默认版本可能较旧,如需最新版请添加官方仓库)
sudo yum install postgresql-server postgresql-contrib -y
# 2. 初始化数据库集群(首次安装需要)
sudo postgresql-setup --initdb
# 3. 启动并设置开机自启
sudo systemctl enable postgresql
sudo systemctl start postgresql
# 4. 检查状态
sudo systemctl status postgresql
💡 注意:CentOS 8+ 已移除
postgresql-server包,建议使用 AppStream 或 EPEL 仓库,或直接下载 RPM 包。更推荐方式见下文“高级选项”。
✅ 方法二:从源码编译安装(最新稳定版 + 自定义优化)
适用于需要特定版本、性能调优或禁用某些模块的场景。
步骤:
# 1. 安装依赖
# Ubuntu/Debian
sudo apt install build-essential libreadline-dev zlib1g-dev libssl-dev libxml2-dev libxslt-dev libpam0g-dev -y
# CentOS/RHEL
sudo yum groupinstall "Development Tools" -y
sudo yum install readline-devel zlib-devel openssl-devel libxml2-devel libxslt-devel pam-devel -y
# 2. 下载 PostgreSQL 源码(以 16.1 为例)
wget https://ftp.postgresql.org/pub/source/v16.1/postgresql-16.1.tar.gz
tar -xzf postgresql-16.1.tar.gz
cd postgresql-16.1
# 3. 配置、编译、安装
./configure --prefix=/usr/local/pgsql --with-openssl --with-libxml --with-libxslt
make
sudo make install
# 4. 创建用户和目录
sudo groupadd postgres
sudo useradd -g postgres -m -d /usr/local/pgsql -s /bin/bash postgres
sudo mkdir -p /usr/local/pgsql/data
sudo chown -R postgres:postgres /usr/local/pgsql
# 5. 初始化数据库
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
# 6. 启动 PostgreSQL
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
# 7. 设置环境变量(可选,方便后续操作)
echo 'export PATH=/usr/local/pgsql/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# 8. 创建 systemd 服务文件(可选,便于管理)
sudo tee /etc/systemd/system/postgresql.service << EOF
[Unit]
Description=PostgreSQL Database Server
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data -l /var/log/postgresql.log
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D /usr/local/pgsql/data
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D /usr/local/pgsql/data
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable postgresql
sudo systemctl start postgresql
🔐 安全配置(关键!)
1. 修改 postgres 用户密码
# 切换到 postgres 用户
su - postgres
# 进入 psql 命令行
psql
# 修改密码(替换为你的强密码)
ALTER USER postgres WITH PASSWORD 'your_strong_password';
# 退出
q
2. 配置远程访问
编辑 postgresql.conf:
# Ubuntu/Debian 默认路径
sudo nano /etc/postgresql/*/main/postgresql.conf
# CentOS 默认路径
sudo nano /var/lib/pgsql/data/postgresql.conf
找到以下行并修改:
listen_addresses = '*' # 允许所有 IP 监听(或指定 IP)
port = 5432 # 默认端口
3. 配置客户端认证(pg_hba.conf)
# Ubuntu/Debian
sudo nano /etc/postgresql/*/main/pg_hba.conf
# CentOS
sudo nano /var/lib/pgsql/data/pg_hba.conf
添加或修改以下行以允许远程连接(示例:允许特定 IP 连接):
# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.1.100/32 md5
host all all 0.0.0.0/0 scram-sha-256 # 谨慎使用!仅当有防火墙保护时
⚠️ 强烈建议:不要开放
0.0.0.0/0,除非你使用防火墙限制来源 IP。
4. 重启 PostgreSQL 使配置生效
sudo systemctl restart postgresql
5. 配置防火墙
UFW(Ubuntu)
sudo ufw allow 5432/tcp
sudo ufw reload
firewalld(CentOS)
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
🧪 测试连接
本地测试
su - postgres
psql -c "SELECT version();"
远程测试(从另一台机器)
psql -h <服务器IP> -U postgres -d postgres -p 5432
输入密码后应能成功连接。
🛠️ 基本运维命令
| 操作 | 命令 |
|---|---|
| 启动服务 | sudo systemctl start postgresql |
| 停止服务 | sudo systemctl stop postgresql |
| 重启服务 | sudo systemctl restart postgresql |
| 查看状态 | sudo systemctl status postgresql |
| 进入数据库 | sudo -u postgres psql |
| 备份数据库 | pg_dump -U postgres -d mydb > backup.sql |
| 恢复数据库 | psql -U postgres -d mydb < backup.sql |
🚀 性能优化建议(轻量服务器适用)
-
调整共享内存缓冲区
编辑postgresql.conf:shared_buffers = 256MB # 通常为 RAM 的 25%~50% effective_cache_size = 1GB # 通常为 RAM 的 75% work_mem = 16MB # 每个查询排序/哈希使用的内存 maintenance_work_mem = 128MB # VACUUM、CREATE INDEX 使用的内存 -
启用 WAL 压缩:
wal_compression = on -
定期维护:
# 自动 vacuum 和 analyze crontab -e # 添加:0 2 * * 0 /usr/bin/vacuumdb -U postgres --all --analyze-only
❗ 常见问题排查
| 问题 | 解决方案 |
|---|---|
| 连接被拒绝 | 检查 listen_addresses、pg_hba.conf、防火墙 |
| 权限错误 | 确保当前用户有数据库访问权限,或检查 pg_hba.conf 认证方法 |
| 内存不足 | 减少 shared_buffers 和 work_mem,或增加 swap |
| 端口冲突 | 检查是否有其他服务占用 5432 端口:netstat -tlnp | grep 5432 |
✅ 总结
- 简单部署 → 使用包管理器(
apt/yum) - 定制需求 → 从源码编译
- 安全第一 → 修改密码、限制访问 IP、配置防火墙
- 持续运维 → 定期备份、监控日志、优化参数
如果你希望进一步自动化(如 Docker 部署、主从复制、监控告警),可以告诉我,我可以提供相应方案。
云服务器