如何在腾讯云上启用 PostgreSQL 数据库远程访问?

我在腾讯云服务器上跑了一个爬虫,定期监测某个网站的文章更新,使用的数据库是 PostgreSQL(具体是 9.3 版)。我最近想在本地端直接连接到服务器上运行的那个数据库进行查询,但是 PostgreSQL 在安装时并没有默认开启允许远程访问,必须要进行额外的配置。

本文介绍的就是如何开启 PostgreSQL 数据库远程访问的具体步骤和方法。本文所列操作,也适合希望使用云服务器自建数据库的同学。

第一步:登陆数据库所在服务器

由于以下大部分操作都需要在数据库所在的服务器上完成,因此请先确保能够通过 SSH 客户端登陆到服务器,并切换到 postgres 用户下。

代码语言:txt
复制
ssh db_server
sudo su -u postgres # Ubuntu 下默认创建 postgres 用户时可能没有设置密码,需要通过能够执行 sudo 命令的用户切换

第二步:启用客户端验证

PostgreSQL 的客户端验证由一个名为 pg_hba.conf 的配置文件控制,hba 的意思是「基于主机的验证」(host-based authentication)。按照官方文档的解释,该文件一般位于数据库目录中的 data 子目录下。

不过在我的线上环境中,这个文件位于 /etc/postgresql/9.3/main 下。

pg_hba.conf 文件的格式是一组记录,每条记录一行。记录的格式如下:

代码语言:txt
复制
host       database  user  address  auth-method  [auth-options]

可选的形式共有 7 种,上面只列了本文将用到记录格式,其余内容详见官方文档。

  • host:表示匹配使用 TCP/IP 进行的连接
  • database:指定该条记录匹配的数据库,可设置为 all
  • user:指定该条记录匹配的数据库用户,可设置为 all
  • auth-method:表示连接时进行验证的方式,常见的选项有:
    • trust:无条件允许连接,意味着任何人都能够访问
    • md5:要求客户端提供 md5 加密过的密码
    • password:要求客户端提供未经加密的密码

由于我们的目的是希望能够从任意公网 IP 访问数据库,不限制用户和数据库,并且确保密码不会轻易泄露,因此输入以下记录:

代码语言:txt
复制
cd /etc/postgresql/9.3/main
vim pg_hba.conf # 在文件的最后加上以下记录
host all all 0.0.0.0/0 md5

所以,最后在实际连接时,切记对用户密码进行 md5 加密。

第三步:启用 TCP/IP 连接

接下来,我们还要开启 PostgreSQL 允许通过 TCP/IP 进行连接的特性。这主要通过 postgresql.conf 配置文件控制,该文件和 pg_hba.conf 处于同一目录下。

代码语言:txt
复制
vim postgresql.conf

然后,将配置中的监听 IP 地址设置为 *,表示要监听来自所有 IP 的连接请求。

代码语言:txt
复制
listen_addresses = '*'

第四步:重启 PostgreSQL

完成以上两个核心步骤之后,我们基本的配置工作就完成了。接下来重启数据库服务。

代码语言:txt
复制
service postgresql restart

第五步:安全组设置

最后,由于我们使用的是腾讯云服务器,会通过安全组设置来控制对外开放的端口。我们要确保数据库所使用的 5432 端口是打开的。

打开安全组的控制台页面。选择目前服务器正在使用的安全组,然后进行编辑。

安全组配置主要包括入站规则和出站规则的配置,示意图如下:

[1496389721887_5106_1496389722094.png]

结语

至此,我们就完成了所有配置工作。以后,就可以在本地通过命令行或者 SQL 工具直接连接到远程数据库,查询最新的数据情况了。不过根据数据量的大小和带宽限制,查询的时间可能会比较长。