跳到主要内容
编程备忘录DEV CATALOGNOTE

本地远程宝塔创建的postgresql

1. 问题现象

DataGrip 连接远程 PostgreSQL 失败。

服务器检查端口:

ss -lntp | grep 5432

最初结果:

LISTEN 0 200 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=...,fd=8))
LISTEN 0 200 [::1]:5432 [::]:* users:(("postgres",pid=...,fd=7))

说明 PostgreSQL 只监听本机地址,外部电脑无法通过公网连接。


2. 宝塔 PostgreSQL 的 psql 路径

直接执行:

sudo -u postgres psql

提示:

sudo: psql: command not found

原因是宝塔安装的 PostgreSQL 没有把 psql 加到系统 PATH

实际路径:

/www/server/pgsql/bin/psql

所以执行命令时使用:

sudo -u postgres /www/server/pgsql/bin/psql

3. 查询 PostgreSQL 配置文件位置

查询 postgresql.conf

sudo -u postgres /www/server/pgsql/bin/psql -c "SHOW config_file;"

返回:

/www/server/pgsql/data/postgresql.conf

查询 pg_hba.conf

sudo -u postgres /www/server/pgsql/bin/psql -c "SHOW hba_file;"

返回:

/www/server/pgsql/data/pg_hba.conf

所以当前宝塔 PostgreSQL 的主要配置文件为:

/www/server/pgsql/data/postgresql.conf
/www/server/pgsql/data/pg_hba.conf

4. 修改 PostgreSQL 监听地址

编辑:

vim /www/server/pgsql/data/postgresql.conf

找到:

listen_addresses = 'localhost'

修改为:

listen_addresses = '*'

作用:

localhost

只允许服务器本机访问

*

允许 PostgreSQL 监听所有网卡地址

注意:listen_addresses = '*' 只是让 PostgreSQL 接收外部连接,并不代表所有人都可以登录

实际访问权限还受到 pg_hba.conf、数据库账号密码、服务器防火墙、云安全组等限制。


5. 配置 pg_hba.conf

编辑:

vim /www/server/pgsql/data/pg_hba.conf

推荐只允许自己的公网 IP:

host    all    all    你的公网IP/32    scram-sha-256

例如:

host    all    all    39.157.76.0/32    scram-sha-256

临时测试可以:

host    all    all    0.0.0.0/0    scram-sha-256

但不建议生产环境长期允许:

0.0.0.0/0

因为代表允许任意 IPv4 地址尝试访问 PostgreSQL。


6. 重启宝塔 PostgreSQL

宝塔安装版本可使用:

/etc/init.d/pgsql restart

执行后:

waiting for server to shut down.... done
server stopped

7. 验证监听是否生效

重新执行:

ss -lntp | grep 5432

修改前:

127.0.0.1:5432
[::1]:5432

修改后:

0.0.0.0:5432
[::]:5432

最终结果:

LISTEN 0 200 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=...,fd=7))
LISTEN 0 200 [::]:5432 [::]:* users:(("postgres",pid=...,fd=8))

说明 PostgreSQL 已经成功监听外部网络。


8. 云服务器还需要放行 5432

PostgreSQL 自身配置完成后,还需要确认:

云服务器安全组
服务器防火墙
宝塔安全设置

是否允许 TCP:

5432

推荐安全组规则:

协议:TCP
端口:5432
来源:自己的公网 IP

不要优先使用:

0.0.0.0/0

9. DataGrip 配置

DataGrip 数据源配置:

Host: 服务器公网 IP
Port: 5432
User: PostgreSQL 用户名
Password: 用户密码
Database: 数据库名称

例如:

Host: 42.x.x.x
Port: 5432
Database: health_lvtong_t
User: health_lvtong_t

然后:

Test Connection

10. 整个远程连接链路

可以理解成 4 层:

DataGrip

云服务器安全组 / 防火墙

PostgreSQL listen_addresses

pg_hba.conf

PostgreSQL 用户名 / 密码 / Database

任何一层有问题,都可能导致连接失败。

这次的问题核心就是:

PostgreSQL listen_addresses = localhost

导致 PostgreSQL 只监听:

127.0.0.1:5432

修改成:

listen_addresses = '*'

并重启 PostgreSQL 后,变成:

0.0.0.0:5432

远程连接的网络监听问题就解决了。