奋斗
努力

在轻量服务器上如何自行部署PostgreSQL数据库?

云计算

在轻量服务器(如阿里云 ECS、腾讯云 CVM、AWS EC2 等)上自行部署 PostgreSQL,通常意味着你需要从源码编译安装或使用包管理器安装,而不是直接使用云厂商提供的托管数据库服务。

以下是针对主流 Linux 发行版(以 Ubuntu/Debian 和 CentOS/RHEL 为例)的完整部署指南,包含安全配置和优化建议。


📌 前置准备

  1. 登录服务器:通过 SSH 连接到你的轻量服务器。
  2. 更新系统:

    # Ubuntu/Debian
    sudo apt update && sudo apt upgrade -y
    
    # CentOS/RHEL
    sudo yum update -y
  3. 确认权限:确保你拥有 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

🚀 性能优化建议(轻量服务器适用)

  1. 调整共享内存缓冲区
    编辑 postgresql.conf:

    shared_buffers = 256MB        # 通常为 RAM 的 25%~50%
    effective_cache_size = 1GB    # 通常为 RAM 的 75%
    work_mem = 16MB               # 每个查询排序/哈希使用的内存
    maintenance_work_mem = 128MB  # VACUUM、CREATE INDEX 使用的内存
  2. 启用 WAL 压缩:

    wal_compression = on
  3. 定期维护:

    # 自动 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 部署、主从复制、监控告警),可以告诉我,我可以提供相应方案。

未经允许不得转载:云服务器 » 在轻量服务器上如何自行部署PostgreSQL数据库?