−25%

Windows 按年付费,截至 10 月 31 日。 查看套餐

EQVPS

如何在 VPS 上安装 PostgreSQL 并安全连接

在 Ubuntu 上安装 PostgreSQL 16,创建数据库和用户,并在不把 5432 端口暴露到互联网的情况下远程连接:通过 SSH 隧道或白名单。

安装 PostgreSQL 只需一条命令。大家容易出错的是远程访问:把 5432 端口向全世界开放,设个密码,然后纳闷日志里为什么全是登录尝试。本指南在 Ubuntu 24.04 上安装 Postgres、创建数据库,并演示两种从外部安全连接的方法。

1. 安装

apt update && apt install -y postgresql
systemctl status postgresql --no-pager

在 Ubuntu 24.04 上装的是 PostgreSQL 16。它默认只监听 localhost;没有特别理由的话就保持这样。

2. 创建用户和数据库

sudo -u postgres psql <<'SQL'
CREATE USER app WITH PASSWORD 'use-a-long-random-password';
CREATE DATABASE appdb OWNER app;
SQL

同一台服务器上的应用使用 postgresql://app:PASSWORD@localhost:5432/appdb 连接。

3. 从你的笔记本连接:SSH 隧道(推荐)

无需开放任何端口,也无需在服务器上做任何配置。隧道会通过 SSH 转发一个本地端口:

ssh -N -L 5433:localhost:5432 root@203.0.113.10

在 NAT 套餐上,加上面板里显示的专属 SSH 端口:

ssh -N -p 20123 -L 5433:localhost:5432 root@your-nat-host

隧道开着的时候,把数据库客户端指向 localhost:5433。SSH 会加密所有流量,5432 端口对互联网依然关闭。DBeaver 和 pgAdmin 等图形工具都有一个做同样事情的 “SSH 隧道” 选项卡。

4. 让另一台服务器直连(白名单)

如果别处的某台应用服务器必须直接连接,就只放行它的 IP。此时数据库服务器必须使用带独立 IP 的套餐,因为 NAT 套餐除了 SSH 外不接受入站连接。

在 /etc/postgresql/16/main/postgresql.conf 中:

listen_addresses = '*'

在 /etc/postgresql/16/main/pg_hba.conf 末尾:

hostssl  appdb  app  198.51.100.20/32  scram-sha-256

只为这一个地址打开防火墙,然后重启:

ufw allow from 198.51.100.20 to any port 5432 proto tcp
systemctl restart postgresql

hostssl 强制使用加密连接;Ubuntu 的软件包自带自签名证书,所以客户端应使用 sslmode=require 连接。

5. 合理的初始设置

对于 2 GB 内存的服务器,在 postgresql.conf 中:

shared_buffers = 512MB
effective_cache_size = 1536MB
work_mem = 8MB

修改后重启。这对大多数小应用来说已经足够;等看到真实查询后再细调。

6. 备份

每晚导出一次,保留一周:

mkdir -p /var/backups/pg && chown postgres /var/backups/pg
cat > /etc/cron.d/pg-backup <<'EOF'
30 3 * * * postgres pg_dump -Fc appdb > /var/backups/pg/appdb-$(date +\%u).dump
EOF

-Fc 生成一个压缩的导出文件,用 pg_restore 恢复。也把这些导出文件复制到服务器之外;Managed Backups 还会为整台机器增加每日还原点。

相关

常见问题

要把 5432 端口开放到互联网吗?

最好不要。暴露在外的数据库端口会持续遭到扫描和暴力破解。请通过 SSH 隧道连接;如果某台应用服务器必须直连,就在 pg_hba.conf 和防火墙中都只放行它的 IP。

NAT 套餐能用 PostgreSQL 吗?

可以。同一台服务器上的应用在本地连接,你则通过专属 SSH 端口上的 SSH 隧道,从笔记本访问数据库。NAT 套餐做不到的是接受来自另一台服务器、直接连到 5432 的入站连接。

PostgreSQL 需要多少内存?

它用几百 MB 就能运行,给它多少就会拿多少当缓存。常见的起点是把 shared_buffers 设为内存的 25% 左右。对小应用的数据库来说,服务器有 2 GB 内存就很宽裕了。

怎么备份数据库?

使用自定义格式的 pg_dump('pg_dump -Fc'),并通过 cron 定时运行。也要在服务器之外保存副本。Managed Backups 还会为整台服务器增加每日还原点。

我会装上哪个版本的 PostgreSQL?

Ubuntu 24.04 自带 PostgreSQL 16,Debian 12 自带 15。想要更新的大版本,就添加 PostgreSQL 官方 apt 源(apt.postgresql.org)。

评论

暂无评论。来做第一个吧。

发表评论

评论在显示前会经过审核。